Destruktory dla komponentów.

0

Mam następujący problem.

Tworzę sobie dynamicznie komponenty:

 with TSpeedButton.Create(self) do begin
            Width:=41;
            Height:=33;
            Left:=8+1*48;
            Font.Height:=24;
            Font.Size:=18;
            Caption:='Napis';
            Name:='A';
            Parent:=Self;
            Visible:=True;
            end;

i je niszczę

TSpeedButton(FindComponent('A')).destroy;
TSpeedButton(FindComponent('A')).free;

Wszystko super ale kłopot występuje jak utworze dane komponenty na innym wcześniej umieszczonym komponencie i mam je zniszczyć np:

 with TSpeedButton.Create(ToolBar1) do begin
            Width:=41;
            Height:=33;
            Left:=8+1*48;
            Font.Height:=24;
            Font.Size:=18;
            Caption:='Napis';
            Name:='A';
            Parent:=ToolBar1;
            Visible:=True;
            end;

Wówczas nie wiem jak się odwołać destruktorem do komponentu znajdującego się na innym.

Ktoś zna rozwiązanie tego problemu?

0

TWinControl.Controls property
Delphi+F1

0

a przypadkiem gdy komponent ma ustawionego Owner przy tworzeniu, to później nie jest niszczony automatycznie?
PS. jak dasz samo "free" to destroy zostanie wywołane automatycznie, pod warunkiem że "nadpisuje" (override) metodę rodzica.

0

Teoretycznie powinien, aczkolwiek z doświadczenia wiem, że różnie z tym bywa. Jeśli się utworzyło komponent, obiekt etc poprawnie wedle sztuki jest go również zniszczyć.
Wielu niestety "twórców" komponentów wychodzi z podobnego założenia co migajek i potem są cyrki z wyciekami pamięci.

Zamiast samego free sugeruje uzywac funkcji FreeAndNil, tak dla pewności.

0

Ehh i znów pełna wypowiedź wszystko mówiąca Shadow85 o co chodziło w pierwszym tu zamieszczonym poście ? Bo szukając w Delphi w helpie o destroy znalazłem:

Destroys an instance of TSpeedButton.

Delphi syntax:

destructor Destroy; override;

Description

Do not call Destroy directly in an application. Instead, call Free. Free verifies that the speed button is not nil, and only then calls Destroy.

Co do rady z FreeAndNil za chwilkę sprawdzę czy działa podobnie jak moja część.

0

Delphi masz?
Help w Delphi masz?
Google chyba Ci nie odcieli?
Naprowadziłem Cię, czego jeszcze potrzebujesz? kodu? Prosze:

Na formatce umiescilem panel (panel1) i Button (Button2), na panelu dalem editke (edit1), labelke (label1) i guziczek (button1)

Na on click button2 poszla metoda Button2Click.

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
  for i:=0 to panel1.ControlCount-1 do
  begin
    if panel1.Controls[i] is TButton then
      showmessage('Znalazlem kontrolke guzika ' + (panel1.Controls[i] as TButton).Caption)
    else
      showmessage((panel1.Controls[i] as TComponent).Name+' jest typu '+(panel1.Controls[i] as TComponent).ClassName)
  end;
end;

end.

Chyba teraz jest już wszystko jasne jak odwolac sie do komponentow na TWinControl

0
  1. jak już padło wcześniej - nigdy destroy, zawsze free
  2. FreeAndNil nie niszczy obiektu 'lepiej' od free - niszczy go dokładnie tak samo
  3. jak się tworzy komponent z kodu i podaje się mu ownera to owner zawsze go usunie niezelażnie od tego jak dany komponent został napisany (co nie znaczy, że zostanie zwolniona cała pamięć zajmowana przez komponent bo to już zależy od samego komponentu). Oczywiście nic nie stoi na przeszkodzie, żeby ręcznie zwolnić komponent.
  4. jeśli natomiast nie podaje się ownera to trzeba go ZAWSZE zwolnić samemu
  5. adydan dodaj sobie do uses contnrs i pooglądaj sobie takie fajne klasy jak TObjectList i TComponentList - zoszczędzi Ci to podobnych problemów i ułatwi życie
0

Dla precyzji FreeAndNil oprocz zwalniania obiektu na koniec przypisuje do niego nil (sprawia że wskaźnik na obiekt nie wskazuje na nic), dlatego napisałem "na wszelki wypadek".

0

Shadow85 kod zdecydowanie pomógł, mnie czasami trzeba proste rzeczy pokazać jak nie potrafię ich znaleźć, a męczyłem się z tym trochę. Nie rozumiem logiki owner ponieważ moje komponenty są tworzone na żądanie w trakcie programu mają być niszczone i ponownie tworzone dlatego nie potrafię zrozumieć idei owner ponieważ to ja chcę wywoływać niszczenie obiektów.

Co do google to mi je odetną pewnie niedługo bo zwalniam serwer głupimi pytaniami.

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