Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Zur Laufzeit erstellte Komponenten freigeben (https://www.delphipraxis.net/17314-zur-laufzeit-erstellte-komponenten-freigeben.html)

BenjaminHelbig 3. Mär 2004 09:12


Zur Laufzeit erstellte Komponenten freigeben
 
Hi DP'ler

ich habe folgendes Problem:
Ich lasse zur Laufzeit eie Panel erzeugen, welches ich bei Klick auf ein Image innerhalb des Panels wieder freigeben möchte.
Erzeugen lasse ich das Panel mit:

MyPanel := TPanel.Create(Detail1.MainFrame1.QueryFrame1.Panel s2);
MyPanel.Name := 'Panels0';

Bei Klick auf das Image ist foglender Code hinterlegt:

MyPanelTMP := Detail1.MainFrame1.QueryFrame1.FindComponent('Pane ls') as TPanel;
MyPanelTMP.Free;

Das Problem bei der Geschichte ist, dass er MyPanelTMP nil zuweist. Ich vermute einfach mal, dass FindComponent nicht die zur Leufzeit erstellten Komponenten findet, sondern nur die zur Designzeit erstellten, kann das sein? Und wie komme ich da drumrum?

Grüßle Ben

himitsu 3. Mär 2004 09:17

Re: Zur Laufzeit erstellte Komponenten freigeben
 
Das findet alle Komponenten, egal ob zur Entwurfs-, oder zur Laufzeit erstellt.

Ich vermute mal du läßt FindCompontent an der falschen stelle suchen.

erstellen läßt du das Panel ja als Element von
Detail1.MainFrame1.QueryFrame1.Panels2
und gesucht wird unter
Detail1.MainFrame1.QueryFrame1


Versuch's mal so:
Code:
MyPanel := TPanel.Create(Detail1.MainFrame1.QueryFrame1.Panels2);
MyPanel.Name := 'Panels0';

MyPanelTMP := Detail1.MainFrame1.QueryFrame1.[b]Panels2[/b].FindComponent('Panels') as TPanel;
MyPanelTMP.Free;

[add]
FindComponent durchsucht ja nur das angegebene Objekt und keine Untergeordneten.

MarcoWarm 3. Mär 2004 09:21

Re: Zur Laufzeit erstellte Komponenten freigeben
 
Hallo Benjamin

Auf jeden Fall kannst Du (Wenn das Image direkt auf dem Panel liegt) folgendes versuchen;

Delphi-Quellcode:
procedure TForm1.Image1Click(Sender: TObject);
begin
  Image1.Parent.Free;

  //Folgendes muß sein, damit die Nachricht "On Click" nicht weiter verarbeitet wird
  Abort;
end;
Ciao

marco

BenjaminHelbig 3. Mär 2004 09:39

Re: Zur Laufzeit erstellte Komponenten freigeben
 
Hi, das war das Problem, ich muss unter Panel2 suchen.
OK, jetzt stehe ich aber davor, das Teil zu freen. Ich darf ja eine Komponente nicht in einer ihrer Ereignisbehandlungsroutinen freigeben. Wie stelle ich das dann aber an?

Image1.Parent.Free;
abort;

entfällt damit ja leider genauso wir MyPanelTMP.Free;

MarcoWarm 3. Mär 2004 09:43

Re: Zur Laufzeit erstellte Komponenten freigeben
 
Du mußt bloß nach dem freigeben

Abort;

aufrufen - so wird die Ereignisbehandlung nicht forgesetzt und es gibt keinen Fehler.

Nicht die feine Englische - aber es geht

Ciao
Marco

himitsu 3. Mär 2004 11:03

Re: Zur Laufzeit erstellte Komponenten freigeben
 
Da kannst du ja auch das Freigeben eine andere Prozedur machen lassen, die erst nach dem Beenden der Ereignisprozedur diese Komponente gestartet wird. (z.B. mit einem Timer oder einer Windowsbotschaft an's eigene Programm)

MarcoWarm 3. Mär 2004 11:08

Re: Zur Laufzeit erstellte Komponenten freigeben
 
Ein Timer kann tückisch sein - wenn der Rechner sehr langsam ist oder hängt, kann der Timer u.U. zu früh zuschlagen und zu sehr unangenehmen Resultaten führen

himitsu 3. Mär 2004 11:56

Re: Zur Laufzeit erstellte Komponenten freigeben
 
Bei der einfach Timer-Komponente (TTimer) braucht man da wohl "keine" Angst zu haben.

Diese kann erst ihre Ereignisprozedur aufrufen, wenn der Hauptthread arbeitet und die Botschaftswarteschlange verarbeitet, denn der arbeitet ja über diese.
Und die Ereignis-Procedur hält ja diesen an, es sei denn, man fügt Application.ProcessMessages; in den Code diese Prozedur mit ein.


Nimm dir z.B. mal 'nen Button und einen Timer mit dem Interval von 1 (ms) und den einfachen Code
Delphi-Quellcode:
Procedure TForm1.Timer1Timer(Sender: TObject);
  Begin
    Caption := IntToStr(StrToIntDef(Caption, 1) + 1);
  End;

Procedure TForm1.Button1Click(Sender: TObject);
  Begin
    Sleep(15000);
  End;
Und dann schau mal auf die Titelleiste und drück den Button ^^

MarcoWarm 3. Mär 2004 12:01

Re: Zur Laufzeit erstellte Komponenten freigeben
 
@himitsu
kannst du garantieren, daß während des Zerstörens des Panels und seiner Komponenten nich doch irgendwo ProcessMessages aufgerufen wird? - ich würd mich nicht drauf verlassen.

Jens Schumann 3. Mär 2004 12:05

Re: Zur Laufzeit erstellte Komponenten freigeben
 
Hallo,
dafür finden sich hier einige Beispiele.
Eine eigene Botschaft via PostMessage an das eigene Programm
hat sich immer bestens bewährt.

http://www.delphipraxis.net/internal...ht=postmessage


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:39 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