Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Einem Set einen Enum zuweisen? (https://www.delphipraxis.net/193660-einem-set-einen-enum-zuweisen.html)

Glados 27. Aug 2017 08:30

Einem Set einen Enum zuweisen?
 
Gegeben ist ein Enum und ein Set davon:
Delphi-Quellcode:
 TDataEnum = (tdHouse, tdCar);
 TDataSet = set of TDataEnum;
Nun habe ich in einer Funktion eine Variable (im Kopf, als Parameter) vom Typ
Delphi-Quellcode:
TDataSet
Ich prüfe, ob das Set leer ist mit
Delphi-Quellcode:
if aDataSet = []
und danach füge ich Standardwerte hinzu.
Aktuell so
Delphi-Quellcode:
aDataSet := [tdHouse, tdCar];
Hier habe ich nun doppelten Code. Einmal bei der Zuweisung in der Funktion in einmal in der Deklaration ganz oben.

Kann man aDataSet nicht irgendwie die Hauptdeklaration (TDataEnum = ...) zuweisen, um das zu vermeiden?

DeddyH 27. Aug 2017 08:35

AW: Einem Set einen Enum zuweisen?
 
Ich habe das jetzt 4 mal gelesen, aber immer noch nicht verstanden. Willst Du Deinem Funktionsargument einen Standardwert zuweisen, oder worum geht es genau?

jaenicke 27. Aug 2017 08:38

AW: Einem Set einen Enum zuweisen?
 
Nein, du hast in der Deklaration ja nur die möglichen Werte definiert.

Du kannst aber eine Konstante vom Typ TDataSet für alle möglichen Werte anlegen und diese dann im Code verwenden.

Nebenbei:
TDataSet war nur ein Beispiel, oder? Den Typ gibt es ja schon in Delphi.

Glados 27. Aug 2017 08:59

AW: Einem Set einen Enum zuweisen?
 
TDataSet war nur ein Beispiel.
Ich habe das jetzt mit der Konstante umgesetzt.
Jetzt habe ich zwar auch quasi doppelten Code, dafür aber nur einmal und das in derselben Unit an derselben Stelle statt wild verstreut.

Danke.

Uwe Raabe 27. Aug 2017 09:12

AW: Einem Set einen Enum zuweisen?
 
Um Fehler bei späteren Erweiterungen zu vermeiden, mache ich das in der Regel so:

Delphi-Quellcode:
type
  TDataEnum = (tdHouse, tdCar);
  TDataSet = set of TDataEnum;

const
  cDataSetAll: TDataSet = [Low(TDataEnum)..High(TDataEnum)];

Glados 27. Aug 2017 09:14

AW: Einem Set einen Enum zuweisen?
 
Das ist noch besser. Ich hatte es bis gerade eben noch so (was wohl nicht gut ist)
Delphi-Quellcode:
type
  TDataEnum = (tdHouse, tdCar);
  TDataSet = set of TDataEnum;

const
  cDataSetAll: TDataSet = [tdHouse, tdCar];

himitsu 27. Aug 2017 09:46

AW: Einem Set einen Enum zuweisen?
 
Delphi-Quellcode:
TDataSet = set of (tdHouse, tdCar);


Du hast eine Definition für einen ENUM (eine Liste mit verschiedenen Namen/Werten), aber ein ENUM kann immer nur einen dieser Werte speichern.
Und du hast eine Definition für ein SET, dass mehrere ENUMS speichern kann.

Es ist zwar auch möglich ENUM und SET zusammen zu definieren, aber es ist so nicht möglich eine Variable für nur einen ENUM zu deklarieren, da DU nicht an den eingebetteten ENUM-Typen ran kommst.


PS: Delphi-Referenz durchsuchenTDataSet

[EDIT]
Jetzt hab ich's auch falsch verstanden.


Delphi-Quellcode:
aDataSet := TDataSet(-1);
hier sind nun alle deine ENUMs gesetzt und auch der freie Speicher, da das SET ja auf die Größe des nächstgrößeren Datentypen für die Speicherung "aufgerundet" wurde (Byte, Word, LongWord oder UInt64).

Glados 27. Aug 2017 09:58

AW: Einem Set einen Enum zuweisen?
 
Zitat:

PS: Delphi-Referenz durchsuchenTDataSet
Zitat:

TDataSet war nur ein Beispiel.
Ich habe es so gelößt wie Uwe vorgeschlagen hat
Delphi-Quellcode:
type
  TDataEnum = (tdHouse, tdCar);
  TDataSet = set of TDataEnum;

const
  cDataSetAll: TDataSet = [Low(TDataEnum)..High(TDataEnum)];
Zitat:

hier sind nun alle deine ENUMs gesetzt und auch der freie Speicher,
Alles was den Speicher angeht, ist mir ehrlich gesagt herzlich egal.
Ob das jetzt 1 Byte oder 1 KByte mehr verbraucht oder weniger: wir sind in 2017 und nicht mehr in 198X.
Bei Unterschieden von 100MB mehr oder weniger könnte ich das noch verstehen, aber nicht im Bereich von Byte zu maximal Kbyte.

Uwe Raabe 27. Aug 2017 10:37

AW: Einem Set einen Enum zuweisen?
 
Zitat:

Zitat von himitsu (Beitrag 1379581)
Delphi-Quellcode:
aDataSet := TDataSet(-1);

[dcc32 Fehler] Unit208.pas(38): E2089 Ungültige Typumwandlung

himitsu 27. Aug 2017 11:48

AW: Einem Set einen Enum zuweisen?
 
Hmmmm, war mir sicher, dass es sorum auch mal ging.

Delphi-Quellcode:
type
  TDataEnum = (tdHouse, tdCar);
  TDataSet = set of TDataEnum;

procedure TForm9.FormCreate(Sender: TObject);
var
  aDataSet: TDataSet;
begin
  Byte(aDataSet) := $FF; // Byte(-1)
end;

procedure TForm9.FormCreate(Sender: TObject);
var
  aDataSet: TDataSet;
  iDataSet: ShortInt absolute aDataSet;
begin
  iDataSet := -1;
  if tdHouse in aDataSet then
    Beep;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:06 Uhr.
Seite 1 von 3  1 23      

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