要在窗体界面上显示比分(我用的 TLabel),如下面四种,每个比分用“:” 分割:8:11
123:23
22:2
8:222
问题是每个比分需要按照“:”对其,即要求如下显示:  8:11
123:23
 22:2
  8:222每个比分长度不固定,这个算法该怎么写好呢?

解决方案 »

  1.   

    放三个 TLabel显示一行设置他们的Alignment属性分别为taRightJustify, taCenter,taLeftJustify
      

  2.   

    啊哈把  ':'单独做一个label要用的时候创建在一条垂直的线上就OK啦
      

  3.   

    首先找出左边最大的数,也就是最长的数,这个应该不难。因为其宽度与字体字号相关,我们放一个临时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才变。没有上机试过,你试试看行不。
      

  4.   

    或者用Canvas.TextWidth也可以得到字符的宽度
      

  5.   

    下班前作了个例子:
    新建一个工程,窗体的下半部分放1个Memo,2个Button和1个FontDialog,Memo的Lines里面复制你的例子,然后单元文件里粘贴以下代码:
    unit Unit1;interfaceuses
      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可以更换字体
      

  6.   

    问题是楼主已经把1楼的答案给否了...所以我想楼主的初衷可能是想动态显示。我的做法虽然复杂,但更灵活,不管你有多少组,也不管分数有多大,而且只要所有标签的字体一样,但无论什么字体都能达到':'号在中间的结果。顺便提一下,我的代码中:Width := 200;最好改为:AutoSize := True;效果更好好了,下班...