![]() |
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; |
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. ;) |
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.).
|
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'; |
Re: Delphi-Equivalent zur C-union
Zitat:
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; |
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? |
Re: Delphi-Equivalent zur C-union
Zitat:
Ich habe in den Code (vorheriger Beitrag) einen logischen Fehler eingebaut, um das Problem zu verdeutlichen :) |
Re: Delphi-Equivalent zur C-union
Verstehe...
Nochmals Danke! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:52 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