读书人

怎样在Memo或RichEdit中对齐不等长字符

发布时间: 2012-02-08 19:52:21 作者: rapoo

怎样在Memo或RichEdit中对齐不等长字符窜?
用Memo-> Lines-> add(str)添加不等长字符串,怎样可以做到如下效果,每行对应的列都左对齐或右对齐。
Proto Local Address Foreign Address State
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING TCP 0.0.0.0:445 0.0.0.0:0 LISTENING TCP 0.0.0.0:6059 0.0.0.0:0 LISTENING TCP 192.168.1.22:139 0.0.0.0:0 LISTENING TCP 192.168.1.22:1056 211.100.21.179:80 ESTABLISHED TCP 192.168.1.22:1086 211.100.23.248:80 CLOSE_WAIT

[解决办法]
用AnsiString::sprintf格式化,比如:

String b;
b.sprintf( "%10s ", "Proto ");
[解决办法]
char str[] = "%-8s%-22s%-22s%-12s ";

Memo1-> Lines-> Add(String().sprintf(str,
"Proto ", "Local Address ", "Foreign Address ", "State "));
Memo1-> Lines-> Add(String().sprintf(str,
"TCP ", "0.0.0.0:135 ", "0.0.0.0:0 ", "LISTENING "));
Memo1-> Lines-> Add(String().sprintf(str,
"TCP ", "0.0.0.0:445 ", "0.0.0.0:0 ", "ESTABLISHED "));
Memo1-> Lines-> Add(String().sprintf(str,
"TCP ", "0.0.0.0:6059 ", "0.0.0.0:0 ", "CLOSE_WAIT "));

[解决办法]
AnsiString::sprintf 是个很巧的方法.
[解决办法]
TStringList *strlstDbg=new TStringList();
AnsiString asTemp= " ";
for(i = 0;i < 256;i++)
{
AnsiString str;
asTemp+=str.sprintf( "%5d ",f_GwRecvData.ENDATA[i]) ;
//asTemp+= " ";
if((i+1)%8==0 && i )
{
strlstDbg-> Add(asTemp);
asTemp= " ";
}
}
strlstDbg-> Free();

//Memo 的字体最好调整一下,用FIXEDSYS,COURIED.
[解决办法]
直接偷了上面答案来改改^_^
用AnsiString::sprintf格式化:


AnsiString str;
str.sprintf( "%-m.ns ", "Proto ");
其中-表示左对齐,不加-则表示右对齐
m表示域宽,就是Proto这个字符串总共占多大宽度,如果实际宽度> m则按实际宽度,如果 <m则按指定宽度
.分隔域宽和精度,小数点前可以没有域宽说明
n表示数据精度,对于e,E,f格式为小数部分位数,对于g格式为有效数字位数,对于d格式为至少要输出的数字个数(添加前导0满足需要),对于例子中s格式无效

将一行字符串按照指定格式sprintf到AnsiString str中,再用memo-> line-> add(str);就可以了

读书人网 >C++ Builder

热点推荐