创建动态控件数组,关闭窗体时出错误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;============================================================这样代码执行没有问题,但是在关闭窗体时出现错误
是否是释放的问题?调试了几天依然没有成功
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;============================================================这样代码执行没有问题,但是在关闭窗体时出现错误
是否是释放的问题?调试了几天依然没有成功
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;
===================================把相关代码整个挪到一个新工程中,就是上边这个,还是关闭窗体过程出错
这里面的长度参数与上下标无关,它只分配数组的长度。一般情况下mylabel下标是以0开始。下标以adoq.RecordCount-1终止。其实从0到adoq.RecordCount-1长度正好是adoq.RecordCount
为了测试下标的范围可以用low(mylabel)和high(mylabel)
low 和high函数来处理,否则容易出错呵呵
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(无天),谢谢楼主.