Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Panel incl. aller Komponenten zerstören (https://www.delphipraxis.net/168147-panel-incl-aller-komponenten-zerstoeren.html)

DRK11 7. Mai 2012 17:31

Delphi-Version: 7

Panel incl. aller Komponenten zerstören
 
Hallöchen,

ich bin neu in dieser Forum und hoffe, dass mir jemand helfen kann.

ich möchte eine Liste mit Panels realisieren. auf Knopfdruck werden weitere Panels mit Einträgen hinzugefügt.
Innerhalb der Panels ist ein Button durch den das Panel wieder gelöscht werden soll. Das funktioniert aber nicht,
wahrscheinlich die OnClick-Ereignisbehandlung, die beim Drücken auf den Button ausgelöst wird natürlich beim Destroy des
übergeordneten Panels auch gelöscht wird. Ich bekomme immer einen Abstraktion-Fehler.

Hier die "Lösch--Methode"

Delphi-Quellcode:
procedure xxx.DelClick (Sender:TObject);
var
  XPanel : TPanel;
  XBitBtn : TBitBtn;
  x : Integer;
  Found : Boolean;
begin
  x := 0;
  found := false;
  repeat
    XPanel := Liste[x];
    XBitBtn:= sender as TBitBtn;
    if XBitBtn.Parent = XPanel then
    Begin
      Found := True;
      Liste.delete(x);
      XPanel.destroy;
    end;
    inc(x);
  until (x = (Liste.Count)) or Found;
end;
Vieleicht hat ja jemand eine Idee.

Dirk

cookie22 7. Mai 2012 17:38

AW: Panel incl. aller Komponenten zerstören
 
Wenn du das Panel frei gibst, dann werden die Komponenten die darauf liegen automatisch mit frei gegeben. Du solltest Free aufrufen und nicht Destroy.

Du kannst einen Timer starten und damit das Panel löschen.

DRK11 7. Mai 2012 17:50

AW: Panel incl. aller Komponenten zerstören
 
Das mit dem Timer habe ich auch schon gemacht, ist aber nur "von Hinten durchs Auge!".
Das mit der free-methode ergibt den selben Fehler.

Dirk

mjustin 7. Mai 2012 17:59

AW: Panel incl. aller Komponenten zerstören
 
Zitat:

Zitat von DRK11 (Beitrag 1165230)
Das mit dem Timer habe ich auch schon gemacht, ist aber nur "von Hinten durchs Auge!".
Das mit der free-methode ergibt den selben Fehler.

Dirk

Ist "Liste" zufällig vom Typ TStrings und wird sie mit Liste := TStrings.Create erzeugt?

DRK11 7. Mai 2012 18:10

AW: Panel incl. aller Komponenten zerstören
 
Nein,

Liste := TList.Create;

Diese Liste soll nur die Panels Verwalten. In den Panels sind Buttons.
Im OnClick-Ereigniss der Buttons steht der oben angegebene Code.
Das Problem ist, das innerhalt des OnClic-Ereignisses das Panel und damit der
Button, von dem das Ereigniss ausgelöst wird zerstöhrt wird.

Natürlich funktioniert das mit dem Timer
- Komponente merken
- Timer starten
- OnClick vernünftig verlassen
- Timer auslösen
- Panel ist vernünftig gelöscht.

Ich dacht nur, vieleicht gäbe es ja noch eine elegantere Möglichkeit.

mfg

Dirk

Ralf Kaiser 7. Mai 2012 18:25

AW: Panel incl. aller Komponenten zerstören
 
Statt einen Timer zu verwenden kannst du deinem Formular mit "PostMessage" eine Nachricht schicken. Diese wird von Delphi erst verarbeitet wenn der aktuell Eventhandler (also der OnClick-Handler des Buttons) abgearbeitet wurde. In dem Eventhandler der auf diene Nachricht reagiert kannst du dann das Panel freigeben.

Die Methode "TForm.Release" arbeitet genauso. Damit kann man aus einem Eventhandler eines Formulars das Formular selbst freigeben.

Ciao,
Ralf

shmia 7. Mai 2012 19:05

AW: Panel incl. aller Komponenten zerstören
 
Zitat:

Zitat von Ralf Kaiser (Beitrag 1165235)
Statt einen Timer zu verwenden kannst du deinem Formular mit "PostMessage" eine Nachricht schicken.

Diese Technik wird hier gezeigt:
http://www.delphipraxis.net/25791-co...erstoeren.html

DRK11 7. Mai 2012 19:32

AW: Panel incl. aller Komponenten zerstören
 
Danke,

das mit dem Beispiel war super verständlich und hat auch super funktioniert.

Dirk

himitsu 7. Mai 2012 21:22

AW: Panel incl. aller Komponenten zerstören
 
Zitat:

Zitat von cookie22 (Beitrag 1165229)
Wenn du das Panel frei gibst, dann werden die Komponenten die darauf liegen automatisch mit frei gegeben. Du solltest Free aufrufen und nicht Destroy.

Nein, Parent-Beziehungen zerstören keine Objekte.
Also nur weil was auf einem Panel drauf liegt, wird es nicht mit dem Panel zerstört.

Dafür sind die Owner-Beziehungen da.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz