![]() |
Record zur Laufzeit auflösen ....
Ich habe hier ein spezielles Problem das sich wie folgt darstellt.
Ich etwickle gerade eine CGI Anwendung(en). Innerhalb dieser Anwendung gibt es viele Punkte an denen Daten in einem File gespeichert werden. Diese Schnittstelle stammt von einem Dritthersteller. Ich möchte nun eine einzige PROCEDURE verwenden welche alle möglichen Daten übergeben bekommt und dann speichern kann. Diese Daten werden in einem RECORD verpackt. Dieses RECORD sieht pro Anwendung anders aus. Beispiel:
Delphi-Quellcode:
erreichen möchte ich:
TRECORD1 = record
value1: byte; value2: integer; value3: string; end; TRECORD2 = record value1: string; value2: longint; value3: TDateTime; end;
Delphi-Quellcode:
hoffe das somit alles klar ist.
procedure SAVE(daten: DATENTYP?);
begin { Dieser Code kann den DATENTYP und dessen Struktur erkennen } // Send Parameter to API end; |
Re: Record zur Laufzeit auflösen ....
Das geht so nicht.
Du könntest folgendes machen: Du definierst dir eine Basisklasse mit einer Load und Save-Methode. Für jeden speziellen Record-Typ leidest Du eine Klasse ab welche alle benötigten Info (evtl. als entsprechender Record-Typ) beinhaltet und die Methoden Load/Save überschreibt. Jetzt kannst Du natürlich überall in deinem Programm wo du mit entsprechender Referenz auf die Basisklasse arbeitest einfach die Load/Save-Methode aufrufen und es wird immer die passende Load/Save-Methode verwendet. |
Re: Record zur Laufzeit auflösen ....
Kann man nicht einfach einen untypisierten Parameter verwenden? Also à la
Delphi-Quellcode:
procedure Save(var Data);
|
Re: Record zur Laufzeit auflösen ....
Zitat:
Wie könnte ich nun feststellen von welchem Typ Data nun ist? Ein Durchprobieren würde zu Not auch reichen; wie etwa
Delphi-Quellcode:
if Data=Type of TRECORD1 then ...
if Data=Type of TRECORD2 then ... PS: ich verwende "absichtlich" keinerlei Klassen. |
Re: Record zur Laufzeit auflösen ....
Zitat:
|
Re: Record zur Laufzeit auflösen ....
Wenn die Records unterschiedlich groß sind könntest du auf ihre Größe überprüfen.
|
Re: Record zur Laufzeit auflösen ....
Ohne Klassen geht das seehr einfach. Und wie, glaubst du, wurde Quacke 3 entwickelt ? :zwinker:
Also, jeder RECORD müsste IMMER so ANFANGS definiert sein:
Delphi-Quellcode:
recID wird dann folgender massen abgefragt:
type
basis = packed record recID:Cardinal; end; datatyp1 = packed record recID:Cardinal; ... end;
Delphi-Quellcode:
Wenn recID ein string sein sollte dann bitte mit einer festen Grösse, zb recID:string[20];
procedure procname(var mydata);
begin case basis(mydata).recID of ... end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:58 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