自定义组件释放时出错。
刚开始学写组件。
下面的代码,写好安装后。放进一个窗口中。先执行几次add函数。然后执行delete(一次或多次),然后关闭窗口。
这时报错。好像是释放问题。该怎么解决呀.
- Delphi(Pascal) code
unit PageCtrolEx;interfaceuses SysUtils,Classes,Controls,ExtCtrls,Graphics,GraphUtil ,windows;type TPageCtrolEx=class; TTabSheetEX= class(TCustomControl) private FGradientStart,FGradientEnd:TColor; FDirection:TGradientDirection; FpageCtrl:TPageCtrolEx; protected procedure SetParent(AParent: TWinControl); override; public constructor create(Aowner:TComponent);override; destructor Destroy;override; published property Caption;// property align; end; TPageCtrolEx = class(TCustomControl) private FPageList:TList; function GetPageCount:Integer; function GetPages(Index: Integer): TTabSheetEX; procedure Resize; override; { Private declarations } protected procedure Paint;override; { Protected declarations } public constructor create(Aowner:TComponent);override; destructor Destroy;override; function Add:TTabSheetEX; procedure Delete(AIndex:integer); property PageCount:Integer read GetPageCount; property Pages[Index: Integer]: TTabSheetEX read GetPages; { Public declarations } published property color; { Published declarations } end;Procedure Register;implementationProcedure Register;Begin RegisterComponents( 'test', [ TPageCtrolEx ] );End;{ TPageCtrolEx }function TPageCtrolEx.Add: TTabSheetEX;begin Result:=TTabSheetEX.Create(Self); OutputDebugString(PChar(IntToStr(FPageList.Count)));end;constructor TPageCtrolEx.create(Aowner: TComponent);begin inherited Create(Aowner); FPageList:=TList.Create;end;procedure TPageCtrolEx.Delete(AIndex: integer);var I: Integer;begin if AIndex<FPageList.Count then begin for I := 0 to ControlCount - 1 do begin if TTabSheetEX(FPageList.Items[AIndex])=Controls[I] then begin (Controls[I] as TTabSheetEX).free; Break; end; end; FPageList.Delete(AIndex); end;end;destructor TPageCtrolEx.Destroy;var I: Integer; j: Integer;begin// for I := 0 to FPageList.Count - 1 do// begin// for j := 0 to ControlCount - 1 do// begin// if Controls[j]=TTabSheetEX(FPageList.Items[I]) then// begin// Controls[j].Free;// Continue;// end;// end;// end;// FPageList.Free; inherited;end;function TPageCtrolEx.GetPageCount: Integer;begin Result:=FPageList.Count;end;function TPageCtrolEx.GetPages(Index: Integer): TTabSheetEX;begin // TODO -cMM: TPageCtrolEx.GetPages default body inserted Result := TTabSheetEX(FPageList.Items[index]);end;procedure TPageCtrolEx.Paint;var I: Integer; Arect:TRect;begin inherited; arect:=Bounds(0,0,0,0); for I := 0 to FPageList.Count-1 do begin Arect.Left:=Arect.Right+2; Arect.Top:=1; Arect.Right:=Arect.Left+50; Arect.Bottom:=24; Canvas.Brush.Color:=clWhite; Canvas.FillRect(Arect); Canvas.TextOut(Arect.Left+2,3,TTabSheetEX(FPageList.Items[I]).Caption); TTabSheetEX(FPageList.Items[I]).DrawBackGround ; end;end;procedure TPageCtrolEx.Resize;var I: Integer;begin inherited; for I := 0 to FPageList.Count - 1 do begin TTabSheetEX(FPageList.Items[I]).Height:=Height-24; end;end;{ TTabSheetEX }constructor TTabSheetEX.create(Aowner: TComponent);begin ControlStyle := [csAcceptsControls]; inherited Create(Aowner); //.Owner FpageCtrl:=TPageCtrolEx(Aowner); Parent:=FpageCtrl; Height:=FpageCtrl.Height-24; //align:=alBottom; Name:='Tab'+inttostr(FpageCtrl.FPageList.Count); FpageCtrl.FPageList.Add(Self);end;destructor TTabSheetEX.Destroy;begin inherited;end;procedure TTabSheetEX.SetParent(AParent: TWinControl);begin if AParent <>FpageCtrl then Exit; inherited;end;end.
[解决办法]
destructor TPageCtrolEx.Destroy;
里头的
for j := 0 to ControlCount - 1 do
应当改作
for j := ControlCount - 1 downto 0 do
[解决办法]
Add时没有添加到FPageList