创建动态控件数组,关闭窗体时出错误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;============================================================这样代码执行没有问题,但是在关闭窗体时出现错误
是否是释放的问题?调试了几天依然没有成功

解决方案 »

  1.   

    不要手动释放mylabel[i],frmBack释放时,会自动完成释放。
      

  2.   

    现在是这样,关闭frmback的时候,会出一个内存错误
      

  3.   

    frmBack关闭时不要释放它。看看是不是还有错,关键是要找到出错的原因,也许是其它的地方出错了。
      

  4.   

    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;
    ===================================把相关代码整个挪到一个新工程中,就是上边这个,还是关闭窗体过程出错
      

  5.   

    要把創建的FREE掉吧.虽然理论上DELPHI会把自己创建的对象释放,但是关闭是会有问题的,手动释放吧!
      

  6.   

    我在close里free+nil了,还是出现错误
      

  7.   

    呵呵自己找到错误了setlength(mylabel,adoq.RecordCount-1);//这里,应该建立比正好长度+1才对setlength(mylabel,adoq.RecordCount);这样就好了
      

  8.   

    正常觉得下标从0开始,count-1应该是正好的长度,但是为什么需要长度加1就不明白了希望高手解答一下
      

  9.   

    to:madyak(无天) 为什么呢?
      

  10.   

    setlength(mylabel,adoq.RecordCount);//
    这里面的长度参数与上下标无关,它只分配数组的长度。一般情况下mylabel下标是以0开始。下标以adoq.RecordCount-1终止。其实从0到adoq.RecordCount-1长度正好是adoq.RecordCount
    为了测试下标的范围可以用low(mylabel)和high(mylabel)
      

  11.   

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

  12.   

    也就是说应该经常使用
    low 和high函数来处理,否则容易出错呵呵
      

  13.   

    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(无天),谢谢楼主.