Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Set-Typ in einer Zahl speichern


wulfskin - Di 04.03.03 20:55
Titel: Set-Typ in einer Zahl speichern
Hallo!

Ich habe mal wieder ein kleines Problem: Ich würde gerne einzelne Optionen in einer Integer-Variablen speichern, so wie zum Beispiel der 2. Parameter Attr der Funktion FindFirst. Ich weiss net so recht wie ich es erklären soll, deshalb nenne ich jetzt ein Beispiel: In einer Garage dürfen 3 Autotypen stehen: Audi, BMW, Ford. Wie muss ich jetzt die Integerwerte für diese 3 Konstanten wählen, damit ich nachher überprüfen kann, welche Autos in der Garage stehen:

Quelltext
1:
2:
3:
4:
5:
  aAudi = x;
  aBMW = y;
  aFord = z;
  
  if (AUTOS and aAudi) > 0 ....
Ich hoffe ich habt mich verstanden, ich wusste nicht wirklich wie ich es erklären sollte. Für den Titel ist mir auch nix besseres eingefallen, sorry deshalb...

Gruß wulfskin!


Keldorn - Di 04.03.03 21:12

Hallo

meisnt du sowas?

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure TForm1.Button1Click(Sender: TObject);
type Tauto = (BMW,Audi,Ford);
Var auto:TAuto;
begin
  auto:=BMW;
  if auto=BMW then
    begin
      beep;
    end;
end;

oder für mehrere Möglichkeiten

procedure TForm1.Button2Click(Sender: TObject);
type Tauto = set of (BMW,Audi,Ford);
Var auto : Tauto;
begin
  auto:=[BMW,Ford];
  if Bmw in auto then
    begin
      beep;
    end;
end;



Mfg Frank


mars - Di 04.03.03 21:19

Ich bin mir auch nicht sicher, ob ich dich verstanden habe..Meinst du vielleicht, dass man mit einer Zahl alleine mehrere Boolean-Werte miteinander darstellen kann? Das würde folgendermassen gelöst:
BMW: 1
Audi: 2
Ford: 4
...: 2^x

Beispiel: (BMW and FORD) = 5

Hoffe ich habe dich richtig verstanden...


wulfskin - Di 04.03.03 21:37

Danke Mars!
Genau das meinte ich! Mal schauen ob es bei mir klappt..!


maximus - Di 04.03.03 22:35

IMHO arbeiten sets intern genauso.

Wenn dein problem ist, es als integer haben zu wollen, kannst auch...


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type Tauto = set of (BMW,Audi,Ford); 
Var auto:TAuto;  
      i : integer;
begin 
  auto:= [BMW,Ford];
  i := word(auto);
  showMessage(intToStr(i));
end;


...kannst dann sogar aus dem werten den enum-namen als string ableiten:


Quelltext
1:
2:
3:
uses typInfo;
...
s := GetEnumName(TypeInfo(TAuto), i);

Sets haben halt besseren service :wink:

mfg mx.


mars - Mi 05.03.03 13:27

Hab ich das jetzt richtig verstanden: Elemente in Sets haben eine Reihenfolge? Das würde sich doch mit ihrer Definition widersprechen...
Genau weil sie keine Reihenfolge haben, kann man doch auch nicht mehrere gleiche Objekte einfügen...
Oder habe ich da etwas absolut missverstanden?


maximus - Mi 05.03.03 16:02

Zitat:
Oder habe ich da etwas absolut missverstanden?

Ja...aber nur das mit der Reihenfolge! Sets haben keine Reihenfolge...ich denke jedes Flag (wert) hat ein bit, das anzeigt, ob es sich im set befindet oder nicht! So gesehen haben die bits ne reihenfolge, aber das liegt in der natur der sache :wink:

Wie kommst du jetzt eigentlich drauf?


mars - Mi 05.03.03 23:39

Ich hab nur letzthin mit Sets gearbeitet bis mir am Schluss eingefallen ist, dass eine Reihenfolge der Elemente nicht schlecht wäre :wink:
Ich musste dann auf eine TObjectList umsteigen...


maximus - Do 06.03.03 12:11

Zitat:
Ich musste dann auf eine TObjectList umsteigen...

Das versteh ich jetzt wieder nicht...was haben sets mit objekten zu tun?


PS: Mir ist dort oben ein kleiner fehler unterlaufen...Ich kann den Enum-namen natürlich nur aus nem EnumTyp-wert ableiten und nicht aus nem set:

Quelltext
1:
2:
3:
4:
5:
uses typInfo; 
... 
typ TAuto = (AUDI, BMW, VW);
...
s := GetEnumName(TypeInfo(TAuto),Word(BMW));


mars - Do 06.03.03 13:35

maximus hat folgendes geschrieben:

Das versteh ich jetzt wieder nicht...was haben sets mit objekten zu tun?


Nicht viel, deshalb bin ich ja auch umgestiegen... :D