Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Delphi-Equivalent zur C-union (https://www.delphipraxis.net/48173-delphi-equivalent-zur-c-union.html)

Robert Marquardt 22. Jun 2005 11:26

Re: Delphi-Equivalent zur C-union
 
Es ist uebrigens kein Trick noetig um hinter den varianten Teil eines Records weitere Elemente zu platzieren.
Man deklariert den varianten Teil einfach als Element eines normalen Records, also Record in Record.

Delphi-Quellcode:
  TEinfachesRecord = record
    VariantesElement: record
      case Integer of
      ...
    end;
    WeiteresEinfachesElement: Integer;
  end;

BaumWollSchaf 22. Jun 2005 11:31

Re: Delphi-Equivalent zur C-union
 
@NicoDE

Dein Beitrag ist so ausführlich, den könntest du fast 1 zu 1 bei den Tutorials posten. ;)

NicoDE 22. Jun 2005 11:35

Re: Delphi-Equivalent zur C-union
 
Damit würde man aus einer unbenannten Union eine benannte Union machen (aus .Foo würde .VariantesElement.Foo werden). Das stört in den meisten Fällen nicht weiter, aber ist manchmal nicht erwünscht (Dokumentation, andere Sprachen mit gleichem Quelltext, etc.).

Zerolith 22. Jun 2005 12:47

Re: Delphi-Equivalent zur C-union
 
Wow - Danke @ Nico

Also heißt: Wenn ich eine Liste habe. Die z.B. aus lauter Records mit dieser "Union-Strukutr" besteht kann ich folgendes machen:

Delphi-Quellcode:
Liste[0].Index := 1; // Integer
Liste[0].Value := 'String';

Liste[1].Index := 2;
Liste[1].Value := 325;

Liste[2].Index := 3;
Liste[2].Value := TRUE;

Liste[3].Index := 4;
Liste[3].Value := '2005-05-15 15:00:42';

NicoDE 22. Jun 2005 13:06

Re: Delphi-Equivalent zur C-union
 
Zitat:

Zitat von Zerolith
Also heißt: Wenn ich eine Liste habe. Die z.B. aus lauter Records mit dieser "Union-Strukutr" besteht kann ich folgendes machen:
Delphi-Quellcode:
Liste[0].Index := 1; // Integer
Liste[0].Value := 'String';
Liste[1].Index := 2;
Liste[1].Value := 325;
Liste[2].Index := 3;
Liste[2].Value := TRUE;
Liste[3].Index := 4;
Liste[3].Value := '2005-05-15 15:00:42';

Die Frage ist, als was .Value deklariert ist. Da Delphi typsicher ist, dürfte die Zuweisung nicht funktionieren.

Eine Lösung könnte so aussehen (obwohl ich die Problemstellung eher mit Klassen oder Variants lösen würde):
Delphi-Quellcode:
type
  TListEntryType = (letAString, letInteger, letBoolean);
  TListEntry = record
    Idx: Integer;
    Typ: TListEntryType;
    Val: record
      case TListEntryType of
        letAString: (AsAString: AnsiString);
        letInteger: (AsInteger: Integer);
        letBoolean: (AsBoolean: Boolean);
    end;
  end;

//...

with Liste[0] do
begin
  Idx := 1;
  Typ := letAString;
  Val.AsAString := 'String';
end;
with Liste[1] do
begin
  Idx := 2;
  Typ := letInteger;
  Val.AsInteger := 325;
end;
with Liste[2] do
begin
  Idx := 3;
  Typ := letBoolean;
  Val.AsBoolean := True;
end;
with Liste[3] do
begin
  Idx := 4;
  Typ := letInteger; // falsch, aber möglich - Beispiel um Fehlerquellen aufzuzeigen :)
  Val.AsAString := '2005-05-15 15:00:42';
end;

Zerolith 22. Jun 2005 13:09

Re: Delphi-Equivalent zur C-union
 
Ich habe die Problemstellung mit Klassen und Variants gelößt - allerdings finde ich deine Lösung vom letzten post irgendwie simpler.

Oder hat die Sache einen Haken?

NicoDE 22. Jun 2005 13:14

Re: Delphi-Equivalent zur C-union
 
Zitat:

Zitat von Zerolith
Oder hat die Sache einen Haken?

Klassen sind sicher besser als Records.
Ich habe in den Code (vorheriger Beitrag) einen logischen Fehler eingebaut, um das Problem zu verdeutlichen :)

Zerolith 22. Jun 2005 13:15

Re: Delphi-Equivalent zur C-union
 
Verstehe...

Nochmals Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:43 Uhr.
Seite 2 von 2     12   

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