![]() |
Ein Objekt zu Laufzeit die Klasse zuweisen
Ich hab ein etwas sonderbares Problem, bin mir aber sicher, dass es irgendwie zu realisieren geht. Nur fehlt mir hier etwas Wissen.
Ich beschreibe das Problem etwas vereinfacht: ich erstelle ein Objekt in einer Prozedur und gebe das Objekt in einer zweiten Prozedur frei. Soweit nichts besonderes, das Problem liegt aber im Detail. Ich beschreibe das Problem etwas genauer: ich erstelle in einer Prozedur ein beliebiges Objekt und übergebe es an ein TStrings Item. Beim löschen des Items in der zweiten Prozedur gebe ich zuerst das Objekt frei und lösche dann erst das Item. Das ist die normale Vorgehensweise, also immer noch nichts besonderes. Das Problem ist aber, dass das Objekt in der ersten Prozedur mal dieses, mal jenes sein kann. Ich muß also in der zweiten Prozedur den Typ immer anpassen. Das möchte ich mir sparen. Ich würde das gerne automatisieren wenn es geht. Nur bisherige Versuche schlugen fehl. Ich kann doch den Objekttyp aus dem Item auslesen. Wie kann ich also zu Laufzeit den Objekttyp einer Variable ändern? Letztendlich geht es um sowas in der Art:
Delphi-Quellcode:
Kann ich Tmp als Objekttyp zu Laufzeit anpassen?
procedure TForm1.FormDestroy(Sender: TObject);
var i: Integer; Tmp: TMyObj; begin with ListBox1 do for i := 0 to Items.Count - 1 do begin Tmp:= TMyObj(Items.Objects[i]); Tmp.Free; end; end; |
AW: Ein Objekt zu Laufzeit die Klasse zuweisen
Delphi-Quellcode:
Das sollte doch vollkommen ausreichen, das Objekt dürfte ja seinen eigenen Destruktor kennen.
for i := 0 to ListBox1.Items.Count - 1 do
ListBox1.Items.Objects[i].Free; |
AW: Ein Objekt zu Laufzeit die Klasse zuweisen
Was hält dich davon ab, das hier zu tun?
Delphi-Quellcode:
Manchmal sind die Dinge einfacher als gedacht :wink:
procedure TForm1.FormDestroy(Sender: TObject);
var i: Integer; begin with ListBox1 do for i := 0 to Items.Count - 1 do Items.Objects[i].Free; end; |
AW: Ein Objekt zu Laufzeit die Klasse zuweisen
Oder einfach
![]() |
AW: Ein Objekt zu Laufzeit die Klasse zuweisen
Das gibt es IIRC aber erst seit Delphi XE.
|
AW: Ein Objekt zu Laufzeit die Klasse zuweisen
Über Generics könnte man das im schlimmsten Fall auch noch lösen. :mrgreen:
|
AW: Ein Objekt zu Laufzeit die Klasse zuweisen
Aber wozu sollten einem die Generics helfen? Beim Freigen einer beliebigen Instanz?
Einfach freigen und gut, egal was das für eine Instanz ist (wenn es eine Instanz ist) |
AW: Ein Objekt zu Laufzeit die Klasse zuweisen
Ok, in dem einem speziellem Fall scheint es wirklich einfacher zu sein als gedacht. Da habe ich anscheinend beim überlegen paar Ebenen übersprungen und erst an einem Punkt in der Mitte angefangen. Das ist um so erstaunlicher, da ich beim testen eigentlich auch schon soweit war, nur dem Ganzen nicht getraut habe, weil es für mich zu einfach war. Ich dachte es funktioniert nur zufällig. Bisher auf jeden Fall danke.
Trotzdem interessiert mich das Prinzip im allgemeinem. Jetzt weniger um ein Problem zu lösen als um die Machbarkeit festzustellen. |
AW: Ein Objekt zu Laufzeit die Klasse zuweisen
Es ist auf jeden Fall nicht möglich eine Instanz auf eine andere Klasse umzustellen.
z.B. eine TStringList auf ein TButton |
AW: Ein Objekt zu Laufzeit die Klasse zuweisen
Erstell dir eine Basisklasse und deklariere den constructor und destructor als virtual. Wenn du dann bei den konkreten Objekten die Methoden überschreibst, wird automatisch die richtige Funktion ausgeführt. Sind die Methoden nicht virtual, dann wird bei diesem Beispiel nur die Funktion der Basisklasse in Betracht gezogen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:58 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