Uwalnianie Panelu

0

Witam!

Mam kod, który tworzy na formie głównej panel, z kilkoma kontrolkami; wśród nich znajduje się przycisk, który ma panel zamknąć (zniszczyc). I tu pojawia się problem; nie mam pomysłu jak to zrealizować

type
  TDownloadItem = class (TSpTbxPanel) // panel
  private
    FButtonClose:TSpTBXButton;
    procedure Close(Sender:TObject);
  protected
  public
    constructor Create(AOwner:TCOmponent); override;
    destructor Destroy; reintroduce;
  end;

implementation


procedure TDownloadItem.Close(Sender: TObject);
begin
  Self.Free;
end;

constructor TDownloadItem.Create(AOwner: TCOmponent);
begin
  inherited Create(AOwner);

  Parent:=TWinControl(AOwner);

  Width:=500;
  Height:=90 ;
  Constraints.MaxHeight := 90;
  ThemeType:=thtTBX;
  TBXStyleBackground:=True;
  Constraints.MinHeight := 90;

  FButtonClose:= TSpTBXBUtton.Create(Self);
  FButtonclose.Parent:=Self;

  with FButtonclose do
  begin
    Parent:=Self;
    Anchors := [akTop, akRight];
    Width:=100;
    Height:=23;
    Left:=395;
    Top:=33;
    ThemeType:=thtTBX;
    Caption:='Close';
    Show;
    OnClick:=Close;
  end;


  Align := alTop;
  Show;

end;

destructor TDownloadItem.Destroy;
begin
  FButtonClose.Free;
  inherited Destroy;
end;

Juz mam wszystko napisane, pozostał mi tylko ten problem do rozwiązania.

0

Witaj spróbuj może mój kodzik może ci pomoże

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
procedure zniszcz(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
panel:array[0..0] of tpanel;
button:array[0..0] of tbutton;
implementation

{$R *.dfm}
procedure TForm1.zniszcz(Sender: TObject);
begin
panel[0].Destroy;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
panel[0]:=tpanel.Create(self);
panel[0].Parent:=self;
button[0]:=tbutton.Create(panel[0]);
button[0].Parent:=panel[0].Parent;
button[0].Name:='Zniszcz';
button[0].OnClick:=zniszcz;
end;

end.

0

Witaj spróbuj może mój kodzik może ci pomoże

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TForm1 = class(TForm)
procedure zniszcz(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
panel:array[0..0] of tpanel;
button:array[0..0] of tbutton;
implementation

{$R *.dfm}
procedure TForm1.zniszcz(Sender: TObject);
begin
panel[0].Destroy;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
panel[0]:=tpanel.Create(self);
panel[0].Parent:=self;
button[0]:=tbutton.Create(panel[0]);
button[0].Parent:=panel[0].Parent;
button[0].Name:='Zniszcz';
button[0].OnClick:=zniszcz;
end;

end.

0

Tu jest właśnie problem: Twój kod usuwa tylko panel, ale nie usuwa przycisku.

procedure TForm1.zniszcz(Sender: TObject);
begin
panel[0].Destroy;
end;
0

To znany problem gdy komponent chce się zniszczyć w "samym sobie" np. wywołanie Self.Destroy we własnym (albo Parenta) OnClick. Ja rozwiązałem ten problem przez stworzenie niewidocznego trasha w postaci panela. Gdy chciałem "zniszczyc" jakiś komponent to po prostu robiłem komponent.Parent := trash i już. Zwalanianiem trasha nie musisz się już zajmować. Zostanie on zwolniony z całą zawartością automatycznie przy np. zamykaniu aplikacji. Oczywiście możesz sam umieścić gdzieś w swoim kodzie trash.Free.

Pozdrawiam,
albi

1 użytkowników online, w tym zalogowanych: 0, gości: 1