AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ein Objekt zu Laufzeit die Klasse zuweisen

Ein Thema von Popov · begonnen am 13. Okt 2012 · letzter Beitrag vom 14. Okt 2012
Antwort Antwort
Seite 1 von 2  1 2      
Popov
(Gast)

n/a Beiträge
 
#1

Ein Objekt zu Laufzeit die Klasse zuweisen

  Alt 13. Okt 2012, 18:02
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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

AW: Ein Objekt zu Laufzeit die Klasse zuweisen

  Alt 13. Okt 2012, 18:10
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#3

AW: Ein Objekt zu Laufzeit die Klasse zuweisen

  Alt 13. Okt 2012, 18:11
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
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#4

AW: Ein Objekt zu Laufzeit die Klasse zuweisen

  Alt 13. Okt 2012, 18:30
Oder einfach OwnsObjects der Items auf True setzen.
Lars
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#5

AW: Ein Objekt zu Laufzeit die Klasse zuweisen

  Alt 13. Okt 2012, 19:01
Das gibt es IIRC aber erst seit Delphi XE.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Ein Objekt zu Laufzeit die Klasse zuweisen

  Alt 13. Okt 2012, 19:08
Über Generics könnte man das im schlimmsten Fall auch noch lösen.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Ein Objekt zu Laufzeit die Klasse zuweisen

  Alt 13. Okt 2012, 19:21
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)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#8

AW: Ein Objekt zu Laufzeit die Klasse zuweisen

  Alt 13. Okt 2012, 19:50
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Ein Objekt zu Laufzeit die Klasse zuweisen

  Alt 13. Okt 2012, 20:02
Es ist auf jeden Fall nicht möglich eine Instanz auf eine andere Klasse umzustellen.
z.B. eine TStringList auf ein TButton
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#10

AW: Ein Objekt zu Laufzeit die Klasse zuweisen

  Alt 13. Okt 2012, 20:25
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:01 Uhr.
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