创建动态控件数组,关闭窗体时出错误

jwt1982 2007-01-09 01:43:02
创建动态控件数组,关闭窗体时出错误

mylabel:array of TLabel;
begin
setlength(mylabel,adoq.RecordCount-1);

mylabel[i] := TLabel.Create(frmBack);
mylabel[i].Name := 'mylabel'+inttostr(i);
mylabel[i].Parent := frmBack;
mylabel[i].Left := 206;
mylabel[i].Top := 56 + I*20;
mylabel[i].Caption :=inttostr(i+1)+'、'+FieldByName('Title').AsString;
mylabel[i].Transparent:=true;
mylabel[i].Font.Style:=[fsBold];
mylabel[i].Cursor:= crHandPoint;
mylabel[i].OnClick:=LabelClick;

mylabel[i].Font.Charset:=GB2312_CHARSET;
mylabel[i].Font.Name:='宋体';
mylabel[i].Font.Size:=9;
mylabel[i].Repaint;

============================================================

这样代码执行没有问题,但是在关闭窗体时出现错误
是否是释放的问题?调试了几天依然没有成功


...全文
197 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dreamer001 2007-03-30
  • 打赏
  • 举报
回复
madyak(无天) ( ) 信誉:120 Blog 2007-1-9 14:33:17 得分: 0



setlength(mylabel,adoq.RecordCount);//
这里面的长度参数与上下标无关,它只分配数组的长度。

一般情况下mylabel下标是以0开始。下标以adoq.RecordCount-1终止。

其实从0到adoq.RecordCount-1长度正好是adoq.RecordCount
为了测试下标的范围可以用low(mylabel)和high(mylabel)


madyak(无天) ( ) 信誉:120 Blog 2007-1-9 14:35:24 得分: 20



如果用setlength(mylabel,adoq.RecordCount-1)分配,那么数组的最大下标应该是mylabel[adoq.RecordCount-2]了

------------------------------------------------------------------------------
madyak(无天),我真是爱死你了.和楼主一样,我犯了同样的错误,害我消耗今天整整一个白天的时间.直到看到你的解答,该死的av错误总于没影了.想着就开心,今晚可以安稳睡觉了.哈哈,谢谢 madyak(无天),谢谢楼主.







jwt1982 2007-01-09
  • 打赏
  • 举报
回复
也就是说应该经常使用
low 和high函数来处理,否则容易出错

呵呵
madyak 2007-01-09
  • 打赏
  • 举报
回复
如果用setlength(mylabel,adoq.RecordCount-1)分配,那么数组的最大下标应该是mylabel[adoq.RecordCount-2]了
madyak 2007-01-09
  • 打赏
  • 举报
回复
setlength(mylabel,adoq.RecordCount);//
这里面的长度参数与上下标无关,它只分配数组的长度。

一般情况下mylabel下标是以0开始。下标以adoq.RecordCount-1终止。

其实从0到adoq.RecordCount-1长度正好是adoq.RecordCount
为了测试下标的范围可以用low(mylabel)和high(mylabel)
jwt1982 2007-01-09
  • 打赏
  • 举报
回复
to:madyak(无天)

为什么呢?
madyak 2007-01-09
  • 打赏
  • 举报
回复
高人,恭喜
jwt1982 2007-01-09
  • 打赏
  • 举报
回复
正常觉得下标从0开始,count-1应该是正好的长度,但是为什么需要长度加1就不明白了

希望高手解答一下
jwt1982 2007-01-09
  • 打赏
  • 举报
回复
呵呵自己找到错误了

setlength(mylabel,adoq.RecordCount-1);//这里,应该建立比正好长度+1才对

setlength(mylabel,adoq.RecordCount);这样就好了
jwt1982 2007-01-09
  • 打赏
  • 举报
回复
我在close里free+nil了,还是出现错误
jianke5555 2007-01-09
  • 打赏
  • 举报
回复
要把創建的FREE掉吧.虽然理论上DELPHI会把自己创建的对象释放,但是关闭是会有问题的,手动释放吧!
jwt1982 2007-01-09
  • 打赏
  • 举报
回复
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
adoq: TADOQuery;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
astrNoteID:array of string;
mylabel:array of TLabel;
procedure LabelClick(Sender: TObject);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.LabelClick(Sender: TObject);
var
strNoteID:string;
begin

if Sender is TLabel then
begin
strNoteID:=astrNoteID[strtoint(copy((Sender as TLabel).Caption,0,pos('、',(Sender as TLabel).Caption)-1))-1];
ShowMessage(strNoteID);
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
var
I:integer;
begin
//DoubleBuffered := True;
I:=0;
with adoq do
begin
close;
sql.Clear;
sql.Add('exec getnote ''9999''');
open;
first;

setlength(mylabel,adoq.RecordCount-1);
setlength(astrNoteID,adoq.RecordCount-1);

while not eof do
begin

mylabel[i] := TLabel.Create(self);
mylabel[i].Name := 'mylabel'+inttostr(i);
mylabel[i].Parent := self;
mylabel[i].Left := 206;
mylabel[i].Top := 56 + I*20;
mylabel[i].Caption :=inttostr(i+1)+'、'+FieldByName('Title').AsString;
mylabel[i].Transparent:=true;
mylabel[i].Font.Style:=[fsBold];
mylabel[i].Cursor:= crHandPoint;
mylabel[i].OnClick:=LabelClick;

mylabel[i].Font.Charset:=GB2312_CHARSET;
mylabel[i].Font.Name:='宋体';
mylabel[i].Font.Size:=9;

if FieldByName('Import').AsBoolean then mylabel[i].Font.Color := clRed;
astrNoteID[i]:=FieldByName('nbid').AsString;
//mylabel[i].Repaint;

i:=i+1;
next;
end;
close;
//Image3.Top:=56 + I*20;
end;
end;
===================================

把相关代码整个挪到一个新工程中,就是上边这个,还是关闭窗体过程出错
madyak 2007-01-09
  • 打赏
  • 举报
回复
frmBack关闭时不要释放它。看看是不是还有错,关键是要找到出错的原因,也许是其它的地方出错了。
jwt1982 2007-01-09
  • 打赏
  • 举报
回复
现在是这样,关闭frmback的时候,会出一个内存错误
madyak 2007-01-09
  • 打赏
  • 举报
回复
不要手动释放mylabel[i],frmBack释放时,会自动完成释放。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧