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 13. Okt 2012
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Ein Objekt zu Laufzeit die Klasse zuweisen

  Alt 13. Okt 2012, 19:34
Erstell dir eine Basisklasse und deklariere den constructor und destructor als virtual.
Der Destructor ist schon ab TObject virtual Nix zu tun und für jedes Objekt verfügbar. Ebenso wie Free.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#12

AW: Ein Objekt zu Laufzeit die Klasse zuweisen

  Alt 13. Okt 2012, 19:48
Es ist auf jeden Fall nicht möglich eine Instanz auf eine andere Klasse umzustellen.
z.B. eine TStringList auf ein TButton
Mir ist auch klar, dass ich aus einer TStringList keinen TButton machen kann. Aber das will ich auch nicht, denn der Button ist ja eigentlich schon da. Ich will der Objektvariable nur sagen, dass sie jetzt nicht mehr TStringList ist, sondern TButton. Ist wie beim Autoverkauf, das Auto ist da, es wechselt nur der Besitzer. Der TButtom ist im Speicher, ich weiß, dass es ein TButton ist und ich hab auch seine Adresse. Denn seinen wir mal ehrlich, eine Objektvariable ist eigentlich nur ein Integerwert mit der Adresse. Dem ist es eigentlich Schnuppe ob es ein TStringList ist oder ein TButton. Nur wurde eben irgendwo vermerkt, das die Objektvariable ein TStringList. Und die Frage ist ob man das ändern kann.

@Zacherl

Wäre evtl. möglich, aber dann fängt es an wieder komplex zu werden.
  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
 
#13

AW: Ein Objekt zu Laufzeit die Klasse zuweisen

  Alt 13. Okt 2012, 20:03
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
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)

Geändert von Sir Rufo (13. Okt 2012 um 20:07 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#14

AW: Ein Objekt zu Laufzeit die Klasse zuweisen

  Alt 13. Okt 2012, 20:21
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.

Geändert von Popov (13. Okt 2012 um 20:40 Uhr)
  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
 
#15

AW: Ein Objekt zu Laufzeit die Klasse zuweisen

  Alt 13. Okt 2012, 20:29
Das eigentlich Problem ist, dass nichts bisher funktionierte was ich getestet habe. Vielleicht liegt das Problem im Detail. Ich mache noch paar Versuche.
Wenn du uns - oder mir - mal erklären würdest, was du denn wirklich machen möchtest, dann erhöhen sich die Chancen schlagartig. Mir ist es auf jeden Fall noch nicht ganz klar

Möchtest du evtl. in dieser Richtung?
Delphi-Quellcode:
procedure DoSomething( AInstance : TObject );
begin
  ...
end;
Übergibst du eine TButton Instanz, soll die Caption geändert werden, übergibst du eine Instanz von TStringList, dann soll der Inhalt gelöscht werden.

Suchst du sowas in der Art?
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)

Geändert von Sir Rufo (13. Okt 2012 um 20:33 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#16

AW: Ein Objekt zu Laufzeit die Klasse zuweisen

  Alt 13. Okt 2012, 20:57
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:
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;
Wie gesagt, mich interessierte es nur ob das geht.

//Edit:

Oder anders ausgedrückt

Delphi-Quellcode:
  (Tmp as TBitmap)
  ..
nur das ich die Info TBitmap aus dem Objekt an dem Item erfahre.

Geändert von Popov (13. Okt 2012 um 21:10 Uhr)
  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
 
#17

AW: Ein Objekt zu Laufzeit die Klasse zuweisen

  Alt 13. Okt 2012, 21:33
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 Visitor Pattern Teil 4
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 Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#18

AW: Ein Objekt zu Laufzeit die Klasse zuweisen

  Alt 13. Okt 2012, 22:29
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;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#19

AW: Ein Objekt zu Laufzeit die Klasse zuweisen

  Alt 13. Okt 2012, 23:42
Es ist auf jeden Fall nicht möglich eine Instanz auf eine andere Klasse umzustellen.
z.B. eine TStringList auf ein TButton
Aber eine TStringList auf eine abgeleitete Klasse.
Delphi-Quellcode:
type
  PClass = ^TClass;
begin
  if MyObject is TBaseObject then
    PClass(MyObject)^ := TDerivedObject;
...
end
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 06:16 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