例如有三个字符
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);
在填充字符时,已经将长度全部填充到了二十,那么 '结束' 应该显示在同一列上才对啊,怎么排列都不整齐,应该怎么改才能使 '结束'这个字符都排在同一列上啊?
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);
在填充字符时,已经将长度全部填充到了二十,那么 '结束' 应该显示在同一列上才对啊,怎么排列都不整齐,应该怎么改才能使 '结束'这个字符都排在同一列上啊?
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 字符宽度 、计算,然后找个平均值的字符填充,仔细想想,我吃饭去了先。
引用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))+'结束');
汉字和字母同时出现在一个字符串里很正常啊.难道这都不行啊?
用WideString也一样, AnsiString,UnicodeString等不同类型的字符串全试过,一样填充指定长度后,看起来仍然是不齐的
你的思路是很好的,具体怎么实现啊.能详细点吗?
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;
如长度是16 那么倍数 16 , 加空格 1 再加 #9 // #9的个数,按最长的来设 即最长的算出长度达到8的倍数, 如21, 即为3倍,再加1个#9 则总长为 32
// 那么'测试测试ABC' 就是7, 就是 要加 2 个空格, 只有一个 8, 就是要加 3 个 #9 , 即 '测试测试ABC'+' '+ #9#9#9
能再说下#9个数的计算方法吗? 上面的我看的不是很懂. 只看明白了加空格的方法,#9的方法没看懂.
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;
你看我的问题了没有啊?答非所问To:dinoalex
你的方法是可以的但是#9在某些控件里不能表现出显示效果来. 还有其它的什么方法没有?
s:string;
begin
setlength(s,20);
fillchar(s[1],20,' ');
move('abc',s[1],3);
showmessage(s);
//这样得出的字符串都是一样长度,只要赋值时比设定的长度小就可以