Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Record zur Laufzeit auflösen .... (https://www.delphipraxis.net/61442-record-zur-laufzeit-aufloesen.html)

gbl 21. Jan 2006 14:55


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:
TRECORD1 = record
    value1: byte;
    value2: integer;
    value3: string;
  end;

TRECORD2 = record
    value1: string;
    value2: longint;
    value3: TDateTime;
  end;
erreichen möchte ich:

Delphi-Quellcode:
procedure SAVE(daten: DATENTYP?);
begin
  { Dieser Code kann den DATENTYP und dessen Struktur erkennen }
  // Send Parameter to API
end;
hoffe das somit alles klar ist.

Bernhard Geyer 21. Jan 2006 15:07

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.

Mystic 21. Jan 2006 15:10

Re: Record zur Laufzeit auflösen ....
 
Kann man nicht einfach einen untypisierten Parameter verwenden? Also à la

Delphi-Quellcode:
procedure Save(var Data);

gbl 21. Jan 2006 15:32

Re: Record zur Laufzeit auflösen ....
 
Zitat:

Delphi-Quellcode:
procedure Save(var Data);

klingt interessant.
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.

dizzy 21. Jan 2006 15:47

Re: Record zur Laufzeit auflösen ....
 
Zitat:

Zitat von gbl
PS: ich verwende "absichtlich" keinerlei Klassen.

Und aus genau diesem Grund kannst du nicht nachher herausfinden von welchem Typ dein Parameter ist :P. Für Records wird diese Info - im Gegensatz zu Klassen - nicht mitgeführt. Deine einzige Chance: Ein 2. Parameter über den du dir den Typ codierst. Nur schön ist das nicht wirklich...

Mystic 21. Jan 2006 15:50

Re: Record zur Laufzeit auflösen ....
 
Wenn die Records unterschiedlich groß sind könntest du auf ihre Größe überprüfen.

sniper_w 21. Jan 2006 16:27

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:
type
  basis = packed record
  recID:Cardinal;
  end;

  datatyp1 = packed record
  recID:Cardinal;
  ...
  end;
recID wird dann folgender massen abgefragt:
Delphi-Quellcode:
procedure procname(var mydata);
begin
  case basis(mydata).recID of
  ...
  end;
end;
Wenn recID ein string sein sollte dann bitte mit einer festen Grösse, zb recID:string[20];


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:15 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