![]() |
Durch Enum-Set iterieren?
Ich stehe gerade auf dem Schlauch. Wie iteriert man durch einen Enum?
Aufruf
Delphi-Quellcode:
Funktion
// TStreetTypeSet = set of TStreetType;
// StreetTypeSet: TStreetTypeSet; s := GetSetAsString<TStreetType>(StreetTypeSet, ','));
Delphi-Quellcode:
function GetSetAsString<T>(const EnumSet: T; Separator: string): string;
var i: Integer; begin Result := ''; for i := Low(T) to High(T) do begin Result := Result + EnumSet(i) + Separator; end; end; |
AW: Durch Enum-Set iterieren?
So wird das nicht gehen, da man ein Set nicht als Constraint für das <T> angeben kann.
Mal abgesehen davon, kann ich noch nicht den Sinn dieser Funktion verstehen. Vielleicht holst du mal etwas weiter aus und beschreibst die eigentliche Problemstellung. |
AW: Durch Enum-Set iterieren?
Delphi-Quellcode:
TMyEnum = (ONE, TWO, THREE);
TMyEnums = set of TMyEnum; procedure DoIterate(AEnums: TMyEnums); var my: TMyEnum; begin for my in AEnums do begin // do smt. with "my" end; end; ... DoIterate([ONE, TWO]); |
AW: Durch Enum-Set iterieren?
Guckstu
![]() |
AW: Durch Enum-Set iterieren?
Zitat:
Zitat:
Bin ich zu doof dafür? Zitat:
Delphi-Quellcode:
function GetSetAsString<T>(const EnumSet: T): string;
begin Result := SetToString(TypeInfo(T), EnumSet, True); end; |
AW: Durch Enum-Set iterieren?
Wie schon gesagt: Vergiss den generischen Ansatz und schreib direkt den SetToString-Aufruf.
|
AW: Durch Enum-Set iterieren?
Geht das mit generischem Ansatz gar nicht?
Ich hätte das sehr gerne in einer eigenen Unit, wo eh schon zig Enum-Sachen (generisch) drin sind. Ich weiß halt nicht was genau ich falsch mache aber dsas hier funktioniert auch nicht
Delphi-Quellcode:
Delphi 10.3.3.
// TStreetTypeSet = set of TStreetType;
// StreetTypeSet: TStreetTypeSet; showmessage( SetToString(TypeInfo(TStreetTypeSet), StreetTypeSet, True) ); // [dcc32 Fehler] Form.pas(317): E2250 Es gibt keine überladene Version von 'SetToString', die man mit diesen Argumenten aufrufen kann |
AW: Durch Enum-Set iterieren?
Delphi-Quellcode:
SetToString(PTypeInfo(TypeInfo(TStreetTypeSet)), @StreetTypeSet, True)
|
AW: Durch Enum-Set iterieren?
Vielen Dank. Meine zwei Funktionen sehen nun so aus. Ein erster Test von Set zu String und zurück von String zu Set hat funktioniert.
Delphi-Quellcode:
Ich speichere Sets aktuell als Integer-Wert. Das ist mir aber zu unsicher, sollte ich mal an der Benutzeroberfläche etwas ändern, sind die Integer-Werte nutzlos.
function SetToStr<T>(Value: T; Brackets: Boolean): string;
begin Result := SetToString(PTypeInfo(TypeInfo(T)), @Value, True); end; function StrToSet<T>(Value: string): T; begin StringToSet(PTypeInfo(TypeInfo(T)), Value, @Result); end; // X: TMySet; // S: string; // X := [a, b c]; // S := SetToStr<TMySet>(X, True); // ShowMessage(S); // // X := StrToSet<TMySet>('[a, b]'); // S := SetToStr<TMySet>(X, True); // showmessage(S); |
AW: Durch Enum-Set iterieren?
Wie schon erwähnt, gibt es Methoden, um ENUMs und SETs in einen String zu konvertieren.
Aber das knallt natürlich auch andersrum, also wenn du Werte umbenennst oder löschst. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz