![]() |
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 |
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. |
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:
Ciao
procedure TForm1.Image1Click(Sender: TObject);
begin Image1.Parent.Free; //Folgendes muß sein, damit die Nachricht "On Click" nicht weiter verarbeitet wird Abort; end; marco |
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; |
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 |
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)
|
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
|
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:
Und dann schau mal auf die Titelleiste und drück den Button ^^
Procedure TForm1.Timer1Timer(Sender: TObject);
Begin Caption := IntToStr(StrToIntDef(Caption, 1) + 1); End; Procedure TForm1.Button1Click(Sender: TObject); Begin Sleep(15000); End; |
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. |
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. ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz