![]() |
Enum gesetzt?
Hallo,
ich habe ne recht triviale Frage. Kann man in Delphi überprüfen, ob ein Enum gesetzt wurde? Ich habe folgenden Enum:
Code:
Und folgende Klasse:
Status = (aktiv,inaktiv)
Code:
Wenn ich mir nun über folgenden Code den Status als String anzeigen lassen möchte zeigt er mir immer "aktiv" an, obwohl ich den Wert händisch nicht gesetzt habe:
TMyClass = class(Tobject)
private FStatus: Status; published Status: Status read FStatus write FStatus end;
Code:
Kann mir diesbezüglich jemand weiterhelfen? Oder muss ich quasi immer einen DefaultWert als Enum-Option mit aufnehmen?
...
var: myClass: TMyClass; begin myClass = TMyClass.Create; ShowMessage(GetEnumName(TypeInfo(Status),Integer(myClass.Status))); myClass.Free; end; Vielen Dank. mc |
AW: Enum gesetzt?
Was hast Du erwartet? Private Felder werden AFAIK immer mit dem Wert initialisiert, der 0 entspricht (also 0, nil, Leerstring, etc.). Wenn Du einen abweichenden Enum-Wert vorbelegen möchtest, kannst Du das im Konstruktor Deiner Klasse tun.
|
AW: Enum gesetzt?
active ist ORD 0, Klassenvariablen werden immer mit 0 initialisiert, Du könntest gegf. noch ein undefined vor Dein active einbauen ....
|
AW: Enum gesetzt?
Vielen Dank für eure Antworten.
@Bummi: sponatan hätte ich es auch so gelöst. @DeddyH: wie setzte ich im Constructor den ein Enumeigenschaft auf einen abweichenden Enum-Wert? |
AW: Enum gesetzt?
Delphi-Quellcode:
That' s all.
constructor TMyClass.Create;
begin FStatus := inaktiv; end; |
AW: Enum gesetzt?
Oder, noch einfacher:
Code:
(In der Annahme, dass "inaktiv" als "Voreinstellung" gelten soll)
Status = (inaktiv,aktiv)
|
AW: Enum gesetzt?
Ach jetzt verstehe ich dich, ich dachte du meinst mit abweichenden Enum-Wert einen Wert, der nicht in der Aufzählung enthalten ist. Hab mich schon gewundert, das würde ja eigentlich dem ganzen System des Enums widersprechen.
Dann muss ich wohl einen "undefined" als Kennzeichnung einfügen. Vielen Dank euch. |
AW: Enum gesetzt?
Wenn du wissen willst, ob was gesetzt wurde, dann mußt du dir dieses auch "zusätzlich" merken.
Oder du führst einen weiteren Status ein.
Delphi-Quellcode:
Alternativ mal in die TStringList schauen, welches mehrfach Version 1 implementiert hat:
type
Status = (nicht_gesetzt, aktiv, inaktiv);
Delphi-Quellcode:
type
TStringsDefined = set of (sdDelimiter, sdQuoteChar, sdNameValueSeparator, sdLineBreak, sdStrictDelimiter); TStrings = class(TPersistent) private FDefined: TStringsDefined; FLineBreak: string; function GetLineBreak: string; procedure SetLineBreak(const Value: string); public property LineBreak: string read GetLineBreak write SetLineBreak; end; function TStrings.GetLineBreak: string; begin if not (sdLineBreak in FDefined) then LineBreak := sLineBreak; Result := FLineBreak; end; procedure TStrings.SetLineBreak(const Value: string); begin if (FLineBreak <> Value) or not (sdLineBreak in FDefined) then begin Include(FDefined, sdLineBreak); FLineBreak := Value; end end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 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