动态生成的控见,为啥总是第一个在窗体的左上角出现,其它的能够按预先设计的排放(17分)

  • 主题发起人 主题发起人 陈君凯
  • 开始时间 开始时间
你没指定他的Left,top值.
 
要手工给他的Left Top设定值才可以
Example
var
A : Tbutton;
begin
A := Tbutton.Create(nil);
A.Left := 100;{你预先设定的左上角值X坐标}
A.Top := 200;{你预先设定的左上角值Y坐标}
A.Parent := Form1;{设定父}
end;
 
还是不行,我把代码贴出来,你给指点一下好吗
var
shaped:array of TShape;
i:integer;
begin
SetLength(shaped, n+1);
for i:=1 to n do
begin
shaped:=TShape.Create(self);
shaped.Parent:=self;
shaped.Height:=30;
shaped.Width:=30;
shaped.Top:=adj.zby;
shaped.Left:=adj.zbx;
shaped.Brush.Color:=clGreen;
shaped.Pen.Color:=clNavy;
shaped.Pen.Mode:=pmCopy;
shaped.Pen.Style:=psSolid;
shaped.Pen.Width:=1;
shaped.Shape:=stCircle;
end;
 

肯定是你的adj函数计算错误

把上面的 Top 和 Left 改成如下两句就没有问题。

Shaped.Top := 50 + i*40;
Shaped.Left := 50 + i*40;

 
检索一下“控件数组”,这么用是不行的
 
呵呵,看来康夫比我快呀,我试过了

问题就是在你的Top 和 Left里面那个东东上

Adj应该是一个类或者纪录型的数组,估计是你那个数组里面的数值有问题
检查一下你的Adj,也许错误不在你的这一段程序里面:)
 
adj是一个记录型的数组:结构如下:
nodeptr=^node;
node=RECORD
name:string;
num:integer;
time1:integer;
link:nodeptr
end;
node1=record
num:integer;
count:integer;
zbx:integer;
zby:integer;
link:nodeptr
end;
它是不会出错的。只有第一个动态生成的控件不按预定坐标生成,其它的正确,
不知为何
 
你写一段代码测试一下输出的数据是否正确
这样调试方便一点:)
如够正确,也许是你的程序循环里有一些数据不对应的问题
在正确的前提下还有个笨方法就是在循环结束后再给第一个控件赋一次值
这样一般没有问题

还有可以测试一下,如果把循环反过来写会不会有问题,如果没有就反过来写
这样也可以知道是不是你数据源的问题
for i:=n downto 1 do
begin
end;
 
多人接受答案了。
 
后退
顶部