例如有三个字符
  a:='测试ABC';
  b:='测试测试F';
  c:='测试测试测试C';  a:=a+StringOfChar('1',20-Length(a));   //长度不够二十则填充到二十
  b:=b+StringOfChar('1',20-Length(b));
  c:=c+StringOfChar('1',20-Length(c));  a:=a+'结束';
  b:=b+'结束';
  c:=c+'结束';  Memo1.Lines.Add(a);
  Memo1.Lines.Add(b);
  Memo1.Lines.Add(c);
在填充字符时,已经将长度全部填充到了二十,那么 '结束' 应该显示在同一列上才对啊,怎么排列都不整齐,应该怎么改才能使 '结束'这个字符都排在同一列上啊?

解决方案 »

  1.   


    procedure TForm1.Button2Click(Sender: TObject);
    begin
    var
      arr: array[0..25] of Integer;
      i: Integer;
    begin
      GetCharWidth(Canvas.Handle, Ord('A'), Ord('Z'), arr);
      Memo1.Clear;
      for i := 0 to 25 do
      begin
        Memo1.Lines.Add(Char(Ord('A')+i) + #9 + IntToStr(arr[i]));
      end;
    end;
    用以上代码,得到各个字符的宽度,因为不同,所以接下来要判断a\b\c 字符宽度 、计算,然后找个平均值的字符填充,仔细想想,我吃饭去了先。
      

  2.   

    你可以自己写个简单的函数来实现所需,并不一定要用StringOfChar函数。
      

  3.   

    匆忙之中,4楼所贴代码有误,多了个begin
      

  4.   


    引用4楼的
    const
      p =  #9#9#9#9#9;
    var
      s1,s2,s3 : string;
    begin
      s1:= '测试ABCD';
      s2:= '测试测试ABCD';
      s3:= '测试测试测试ABCD';
      memo1.Lines.Append(s1 + copy(p,1,20-length(s1))+'结束');
      memo1.Lines.Append(s2 + copy(p,1,20-length(s2))+'结束');
      memo1.Lines.Append(s3 + copy(p,1,20-length(s3))+'结束');
      

  5.   

    TO:dinoalex 你的代码不行,显示的长度看起来根本不一样
      

  6.   

    To:Seamour 
      汉字和字母同时出现在一个字符串里很正常啊.难道这都不行啊?
      

  7.   

    To:zhaozhen2004 
      用WideString也一样, AnsiString,UnicodeString等不同类型的字符串全试过,一样填充指定长度后,看起来仍然是不齐的
      

  8.   

    To:kampan 
      你的思路是很好的,具体怎么实现啊.能详细点吗?
      

  9.   

    参照此函数实现:
    function MinimizeName(const Filename: TFileName; Canvas: TCanvas;
      MaxLen: Integer): TFileName;
    var
      Drive: TFileName;
      Dir: TFileName;
      Name: TFileName;
    begin
      Result := FileName;
      Dir := ExtractFilePath(Result);
      Name := ExtractFileName(Result);  if (Length(Dir) >= 2) and (Dir[2] = ':') then
      begin
        Drive := Copy(Dir, 1, 2);
        Delete(Dir, 1, 2);
      end
      else
        Drive := '';
      while ((Dir <> '') or (Drive <> '')) and (Canvas.TextWidth(Result) > MaxLen) do
      begin
        if Dir = '\...\' then
        begin
          Drive := '';
          Dir := '...\';
        end
        else if Dir = '' then
          Drive := ''
        else
          CutFirstDirectory(Dir);
        Result := Drive + Dir + Name;
      end;
    end;
      

  10.   

    #9 的长度为 8对些,length到的长度,变成8的倍数如长度是19 那么倍数 24 , 加空格 6 再加 #9 
    如长度是16 那么倍数 16 , 加空格 1 再加 #9  // #9的个数,按最长的来设 即最长的算出长度达到8的倍数, 如21, 即为3倍,再加1个#9 则总长为 32
    // 那么'测试测试ABC' 就是7, 就是 要加 2 个空格, 只有一个 8, 就是要加 3 个 #9 , 即 '测试测试ABC'+'  '+ #9#9#9
      

  11.   

    To:dinoalex 
      能再说下#9个数的计算方法吗? 上面的我看的不是很懂. 只看明白了加空格的方法,#9的方法没看懂.
      

  12.   

    移动指针来做吧
    procedure TForm1.Button1Click(Sender: TObject);
    var tempstr,tmpstr2:string;
        buffer:pchar;
    begin  tempstr:='0000000000';
      tmpstr2:='asd';
      GetMem(buffer,length(tempstr));
      move(tempstr[1],buffer[0],length(tempstr));
      move(tmpstr2[1],buffer[length(tempstr)-length(tmpstr2)],length(tmpstr2));
      tempstr:=copy(buffer,0,length(tempstr));
      showmessage(tempstr);
      freemem(buffer);
    end;
      

  13.   

    To:yuyuhaso
      你看我的问题了没有啊?答非所问To:dinoalex 
      你的方法是可以的但是#9在某些控件里不能表现出显示效果来. 还有其它的什么方法没有?
      

  14.   

    TMemo组件->属性Font->字体改为等宽的,如“宋体”,字体大小调整为适当的。
      

  15.   

    var
    s:string;
    begin
    setlength(s,20);
    fillchar(s[1],20,' ');
    move('abc',s[1],3);
    showmessage(s);
    //这样得出的字符串都是一样长度,只要赋值时比设定的长度小就可以
      

  16.   

    这其实利用canvas可以处理,代码没空写