![]() |
Object zur Laufzeit generieren
Hallo, gibt es eine möglichkeit, ein Object erst zur Laufzeit zu definieren. Mein Problem ist, der Nutzer bestimmt erst bei der Laufzeit, was alles rein gehört. Sowohl die Anzahl der Elemente und auch deren Art (String, Integer, Boolean usw) werden dann bestimmt.
Kann man so was machen? |
Re: Object zur Laufzeit generieren
So wie du es dir vermutlich vorstellst nicht. Dazu wäre eine Kompilierung zu laufzeit nötig.
Aber du könntest ja deine Klassen so dynamisch/intelligent machen, da die Element in einer Auflistung liegen, die der User (über entsprechende Dialoge) "füllen" kann. Ähnlich Klassen/Auflistungen wie es z.B. bei der Delphi TDataset-Klasse realisiert ist. Da weis die Komponente auch nicht mit welchen Feldern (Anzahl/Typ) die Komponente arbeiten muss. |
Re: Object zur Laufzeit generieren
wenn du so fexibel sein willst/musst hast du nur die möglichkeit von den nativen typen weg zu gehen und einen Abstrakten Weg zu gehen.
Möglichkeit a) Du machst dir eine Sammlung von Strings (oder auch nur Integer Werten - noch Abstrakter) und fängst zu Laufzeit an diese Auszuwerten. Das kannst du natürlich auch mit anderen Mitteln machen als String. Ich denke ein Bytestream mit darstellung in HEX würde sich anbieten. Da je jede Information sowiso nur mit logisch '1' ond '0' dargestellt wird kannst du sie danach ja interprätieren wie du willst.
Delphi-Quellcode:
geht auch mit records, wo du dir typen [typeInt, typeBool, typeSonstwas, ...] anlegst.
MyArray[0][0]:='1' // Boolean
MyArray[0][1]:='true' MyArray[1][0]:='2' // Integer MyArray[1][1]:='1024' Möglichkeit b) Du erzeugst... hab mir grad soviel Gedanken um Möglichkeit A gemacht, dass ich B vergessen hab :oops: Was kann man an nem Montag Morgen schon erwarten... :roll: |
Re: Object zur Laufzeit generieren
Schlag mich, aber mir fällt der Objektorientierte Ansatz, den ich grad hatte nicht mehr ein... ich geh mir mal nen Kaffee holen. Hier noch schnell die etwas elegantere Variante A, die ich grad mal QFD getippt hab.
Delphi-Quellcode:
Ich hab wegen der Anschaulichkeit hier mal mit String gearbeitet. Ist IMHO nicht der beste Weg, aber sehr übersichtlich.
type
TType = (typeInt, typeBool, typeString); type TMyRecord = record Typ: TType; Data: String; end; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private MyRecord: Array of TMyRecord; public function machBool(meinWert: String):String; end; // [...] procedure TForm1.FormCreate(Sender: TObject); var i: Integer; begin setlength(MyRecord, 3); MyRecord[0].Typ:=TypeInt; MyRecord[0].Data:='65'; MyRecord[1].Typ:=TypeString; MyRecord[1].Data:='65'; MyRecord[2].Typ:=TypeBool; MyRecord[2].Data:='65'; for i:=0 to high(MyRecord) do begin case MyRecord[i].Typ of TypeInt: showmessage(MyRecord[i].Data); TypeString: showmessage(Chr(StrToInt(MyRecord[i].Data))); // Okay, ist momentan eher ein Char statt ein String ;) TypeBool: showmessage(machBool(MyRecord[i].Data)); end; end; end; function TForm1.machBool(meinWert: String):String; begin if meinWert = '0' then Result:='false' else Result:='true'; end; MfG Tonic |
Re: Object zur Laufzeit generieren
Ist dazu nicht der Typ: Variant da :?:
|
Re: Object zur Laufzeit generieren
Es hilft dir nur nicht, wenn du zwar den Wert der Variablen aufnehmen kannst, jedoch nicht weisst wie du ihn interprätieren musst. Von daher kannst du zwar deine Daten in einem Variant speichern, bist aber keinen Schritt weiter. Und wenn du jedes Mal wenn du auf den Wert zugreifen willst erst ne prüfroutine durchlaufen lassen willst, kannst du auch den Typ mitschleppen. Variants sind IMHO nur sinnvoll wenn du nicht weisst, was du als Ergebnis aus einer Routine erwartest.
Du kannst in meinem beispiel Statt String natürlich Variant einsetzen. Aber dass ich den String nur aus Veranschaulichkeits-Gründen benutzt habe hatte ich ja dazu geschrieben. |
Re: Object zur Laufzeit generieren
Hallo Tonic1024,
sieht mal in der OH unter VarType() nach. Ich stimme Kroko1999 zu: eine Variable vom Typ Variant speichert sehr wohl den Typ der Daten, die sie darställt ;) |
Re: Object zur Laufzeit generieren
Ich mag es nicht wirklich gerne, wenn ein anderer Ansatz als falsch dargestellt wird *quengel* :wink:
Also. Im Prinzip habt ihr ja recht, aber mit VarAsType kannst du jede Menge Unfug machen und im Prizip ist es nichts Anderes als mein Vorschlag. Und genau das hatte ich mit der Prüfungsroutine gemeint, hatte nur das Schlagwort nicht parat... Ich hab auch nicht behauptet, das dies die einzige lösung ist, gell :wink: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:40 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