为 STRING GRID 第一行命名标题(替我改一下,赶时间,谢谢,三小时内)(100分)

  • 主题发起人 主题发起人 chen11
  • 开始时间 开始时间
C

chen11

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure title_sg_wy(sg: tstringgrid; title: string); //此函数仅用于为 STRING GRID 第一行命名标题
var
i, len, posi, s_len, j, k: integer;
til: string;
begin
i := 0;
len := length(title);
with sg do
begin
colcount := 100;
rowcount := 2;
Fixedrows := 1;
while (len > 0) do
begin
posi := pos('*', title);
til := copy(title, 1, posi - 1);
len := len - posi;
title := copy(title, posi + 1, len);
posi := pos('*', title);
if title[posi-1]='' then exit else
s_len := strtoint(copy(title, 1, posi - 1));
ColWidths := floor(s_len * 6.5);
len := len - posi;
title := copy(title, posi + 1, len);
j := (s_len - length(til)) div 2;
for k := 1 to j do
til := ' ' + til;
cells[i, 0] := til;
inc(i);
end;
ColCount := i;
for i := 0 to colcount + 2 do
cells[i, 1] := '';
end;
end;
 
没头没脑的一段代码,谁知道什么意思,而且你的Code还没有一点语法错误!!...
1.你想要StringGrid达到什么效果?
2.Code中对Title进行了分析,其格式是什么,解析规则是什么?
3.运行后后什么错误,与你的预期结果有什么差异?
你至少要告诉这三点别人才能有针对性的看你的Code
 
haha! I got it! ^_^
你是不是想指定每一列的标题及其宽度,并且让标题居中?
例如: title_sg_wy(StringGrid1,'Hello*10*di*4*Why*6');

你的程序的算法本身没有问题,有问题的是:
ColWidths:=floor(s_len * 6.5); 和 j:=(s_len-length(til)) div 2;
你试图在标题之前加上一定数量的空格来达到居中的目的。但是,你忽略了一点:有的字体中
不同的字符占用的宽度不一样,因此,建议将StringGrid的字体设置为诸如宋体之类的等宽字体。
我用的是宋体10号,ColWidths:=s_len*7; 效果就比较好了。
 
上面的分析还有一点问题,现在贴出完全解决方案:
var
i,len,posi,s_len,j,k:integer;
til: string;
SpaceSize,TitleSize:Integer;
begin
SpaceSize:=sg.Canvas.TextWidth(' '); //StringGrid字体相应的空格的宽度
i:=0;
len:=length(title);
with sg do
begin
colcount:=50;
rowcount:=2;
Fixedrows:=1;
while (len>0) do
begin
posi:=pos('*',title);
til:=copy(title,1,posi-1);
len:=len-posi;
title:=copy(title,posi+1,len);
posi:=pos('*',title);
if posi=0 then
posi:=len+1; //不要exit
s_len:=strtoint(copy(title,1,posi-1));
ColWidths:=s_len*SpaceSize; //认为指定的宽度是以空格为基准的
if posi<=len then
begin
len:=len-posi;
title:=copy(title,posi+1,len);
end
else
len:=0;
TitleSize:=Canvas.TextWidth(til); //标题的实际宽度
j:=(ColWidths-TitleSize) div (SpaceSize*2);
for k:=1 to j do
til:=' '+til;
cells[i,0]:=til;
inc(i);
end;
ColCount:=i;
for i:=0 to ColCount-1 do
cells[i,1]:='';
end;
end;

现在字体中各个字符必须等长的限制也没有了,不过标题的宽度数值是以空格的宽度为单位的,
设置的时候要注意。
 
To: creation-zy 你猜对了,但问题不是在那,而是循环有问题,你可以试试
 
>循环有问题
请仔细看一看我贴出来的代码,我已经对循环进行了处理,只要输入的数据没有错误,就完全没有问题。
你可以试一试:
title_sg_wy(StringGrid1,'Hello*20*di*8*Why*12*资金*24*综合指标*36');
StringGrid1的字体为 MS Serif,Size=10
 
To:creation-zy
你有没有试过?
这可是100分
 
请看:
posi:=pos('*',title);
if posi=0 then //我已经对循环进行了处理!
posi:=len+1;
......
if posi<=len then
begin
len:=len-posi;
title:=copy(title,posi+1,len);
end
else
len:=0;
......
ColCount:=i;
......

用我的代码将你原来的程序整个替换掉 —— 一切 OK!

我当然试验过——Win2K Advanced Server Delphi5 SP1
 
虽然问题我在12点已解决,但我还是不得不送出这100分,可惜啊
 
什么问题,你说出来嘛。
我的代码还有什么没有达到你的要求的地方?
请恕我眼拙,没有发现错误所在。

如果您认为没有必要给分的话,可以要求斑竹将分数加给你自己。
 
以后请按要求做,本想偷个懒,最后还得自己作,还得付银子
 

Similar threads

后退
顶部