自定义组件开释时出错
自定义组件释放时出错。
刚开始学写组件。
下面的代码,写好安装后。放进一个窗口中。先执行几次add函数。然后执行delete(一次或多次),然后关闭窗口。
这时报错。好像是释放问题。该怎么解决呀.
刚开始学写组件。
下面的代码,写好安装后。放进一个窗口中。先执行几次add函数。然后执行delete(一次或多次),然后关闭窗口。
这时报错。好像是释放问题。该怎么解决呀.
- Delphi(Pascal) code
unit PageCtrolEx; interface uses 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; implementation Procedure 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.