Hallo Michael,
Zitat von
mimi:
1. kam eine fehlermeldung vom complier das
Zitat:
[Fehler] Unit1.pas(332): E2010 Inkompatible Typen: 'TWinControl' und 'TControl'
OK, Du hast recht - ich war zu schnell. Die entsprechende Zeile in #9 müsste bei mir lauten:
ctl := test.Controls[i] as TWinControl; // damit auf ctl noch später zugegriffen werden kann
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'.
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:
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;
3. Untersuche diese Komponente, z.B.
TLabel und untersuche die Hierarchie, was sie zu TWinControl und TControl sagt. (Ich hoffe jedenfalls, dass die Hierarchie in Deiner
PE-Hilfe angezeigt wird; andernfalls müssen wir danach weitersuchen.)
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