Index im Mengenset ermitteln
Index im Mengenset ermitteln
Hallo zusammen,
ist es möglich den Index eines einzelnen Bitfeldes im Mengenset zu ermitteln?
Beispiel: Nav_Button_Set : TDBNavButtonSet (Es kann auch jeder andere Mengentyp sein)
Nav_Button_Set := [ nbLast, nbNext, nbFirst, nbPrior ];
Somit sind die Indizes:
Index 0 = nbLast
Index 1 = nbNext
Index 2 = nbFirst
Index 3 = nbPrior
Nun möchte ich wissen an welcher stelle der Wert nbNext zu finden ist.
Ist so etwas überhaupt möglich?
Erreichen möchte ich damit, das die Reihenfolge der zu erstellenden Komponenten so erfolgt, wie in der Zuweisung angegeben ist.
Viele Grüße
Lorca
ist es möglich den Index eines einzelnen Bitfeldes im Mengenset zu ermitteln?
Beispiel: Nav_Button_Set : TDBNavButtonSet (Es kann auch jeder andere Mengentyp sein)
Nav_Button_Set := [ nbLast, nbNext, nbFirst, nbPrior ];
Somit sind die Indizes:
Index 0 = nbLast
Index 1 = nbNext
Index 2 = nbFirst
Index 3 = nbPrior
Nun möchte ich wissen an welcher stelle der Wert nbNext zu finden ist.
Ist so etwas überhaupt möglich?
Erreichen möchte ich damit, das die Reihenfolge der zu erstellenden Komponenten so erfolgt, wie in der Zuweisung angegeben ist.
Viele Grüße
Lorca
Re: Index im Mengenset ermitteln
Soweit ich weiss, interessiert sich das Set nicht für die Reihenfolge.
Die zugrundeliegende Aufzählung hat natürlich eine Reihenfolge, die man mit Ord herausfinden kann.
Die zugrundeliegende Aufzählung hat natürlich eine Reihenfolge, die man mit Ord herausfinden kann.
Code: Alles auswählen
TDBNavButtonType = (nbFirst, nbPrior, nbNext, nbLast, nbInsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh);
Caption:=inttostr(Ord(nbNext));
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1645
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Index im Mengenset ermitteln
Geht auch mit einem einfachen Cast writeln(Integer(nbNext))
Re: Index im Mengenset ermitteln
Das macht's aber auch nicht besser...fliegermichl hat geschrieben: Do 25. Aug 2022, 12:05 Geht auch mit einem einfachen Cast writeln(Integer(nbNext))

- Jorg3000
- Lazarusforum e. V.
- Beiträge: 359
- Registriert: So 10. Okt 2021, 10:24
- OS, Lazarus, FPC: Win64
- Wohnort: NRW
Re: Index im Mengenset ermitteln
Hi!
Falls es nicht zwingend ein echtes Set sein muss, könnte man es mit einem String oder Array nachbauen.
Funktioniert wegen möglicher UTF8-Kodierung aber nur mit max. 127 verschiedenen Aufzählungswerten.
Code nicht getestet ...
Falls es nicht zwingend ein echtes Set sein muss, könnte man es mit einem String oder Array nachbauen.
Funktioniert wegen möglicher UTF8-Kodierung aber nur mit max. 127 verschiedenen Aufzählungswerten.
Code nicht getestet ...
Code: Alles auswählen
procedure AddValue(aValue: TAufzaehlungsTyp; var aSet: String);
var c: Char;
begin
c:=Chr(Ord(aValue));
if Pos(c,aSet)<=0 then aSet:=aSet+c;
end;
function GetPos(aValue: TAufzaehlungsTyp; const aSet: String): Integer;
var c: Char;
begin
c:=Chr(Ord(aValue));
Result:=Pos(c,aSet);
end;
Re: Index im Mengenset ermitteln
Lösungen gibt es viele.
Z.B.
Z.B.
Code: Alles auswählen
uses fgl;
...
type
TDBNavButtonTypeList = specialize TFPGList<TDBNavButtonType>;
...
var
DBTypeList:TDBNavButtonTypeList;
...
begin
DBTypeList:=TDBNavButtonTypeList.Create;
DBTypeList.Add(nbFirst);
DBTypeList.Add(nbEdit);
DBTypeList.Add(nbNext);
writeln(DBTypeList.IndexOf(nbNext));
end;
Re: Index im Mengenset ermitteln
Hallo zusammen,
danke für eure Antworten.
Der einzige hier aufgeführte Trick der funktionieren könnte, ist der von Theo mit seiner TDBNavButtonTypeList.
Leider funzen die anderen Ideen nicht. Denn wenn mit ORD der Index ermittelt wird, erhält man nicht den Index im Parameter, sondern immer den Ordinalwert in der Definition des Mengenset.
Also
TDBNavButtonType = ( nbFirst, nbPrior, nbNext, nbLast ... )
Hierbei ist nbFirst immer 0, nbPrior immer 1 ....
Das war jedoch nicht die Frage.
Egal, ich habe mir so etwas schon gedacht. Hatte jedoch die Hoffnung das es da einen praktikablen Trick gibt.
Dennoch, danke für eure freundlichen Ideen und Gedanken
Viele Grüße
Lorca
danke für eure Antworten.
Der einzige hier aufgeführte Trick der funktionieren könnte, ist der von Theo mit seiner TDBNavButtonTypeList.
Leider funzen die anderen Ideen nicht. Denn wenn mit ORD der Index ermittelt wird, erhält man nicht den Index im Parameter, sondern immer den Ordinalwert in der Definition des Mengenset.
Also
TDBNavButtonType = ( nbFirst, nbPrior, nbNext, nbLast ... )
Hierbei ist nbFirst immer 0, nbPrior immer 1 ....
Das war jedoch nicht die Frage.
Egal, ich habe mir so etwas schon gedacht. Hatte jedoch die Hoffnung das es da einen praktikablen Trick gibt.
Dennoch, danke für eure freundlichen Ideen und Gedanken
Viele Grüße
Lorca
-
- Beiträge: 955
- Registriert: Mi 3. Jun 2020, 07:18
- OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
- CPU-Target: Aarch64 bis Z80 ;)
- Wohnort: München
Re: Index im Mengenset ermitteln
Der Wert des Enums ist der Index des dazugehörigen Bits im Bitfeld des Sets. Etwas anderes gibt es nicht. Ein Set ist einfach nur ein Bitfeld. Ansonsten gibt es in einem Set keinerlei Ordnung.Lorca hat geschrieben: Fr 26. Aug 2022, 08:39 Leider funzen die anderen Ideen nicht. Denn wenn mit ORD der Index ermittelt wird, erhält man nicht den Index im Parameter, sondern immer den Ordinalwert in der Definition des Mengenset.
Also
TDBNavButtonType = ( nbFirst, nbPrior, nbNext, nbLast ... )
Hierbei ist nbFirst immer 0, nbPrior immer 1 ....
Das war jedoch nicht die Frage.
FPC Compiler Entwickler
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1645
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Index im Mengenset ermitteln
Die Frage war wohl etwas missverständlich gestellt.
Ich schätze, was er meinte war, daß wenn das Set als Parameter übergeben wird, er die Position ermitteln kann.
Das geht meines Wissens nicht. Die aufgerufene Prozedur bekommt immer den Typ des Sets mit den festgelegten Bitpositionen übergeben
und dann spielt es auch keine Rolle in welcher Reihenfolge die Elemente des Sets angegeben werden.
[nbLast, nbFirst] = [nbFirst, nbLast]
Edit: Ich habe es gerade ausprobiert und es ist tatsächlich so wie ich geschrieben hatte.
Ich schätze, was er meinte war, daß wenn das Set als Parameter übergeben wird, er die Position ermitteln kann.
Das geht meines Wissens nicht. Die aufgerufene Prozedur bekommt immer den Typ des Sets mit den festgelegten Bitpositionen übergeben
und dann spielt es auch keine Rolle in welcher Reihenfolge die Elemente des Sets angegeben werden.
[nbLast, nbFirst] = [nbFirst, nbLast]
Edit: Ich habe es gerade ausprobiert und es ist tatsächlich so wie ich geschrieben hatte.
Re: Index im Mengenset ermitteln
Im Prinzip ist es ja schon aus der Mathe klar.
Auch Include sieht keine Positionsangabe vor.
Typinfo-Tricks helfen auch nicht. Die Ordnung ist nicht gespeichert.
Hoffe, das ist jetzt erschöpfend geklärt.
Bin kein Mathematikexperte, habe nur kurz auf Wiki nachgelesen.Wiki hat geschrieben:Bei der Bildung einer Menge geht es ausschließlich um die Frage, welche Elemente in ihr enthalten sind.
...
Beim Begriff der Menge bleibt außer Betracht, ob es unter den Elementen zusätzlich irgendeine Ordnung geben könnte, Mengen sind zunächst ungeordnete Gebilde.
https://de.wikipedia.org/wiki/Menge_(Mathematik)
Auch Include sieht keine Positionsangabe vor.
Typinfo-Tricks helfen auch nicht. Die Ordnung ist nicht gespeichert.
Hoffe, das ist jetzt erschöpfend geklärt.

-
- Beiträge: 153
- Registriert: Sa 30. Jan 2010, 18:17
- OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: Index im Mengenset ermitteln
Ich denke, was Lorca möchte ist am besten mit einem Array zu erledigen.
Code: Alles auswählen
type tNavButtons = (nbLast, nbNext, nbFirst, nbPrior);
procedure DisplayNavButtons(theButtons : Array of tNavButtons);
var i : Integer;
begin
for i := Low(theButtons) to High(theButtons) do begin
//DoSomethingWith(theButtons[i]); oder
//case theButtons[i] of
// nbLast : ...;
// nbNext : ...;
//end;
end;
end;
begin
DisplayNavButtons([nbFirst, nbNext, nbLast]);
end.
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1645
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Index im Mengenset ermitteln
Ja, das geht.