Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Set mit voller Menge initialisieren (https://www.delphipraxis.net/135023-set-mit-voller-menge-initialisieren.html)

Codewalker 3. Jun 2009 11:49


Set mit voller Menge initialisieren
 
Angenommen ich definiere mir ein Set in Delphi
Delphi-Quellcode:
type
TMeinSetElement = (elEins, elZwei, elDrei);
TMeinSet = set of TMeinSetElement;
und ich möchte ein Variable immer mit dem vollen Set initialisieren - auch wenn ich nachträglich mal ein Element hinzudefiniere. Natürlich geht:
Delphi-Quellcode:
var x: TMeinSet;
begin
 x := [elEins, elZwei, elDrei];
aber hier müsste ich ja jedesmal von Hand anpassen. Habe schon ein
Delphi-Quellcode:
var x: TMeinSet;
begin
 x := not [];
versucht, aber das ist so nicht erlaubt. Kennst jemand einen Trick, das zu bewerkstelligen?

himitsu 3. Jun 2009 11:57

Re: Set mit voller Menge initialisieren
 
Delphi-Quellcode:
x := [Low(TMeinSetElement)..High(TMeinSetElement)];
geht aber nur, wenn die Werte des Sets nicht mit anderem Index vordefiniert sind.

also mit diesem Set würde auch die "2" (Drei) mit gesetzt
Delphi-Quellcode:
TMeinSetElement = (elEins, elZwei, elVier=3);
blöd ist aber, das die RTTI bei solchens Sets wichtige Infos (vorallem jene über die enthaltenen Werte des Sets) nicht speichert und man dann auch darüber nicht gehen könnte :wall:
(leidliche Erfahrung seitens der Entwicklung der Serialize-Funktionen in himXML)

[edit] TMeinSet durch TMeinSetElement ersetzt ... siehe Post drunter

jbg 3. Jun 2009 12:01

Re: Set mit voller Menge initialisieren
 
Zitat:

Zitat von himitsu
Delphi-Quellcode:
x := [Low(TMeinSet)..High(TMeinSet)];

Du meintest wohl
Delphi-Quellcode:
x := [Low(TMeinSetElement)..High(TMeinSetElement)];
Der Set-Elementtyp sollte in diesem Fall aber keine Lücken aufweisen wie z.B. "type TMySetElement = (A = 0, B = 2, C = 100);"

Codewalker 3. Jun 2009 13:13

Re: Set mit voller Menge initialisieren
 
Danke, das mit dem Low..High ist ja schonmal ein Anfang. Irgendwie blöd gemacht, dass es dazu kein "richtiges" Konstrukt gibt, wie halt "not []" - wäre mal ein Verbesserungsvorschlag ;-)

Reinhard Kern 3. Jun 2009 16:11

Re: Set mit voller Menge initialisieren
 
Zitat:

Zitat von Codewalker
Angenommen ich definiere mir ein Set in Delphi
Delphi-Quellcode:
type
TMeinSetElement = (elEins, elZwei, elDrei);
TMeinSet = set of TMeinSetElement;
und ich möchte ein Variable immer mit dem vollen Set initialisieren - ...
Kennst jemand einen Trick, das zu bewerkstelligen?

Hallo, wie wärs mit FillChar (x, SizeOf (TMeinSet), $FF); ?

Gruss Reinhard

Muetze1 3. Jun 2009 16:18

Re: Set mit voller Menge initialisieren
 
bzw.
Delphi-Quellcode:
integer(setvar) := -1;
, nur das geht nur bist zu einer grösse von 32 Elementen.

himitsu 3. Jun 2009 17:16

Re: Set mit voller Menge initialisieren
 
Zitat:

Zitat von Muetze1
bzw.
Delphi-Quellcode:
integer(setvar) := -1;
, nur das geht nur bist zu einer grösse von 32 Elementen.

geht nur, wenn das Set die Größe von Integer hat (oder man nimmt einen passenden Integertyp dafür) :angel2:

und der Code, welcher dieses Set dann verarbeit, damit klar kommt, wenn dort auch "ungenutzte" Bits/Werte gesetzt sind.

Namenloser 3. Jun 2009 18:45

Re: Set mit voller Menge initialisieren
 
Zitat:

Zitat von Reinhard Kern
Hallo, wie wärs mit FillChar (x, SizeOf (TMeinSet), $FF); ?

Was passiert dann, wenn man Sets vergleicht?

himitsu 3. Jun 2009 20:34

Re: Set mit voller Menge initialisieren
 
Zitat:

Zitat von NamenLozer
Was passiert dann, wenn man Sets vergleicht?

Das Selbe wie bei Muetze1's Version ... es "knallt" :angel2:
Zitat:

Zitat von himitsu
und der Code, welcher dieses Set dann verarbeit, damit klar kommt, wenn dort auch "ungenutzte" Bits/Werte gesetzt sind.

Delphi-Quellcode:
Type TMeinSetElement = (elEins, elZwei, elDrei);
  TMeinSet = Set of TMeinSetElement;

Var A, B, C: TMeinSet;

Begin
  A := [Low(TMeinSetElement)..High(TMeinSetElement)];
  B := [elEins..elDrei];
  Byte(C) := $FF;
  If A = B Then MessageBox(0, 'A = B', '', 0);
  If A = C Then MessageBox(0, 'A = C', '', 0);

// "A = C" wird nie angezeigt

sx2008 4. Jun 2009 00:01

Re: Set mit voller Menge initialisieren
 
Edit: gelöscht, Vorschlag mit Fillchar war schon da.


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