Index im Mengenset ermitteln

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Index im Mengenset ermitteln

Beitrag von Lorca »

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

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Index im Mengenset ermitteln

Beitrag von theo »

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.

Code: Alles auswählen

 TDBNavButtonType = (nbFirst, nbPrior, nbNext, nbLast, nbInsert, nbDelete, nbEdit, nbPost, nbCancel, nbRefresh);   
 Caption:=inttostr(Ord(nbNext));   

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
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

Beitrag von fliegermichl »

Geht auch mit einem einfachen Cast writeln(Integer(nbNext))

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Index im Mengenset ermitteln

Beitrag von theo »

fliegermichl hat geschrieben:
Do 25. Aug 2022, 12:05
Geht auch mit einem einfachen Cast writeln(Integer(nbNext))
Das macht's aber auch nicht besser... :lol:

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 168
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Index im Mengenset ermitteln

Beitrag von Jorg3000 »

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 ...

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;

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Index im Mengenset ermitteln

Beitrag von theo »

Lösungen gibt es viele.

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;

Lorca
Beiträge: 196
Registriert: Di 3. Nov 2020, 12:25

Re: Index im Mengenset ermitteln

Beitrag von Lorca »

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

PascalDragon
Beiträge: 825
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

Beitrag von PascalDragon »

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.
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.
FPC Compiler Entwickler

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
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

Beitrag von fliegermichl »

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.

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Index im Mengenset ermitteln

Beitrag von theo »

Im Prinzip ist es ja schon aus der Mathe klar.
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)
Bin kein Mathematikexperte, habe nur kurz auf Wiki nachgelesen.

Auch Include sieht keine Positionsangabe vor.
Typinfo-Tricks helfen auch nicht. Die Ordnung ist nicht gespeichert.

Hoffe, das ist jetzt erschöpfend geklärt. :wink:

Thandor
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

Beitrag von Thandor »

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.            

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
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

Beitrag von fliegermichl »

Ja, das geht.

Antworten