![]() |
Re: Komponenten löschen > Abstracter Fehler
Hallo Michael,
Zitat:
Delphi-Quellcode:
Aber das würde, wie Du feststellen musstest, weiterhin zu einem Laufzeitfehler führen; ich nehme an, ebenfalls mit einem Hinweis auf Inkompatible Typen: 'TWinControl' und 'TControl'.
ctl := test.Controls[i] as TWinControl; // damit auf ctl noch später zugegriffen werden kann
Zu Deiner Version: Du darfst nicht darauf verzichten, jedes angelegte Control ausdrücklich freizugeben! Ich habe mir den Quelltext von RemoveControl in controls.pas angesehen (er ist auf mehrere Prozeduren aufgeteilt, deshalb zitiere ich ihn hier nicht - wenn Du es über PN wünschst, stelle ich ihn Dir trotz Lizenzproblemen zur Verfügung): es werden Handle freigegeben, und das Control wird aus Listen entfernt, aber niemals gelöscht! Das musst Du zusätzlich machen!!! Den dadurch auftretenden Fehler kannst Du selbst suchen. 1. Stelle fest, wo genau es knallt; das zeigt Dir der Laufzeitfehler vermutlich exakt an. 2. Ergänze den Quelltext an dieser Stelle wie folgt durch Fehlerprüfung (ich habe meinen vorherigen Text kopiert und nur neue Änderungen gekennzeichnet):
Delphi-Quellcode:
3. Untersuche diese Komponente, z.B.
procedure TForm1.PanelFree(Sender:Tobject);
var test:TWinControl; ctl: TWinControl; MenuItem:TMenuItem; i:Integer; begin test:=TJvCaptionPanel((Sender as TWinControl).Parent); TMenuItem(form1.FindComponent('MenuItem' +InTTostr(test.tag))).Destroy; form1.ActiveControl:=niL; for i:=test.ControlCount-1 downto 0 do begin if test.Controls[i] <> NIL then begin try // ich nehme an, hier knallt es, also prüfen ctl := test.Controls[i]; test.RemoveControl(test.Controls[i]); ctl.Free; except on e:exception do ShowMessage(e.Message); // ich nehme an, dass Du durch die Meldung genau die betroffene // Komponente genannt bekommst end; end; end; test.free; end; ![]() 4. Ändere die Typen von Variablen und Befehlszeilen, soweit erforderlich. Alternativ kannst Du natürlich auch mit einem Haltepunkt arbeiten. Das genügt, wenn der Fehler im 2. oder 3. Durchlauf der Schleife auftritt; aber es ist lästig, wenn es erst beim 37. Durchlauf knallt. Genereller Hinweis zu diesen Typen (das bezieht sich auch auf meinen früheren Hinweis in #5 zu var test: TJvCaptionPanel): Es empfiehlt sich immer, möglichst weit weg von TObject zu gehen, und zwar soweit, wie alle benötigten Eigenschaften direkt zur Verfügung stehen. Beispiele: a. TLabel hat eine Eigenschaft Alignment, aber TControl nicht. Wenn Du mit dieser Eigenschaft arbeiten willst, solltest Du nicht TControl, sondern TLabel verwenden (sonst musst Du immer wieder 'as TLabel' einfügen.) b. TWinControl enthält Controls, TControl nicht. Deshalb ist die Deklaration von test als TWinControl nicht zu beanstanden. (Wenn Du in einer anderen Situation auf eine spezielle Eigenschaft von TJvCaptionPanel zugreifen willst, solltest Du test unbedingt auch so deklarieren.) Zusammenfassung: In der konkreten Situation ist die Deklaration von test als TWinControl ausreichend. Die Deklaration von ctl als TWinControl führte zu dem Fehler. Alles klar? Jürgen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:35 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