DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: maxding
今日帖子: 36
在线用户: 13
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/6/8 7:00:52
标题:
delphi memo1显示列对齐问题 浏览:680
加入我的收藏
楼主: 看下图:有什么方法让memo1的列对齐:
此帖子包含附件:
PNG 图像
大小:12.8K
----------------------------------------------
永远是DELPHI初学者。
作者:
男 asen521 (Asen) ★☆☆☆☆ -
普通会员
2024/6/8 7:16:41
1楼: 要么用listview,非得用memo的话,自己写个算法格式化吧。
----------------------------------------------
-没有最好的工具,只有刻苦的程序员!
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/6/8 8:41:33
2楼: 主要是不能用listview。
----------------------------------------------
永远是DELPHI初学者。
作者:
男 dalas (dalas) ★☆☆☆☆ -
普通会员
2024/6/8 8:59:23
3楼: 最简单的方法,用等宽字体,每一列字符个数相同,以空格补足。
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/8 10:51:30
4楼: 800, 1000,2000, 这几个是对齐的。后面的 4800 又往前了。

那么,你的第一列和第二列,中间那些空白是什么?空格?有没有试过用制表符?
----------------------------------------------
-
作者:
男 dbyoung (dbyoung) ★☆☆☆☆ -
普通会员
2024/6/8 11:42:41
5楼: 我曾经遇到和楼主一样的问题。用的也是memo,不是listview。
譬如消息日志。我希望某些文字可以对齐在memo中。

最后我是用 Format 函数解决的。
Format 格式化字符串可以添加长度数字,以及 +、- 号。
例如:
   Format('%+10s', ['abc']);
   Format('%-10s', ['abc']);
   Format('%0.8d', [12345]);

字体用的宋体。


等宽字体也是可以解决的。麻烦的是须在用户电脑上安装那个等宽字体。
我的 IDE 用的就是 sourcepro 等宽字体。看的比较舒心。
----------------------------------------------
武汉天气不好
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/6/8 14:51:27
6楼: 我用下面我写的函数
function TmainForm.FillString2(const Str: string; num: Integer): string;
var
  temp, str1: string;
  w, len, n, nn, i, en, mm: real;
  idex: Integer;
begin
//     ComboBox1.Font.Size:=11;
  str1 := Trim(Str);
  n := Canvas.TextWidth(' ');
   //   memo2.Lines.Add('空格:'+inttostr(n));
  w := Canvas.TextWidth(str1);
  if n = 0 then
  begin
    mm := 0;
    nn := w;
  end
  else
  begin
    mm := (round(w)) div round(n);
    nn := (round(w)) mod round(n);
  end;
  if nn > 0 then
    mm := mm + 1;
//    if nn mod 2=0 then
//       mm:=mm-1;
//    mm:=mm+nn div 2;
  //    mm:=mm+1;
  len := mm;
  n := num - len;
 //   memo2.Lines.Add(inttostr(w)+'   '+inttostr(len)+'   '+inttostr(n));
 //   if n mod 2=1 then
//       n:=n+1;
  for idex := 0 to round(n) - 1 do
  begin
    temp := temp + ' ';
  end;
  str1 := str1 + temp;
  result := str1;
end;
效果如下:
20          2        40
30          17        510
50          44        2200
60          1        60
100          81        8100
200          6        1200
210          1        210
300          3        900
500          4        2000
600          1        600
800          1        800
1000          1        1000
2000          1        2000
4800          2        9600
----------------------------------------------
永远是DELPHI初学者。
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/6/8 14:53:55
7楼: 字数相同的就对齐了,字数多的就对不好。
用这个:Format是不行的。
----------------------------------------------
永远是DELPHI初学者。
作者:
男 zhoutler (苦行僧) ★☆☆☆☆ -
普通会员
2024/6/8 15:09:35
8楼: 实际打印中经常需要竖向对其。
obj:=TMemo.Create(nil);
obj.字体属性=目标字体属性;
a:=obj.canvas.测量字符宽度(正式文本)
b:=obj.canvas.测量字符宽度(单个空格)
需要插入的空格个数:a/b
插入空格。
差不多就这个步骤。Fmx,VCL,Qt都这么做的,实际效果勉强能用,还看得过去,看你得要求高不高。
----------------------------------------------
-
作者:
男 doersoft (hnysoft.com) ★☆☆☆☆ -
普通会员
2024/6/8 15:12:48
9楼: 这种,自己写个算法挺简单的吧,计算下中间的空格让字符对齐就行哈,或者等宽字体
----------------------------------------------
delphi|vue|golang hnysoft|hnyerp+mes+srm
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/6/8 18:33:20
10楼: @zhoutler,我上面写的函数就是这样做的。还是有一两个字符对不齐。
----------------------------------------------
永远是DELPHI初学者。
作者:
男 zhoutler (苦行僧) ★☆☆☆☆ -
普通会员
2024/6/9 8:27:33
11楼: 不是用textwidth函数取宽度,有个measure打头的测量函数,这样取宽度才准确。
我实际用,效果勉强能接受的。
----------------------------------------------
-
作者:
男 redboy136 (redboy136) ★☆☆☆☆ -
盒子活跃会员
2024/6/9 12:40:04
12楼: 还是对format用法不熟悉造成的,其实使用format格式非常简单,可以左对齐,也可以右对齐。
此帖子包含附件:
PNG 图像
大小:26.4K
----------------------------------------------
你梦我圆
作者:
男 redboy136 (redboy136) ★☆☆☆☆ -
盒子活跃会员
2024/6/9 12:44:15
13楼: 一定记得把memo2的字体设置成宋体或新宋体,否则因为空格是半角原因不能整齐。
----------------------------------------------
你梦我圆
作者:
男 redboy136 (redboy136) ★☆☆☆☆ -
盒子活跃会员
2024/6/9 12:54:12
14楼: procedure TForm1.Button1Click(Sender: TObject);
  function Getmyformat(aLine: String): String;
  var
    tms: String;
    str: String;
    aInd: Integer;
  begin
    tms := aLine;
    Result := '';
    while tms.Length > 1 do begin
      aInd := AnsiPos(' ', tms);
      str := Copy(tms, 1, aInd - 1).Trim;
      Result := Result + format('%-10s ', [str]);
      tms := Copy(tms, aInd + 1, tms.Length - aInd).Trim + ' ';
      if tms = '' then
        break;
    end;
  end;
begin
  memo2.Clear;
  for var I := 0 to memo1.Lines.Count - 1 do
    memo2.Lines.Add(Getmyformat(memo1.Lines[I]));
end;
----------------------------------------------
你梦我圆
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/6/9 19:23:29
15楼: 有汉字的还是不行:
苟六(献军)          30          
邓学章          30          
一组学建          30          
邓学福          30          
邓学松          30          
邓学期.          50          
邓学魁          50          
向玉旺          100          
刘金兴          100          
刘金明          100          
刘金富          60          
四组邓建龙          50          
邓学鲜          50          
黄凤聪          50          
吉善海(贱苗)          50
----------------------------------------------
永远是DELPHI初学者。
作者:
男 zhoutler (苦行僧) ★☆☆☆☆ -
普通会员
2024/6/10 9:25:29
16楼: to 楼上
不会吧,即使有汉字,错位也就视觉上差半个字位置。无论文本多长。
我建议的哪个方法和字体,和平台都没有关系的。
在linux,安卓,windows下都可以用,视觉上最多差半个字符位置,要求不高的话,基本能接受。
----------------------------------------------
-
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/6/10 16:01:37
17楼: @zhoutler 所以我也感觉很奇怪。
----------------------------------------------
永远是DELPHI初学者。
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/10 22:15:44
18楼: 非要用空格?不能用制表符?
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/10 22:49:45
19楼: 设计期,全部默认,字体也是默认的。拖一个 TMemo 过来摆 Form 上面,无需写任何代码,搞定:
此帖子包含附件:
JPEG 图像
大小:128.6K
----------------------------------------------
-
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/6/10 22:54:41
20楼: @pcplayer 不能动态?
----------------------------------------------
永远是DELPHI初学者。
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/10 22:56:48
21楼: 我设计期不用代码都能实现,你运行期搞不定?肯定也同样无需代码啊。
----------------------------------------------
-
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/6/11 7:48:47
22楼: @pcplayer  问题是我在运行时,编辑框内容随时改变,你的方法也行?
总不能内容变了,又来一个重新设计?
----------------------------------------------
永远是DELPHI初学者。
作者:
男 bighawk (Hawk) ★☆☆☆☆ -
盒子活跃会员
2024/6/11 9:32:11
23楼: 需要显示的东西多不多?不多就用多个 label 吧,放在一个scrollbox 里面,这个随便你咋对齐都不会有问题了。
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/11 15:26:24
24楼: 唉,设计期可以的东西,运行期一定是可以的嘛。设计期也是程序运行的结果。只不过这个程序是 TMemo 的设计期的 BPL 程序。这个和变不变有什么关系?

关键是对齐的方法。知道了方法,设计期和运行期用相同方法就好了。

至于方法,我在前面已经说过两次了,就没人去看。
----------------------------------------------
-
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2024/6/11 21:49:08
25楼: 如果是动态输出,一行一行的动态录入叠加,会比较啰嗦。但估计处理memo的键盘事件或wm_command消息可以做到,要求有特定的分隔符,如tab来分列——结合下面的办法:

如果是一次性输出,那就先得到每列的最大宽度,然后使用
format函数和string.padleft,padright函数补齐宽度应该就可以了。
----------------------------------------------
-
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/6/12 8:50:27
26楼: 有汉字,都是成问题:
此帖子包含附件:
PNG 图像
大小:167.4K
----------------------------------------------
永远是DELPHI初学者。
作者:
男 wk_knife (wk_knife) ★☆☆☆☆ -
盒子活跃会员
2024/6/12 8:52:51
27楼: 汉字本来就要占两个字符位
----------------------------------------------
-
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/6/12 9:39:24
27楼: 搞定了。
procedure TForm8.Button1Click(Sender: TObject);

  function GetWidthCharsLen(const S: string): Integer;
  var
    i: Integer;
    c: Char;
  begin
    result := 0;
    for i := 1 to Length(S) do
    begin
      c := S[i];
      if (ord(c) >= 0) and (ord(c) <= 255) then    //找出半角字符个数。
        result := result + 1;
    end;
  end;

  function FindAndPrintHalfWidthChars(const S: string;const vv:Integer=10): string;
  var
    ss, s1, s2: string;
    l1, l2, n, n1, j: integer;
  begin
    j := pos(' ', S);
    ss := trim(copy(S, 1, j - 1));
    s2 := trim(copy(S, j + 1, length(S)));

    s1 := ss.PadRight(vv, ' ');  //加全角空格
    n1 := GetWidthCharsLen(s1);   //计算长度
    if n1 mod 2>0 then          //如果有余数则加一
       n1:=n1+1;
    s1 := ss.PadRight(vv + (n1 div 2), ' '); //重新加全角空格
    result := s1 + s2;
  end;

var
  i: Integer;
begin
  memo2.Clear;
  for i := 0 to memo1.Lines.Count - 1 do
    memo2.Lines.Add(FindAndPrintHalfWidthChars(memo1.Lines[i]));
end;
此帖子包含附件:
PNG 图像
大小:48.6K
----------------------------------------------
永远是DELPHI初学者。
作者:
男 huangyalei (huangyalei) ★☆☆☆☆ -
盒子活跃会员
2024/6/12 10:57:15
28楼: 26楼:
用等宽字体是没有问题的,注意内码不同长度计算是不同的
此帖子包含附件:
JPEG 图像
大小:142.4K
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/12 11:33:17
29楼: 搞那么复杂。

用我的办法,一行代码都不用写。
----------------------------------------------
-
作者:
男 huangyalei (huangyalei) ★☆☆☆☆ -
盒子活跃会员
2024/6/12 12:04:22
30楼: 确实,29楼的办法更简单,还可以用不等宽字体
此帖子包含附件:
JPEG 图像
大小:126.1K
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/12 13:06:34
31楼: 楼上,你底下3行,如果想和上面3行对齐,加多1个或者2个 TAB

也就是说,你要计算一下第一列的字符串最大长度的那个有多长。那个可能加一个 TAB,那些短的,就需要加2个或者3个。
----------------------------------------------
-
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/6/13 7:35:07
32楼: UTF8ToCP936,CP936ToUTF8 无定义符号?在那个单元?
----------------------------------------------
永远是DELPHI初学者。
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/6/13 9:33:54
33楼: 经测试,用#9还不错。但是,在android下,#9只算一个字符,和WINDOWS不一样。
----------------------------------------------
永远是DELPHI初学者。
作者:
男 jingzu (123456) ★☆☆☆☆ -
盒子活跃会员
2024/6/13 11:16:27
34楼: 制表符#9在android下没有用。和WIDNOWS下不一样。
----------------------------------------------
永远是DELPHI初学者。
作者:
男 huangyalei (huangyalei) ★☆☆☆☆ -
盒子活跃会员
2024/6/13 11:45:54
35楼: to 楼上:
UTF8ToCP936、CP936ToUTF8是Lazarus里的函数,用Delphi的话,你要找找有没有对应的函数,如果没有通过WinAPI也可以实现。其实我做转换只是为了按字符计算字符串长度,刚好有这个函数就顺手用了,你有其他计算方法也不一定要转换
在android下制表符不是Tab而是“\t”,我没开发过安卓,你自己试试这个行不行
按31楼的建议改了一下,上下都对齐
此帖子包含附件:
JPEG 图像
大小:23.0K
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/6/13 12:59:49
36楼: 33 楼,你一开始的问题,并没有说是安卓。我是用 VCL 做的测试。

描述问题,尽量详细,别人才好帮你。

比如,你光说安卓不行,如何不行法?代码是怎么写的,问题的现象是什么?等等。
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行121.0938毫秒 RSS