!!! 难题一个

bigsail 2007-08-31 02:50:50
要在窗体界面上显示比分(我用的 TLabel),如下面四种,每个比分用“:” 分割:

8:11
123:23
22:2
8:222


问题是每个比分需要按照“:”对其,即要求如下显示:

8:11
123:23
22:2
8:222

每个比分长度不固定,这个算法该怎么写好呢?
...全文
77 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigsail 2007-08-31
  • 打赏
  • 举报
回复
1楼的自己没说清楚。

9楼的说清楚了
chenyayu 2007-08-31
  • 打赏
  • 举报
回复
问题是楼主已经把1楼的答案给否了...

所以我想楼主的初衷可能是想动态显示。

我的做法虽然复杂,但更灵活,不管你有多少组,也不管分数有多大,而且只要所有标签的字体一样,但无论什么字体都能达到':'号在中间的结果。

顺便提一下,我的代码中:Width := 200;最好改为:AutoSize := True;效果更好

好了,下班...
天行归来 2007-08-31
  • 打赏
  • 举报
回复
简单问题复杂化,1楼 失踪的月亮 的方法已经可以解决这个问题,一行三个标签,四行12个标签就解决问题。其中,每行的中间那个标签是显示 “:”。
如:8:11
显示8的标签对其方式采用右对齐;
显示“:”对齐方式无所谓;
显示11的对齐方式采用左对齐
chenyayu 2007-08-31
  • 打赏
  • 举报
回复
下班前作了个例子:
新建一个工程,窗体的下半部分放1个Memo,2个Button和1个FontDialog,Memo的Lines里面复制你的例子,然后单元文件里粘贴以下代码:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Contnrs;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
FontDialog1: TFontDialog;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FLabelList: TObjectList;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
function GetMax(Lines: TStrings):Integer;
var
i,j: integer;
s: string;
begin
Result := 0;
for i := 0 to Lines.Count - 1 do
begin
s := Copy(Lines.Strings[i],0,Pos(':',Lines.Strings[i]) - 1);
j := StrToInt(s);
if j > Result then
Result := j;
end;
end;

var
i, j, k, iMax: Integer;
Img: TImage;
s: string;
Lb: TLabel;
begin
FLabelList.Clear;
iMax := GetMax(Memo1.Lines);
Img := TImage.Create(Self);
with Img.Canvas do
begin
try
Img.Visible := False;
Font.Assign(Memo1.Font);
iMax := TextWidth(IntToStr(iMax));
for i := 0 to Memo1.Lines.Count - 1 do
begin
s := Copy(Memo1.Lines.Strings[i],0,Pos(':',Memo1.Lines.Strings[i]) - 1);
j := TextWidth(s);
k := Memo1.Left;
lb := TLabel.Create(Self);
with lb do
begin
Font := Memo1.Font;
Width := 200;
Visible := True;
Name := 'Label' + IntToStr(i);
Caption := Memo1.Lines.Strings[i];
Left := k + iMax - j;
Top := i * (Height + 2) + 30;
Parent := Self;
FLabelList.Add(lb);
end;
end;
finally
Img.Free;
end;
end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if FontDialog1.Execute then
begin
Memo1.Font.Assign(FontDialog1.Font);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FLabelList := TObjectList.Create(True);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FLabelList.Free;
end;

end.


Button1可以看效果,Button2可以更换字体
chenyayu 2007-08-31
  • 打赏
  • 举报
回复
个人认为用Canvas更好
chenyayu 2007-08-31
  • 打赏
  • 举报
回复
或者用Canvas.TextWidth也可以得到字符的宽度
chenyayu 2007-08-31
  • 打赏
  • 举报
回复
首先找出左边最大的数,也就是最长的数,这个应该不难。

因为其宽度与字体字号相关,我们放一个临时Label在窗体上,设置Visable := False;字体字号和要显示的Label一样,然后设置:AutoSize := True;并假设Name := 'lbTemp';

让其Caption := 最大的分数,例子里面是123则:lbTemp.Caption := '123';
记下 lbTemp.Width 备用(假设存于变量W0中);这个宽度是所有“:”号左边最长的宽度。即:W0 := lbTemp.Width;

然后遍历所有左边的分数,并分别套入lbTemp而得到W1..Wn,也就是各左边分数的宽度,那么各个要显示的Label的Left就等于X+(W0-Wn);X是界面左边应该留出的边界,n是比分的组号。即:Labeln.Left := n + (W0-Wn);

或许为lbTemp.Caption赋值后要刷新一次Width才变。

没有上机试过,你试试看行不。



bigsail 2007-08-31
  • 打赏
  • 举报
回复
你们都没仔细动脑筋思考。
brightyang 2007-08-31
  • 打赏
  • 举报
回复
啊哈。。。

把 ':'单独做一个label

要用的时候创建在一条垂直的线上就OK啦。。。

mdejtod 2007-08-31
  • 打赏
  • 举报
回复
:号前后的数字给一个固定的格式应该可以实现的
hongqi162 2007-08-31
  • 打赏
  • 举报
回复
放三个 TLabel显示一行设置他们的Alignment属性分别为taRightJustify, taCenter,taLeftJustify

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧