![]() |
AW: Ein Objekt zu Laufzeit die Klasse zuweisen
Zitat:
...:cat:... |
AW: Ein Objekt zu Laufzeit die Klasse zuweisen
Zitat:
@Zacherl Wäre evtl. möglich, aber dann fängt es an wieder komplex zu werden. |
AW: Ein Objekt zu Laufzeit die Klasse zuweisen
Dann hast du - entschuldige bitte - aber die Frage völlig falsch gestellt.
Denn du willst einer Objektvariablen zur Laufzeit eine andere Instanzreferenz zuweisen und nicht einem Objekt eine Klasse ;) Und wo ist das Problem? Um ganz sicher zu gehen, dass es funktioniert, definiere die Variable als TObject, dann kann dort jede Instanz-Referenz abgelegt werden, die von TObject abgeleitet wurde (also jede) Ok, per hartem Cast kann man auch alles machen, ist aber nicht ratsam. Wo ist denn das eigentliche Problem? Zeig doch mal ein wenig Code, wo du da ein Problem siehst. EDIT hmmm, suchst du so etwas wie das Visitor Pattern? Schau mal beim Uwe Raabe auf der Blogseite rein, der hat da in 4 Teilen etwas sehr kreatives abgeliefert |
AW: Ein Objekt zu Laufzeit die Klasse zuweisen
Das eigentlich Problem ist, dass nichts bisher funktionierte was ich getestet habe. Vielleicht liegt das Problem im Detail. Ich mache noch paar Versuche.
//Edit: Nein, es funktioniert doch nicht. Wie gesagt, anscheinend habe ich beim ersten Mal das Problem richtig beschrieben, beim zweiten Mal zu Missverständnissen geführt. Aber letztendlich ist es egal, es war eher nur eine Idee und eine Frage der Machbarkeit. Kein eigentliches Problem, mehr Interesse. Aber wenn ich gerade so überlege, dann kann das nicht klappen. Selbst wenn es klappen würde, wahrscheinlich würde der Compiler es nicht mitmachen. Wenn ich z.B. Tmp.Canvas im Code eingebe, dann macht er das beim falschen Objekt sowieso nicht mit. |
AW: Ein Objekt zu Laufzeit die Klasse zuweisen
Zitat:
Möchtest du evtl. in dieser Richtung?
Delphi-Quellcode:
Übergibst du eine TButton Instanz, soll die Caption geändert werden, übergibst du eine Instanz von TStringList, dann soll der Inhalt gelöscht werden.
procedure DoSomething( AInstance : TObject );
begin ... end; Suchst du sowas in der Art? |
AW: Ein Objekt zu Laufzeit die Klasse zuweisen
Wie gesagt, inzwischen gehe ich davon aus, dass es nicht klappen kann. Aber ich beschreibe man meine Überlegungen noch mal mit meinen Beispiel aus dem ersten Beitrag (nur der Vollständigkeitshalber).
Delphi-Quellcode:
Wie gesagt, mich interessierte es nur ob das geht.
procedure TForm1.FormDestroy(Sender: TObject);
var i: Integer; Tmp: T???; begin with ListBox1 do for i := 0 to Items.Count - 1 do begin //An jedem Item hängt ein Objekt, nehmen wir an es ist ein TBitmap, aber ich weiß es nicht //Nun stellt sich die Frage ob ich Tmp im Betrieb zu dem Objekttyp machen kann der //am Item hängt. Also ermitteln, dass es TBitmap ist und Tmp zu TBitmap machen Tmp:= T???(Items.Objects[i]); //Das Free ist hier Sekundär und nur ein Beispiel. Das wird auch so klappen, da es jedes Objekt besitzt //Aber um das geht es weniger, sondern kann ich Tmp zuerst zu TBitmap machen und //es erst dann freigebe Tmp.Free; end; end; //Edit: Oder anders ausgedrückt
Delphi-Quellcode:
nur das ich die Info TBitmap aus dem Objekt an dem Item erfahre.
(Tmp as TBitmap)
.. |
AW: Ein Objekt zu Laufzeit die Klasse zuweisen
Da es nur Sinn macht den Typen zu erfahren, wenn mit diesem Objekt etwas klassenspezifisches machen möchte (also z.B. der TBitmap-Instanz ein Bild zuweisen), denn ansonsten wäre der Typ egal, bzw. man muss nicht immer den ganz konkreten Typen wissen, wenn die geplante Aktion auch schon ein paar Klassen vorher implementiert ist/ansprechbar ist (z.B. die Eigenschaft Tag wird von TComponent eingeführt, darum müsste ich nicht auf TButton prüfen um das Tag zu setzen)
Also ist meine Vermutung schon richtig gewesen, dass du einen Visitor haben möchtest ;) Hier der Link zum Blog von Uwe ![]() |
AW: Ein Objekt zu Laufzeit die Klasse zuweisen
Nur um sicher zu gehen, dass das Objekt weiß was es ist weißt Du?
Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
begin Listbox1.Items.AddObject('',TButton.Create(self)); Listbox1.Items.AddObject('',TListbox.Create(self)); Listbox1.Items.AddObject('',TBitmap.Create); end; procedure TForm3.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin ListBox1.Canvas.FillRect(rect); ListBox1.Canvas.TextOut(rect.Left,rect.Top,ListBox1.Items.Objects[index].ClassName); end; |
AW: Ein Objekt zu Laufzeit die Klasse zuweisen
Zitat:
Delphi-Quellcode:
type
PClass = ^TClass; begin if MyObject is TBaseObject then PClass(MyObject)^ := TDerivedObject; ... end |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:21 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