Delphi-PRAXiS
Seite 1 von 2  1 2      

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/)
-   -   Ein Objekt zu Laufzeit die Klasse zuweisen (https://www.delphipraxis.net/170982-ein-objekt-zu-laufzeit-die-klasse-zuweisen.html)

Popov 13. Okt 2012 17:02

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:
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;
Kann ich Tmp als Objekttyp zu Laufzeit anpassen?

DeddyH 13. Okt 2012 17:10

AW: Ein Objekt zu Laufzeit die Klasse zuweisen
 
Delphi-Quellcode:
for i := 0 to ListBox1.Items.Count - 1 do
  ListBox1.Items.Objects[i].Free;
Das sollte doch vollkommen ausreichen, das Objekt dürfte ja seinen eigenen Destruktor kennen.

jfheins 13. Okt 2012 17:11

AW: Ein Objekt zu Laufzeit die Klasse zuweisen
 
Was hält dich davon ab, das hier zu tun?
Delphi-Quellcode:
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;
Manchmal sind die Dinge einfacher als gedacht :wink:

daywalker9 13. Okt 2012 17:30

AW: Ein Objekt zu Laufzeit die Klasse zuweisen
 
Oder einfach OwnsObjects der Items auf True setzen.

DeddyH 13. Okt 2012 18:01

AW: Ein Objekt zu Laufzeit die Klasse zuweisen
 
Das gibt es IIRC aber erst seit Delphi XE.

nuclearping 13. Okt 2012 18:08

AW: Ein Objekt zu Laufzeit die Klasse zuweisen
 
Über Generics könnte man das im schlimmsten Fall auch noch lösen. :mrgreen:

Sir Rufo 13. Okt 2012 18:21

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)

Popov 13. Okt 2012 18:50

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.

Sir Rufo 13. Okt 2012 19:02

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

Zacherl 13. Okt 2012 19:25

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 22:51 Uhr.
Seite 1 von 2  1 2      

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