Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Enum gesetzt? (https://www.delphipraxis.net/164953-enum-gesetzt.html)

mc-bain 7. Dez 2011 13:24

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:
Status = (aktiv,inaktiv)
Und folgende Klasse:
Code:
TMyClass = class(Tobject)
  private
    FStatus: Status;
  published
    Status: Status read FStatus write FStatus
end;
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:

Code:
...
var: myClass: TMyClass;
begin
  myClass = TMyClass.Create;
  ShowMessage(GetEnumName(TypeInfo(Status),Integer(myClass.Status)));

  myClass.Free;

end;
Kann mir diesbezüglich jemand weiterhelfen? Oder muss ich quasi immer einen DefaultWert als Enum-Option mit aufnehmen?

Vielen Dank.
mc

DeddyH 7. Dez 2011 13:37

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.

Bummi 7. Dez 2011 13:48

AW: Enum gesetzt?
 
active ist ORD 0, Klassenvariablen werden immer mit 0 initialisiert, Du könntest gegf. noch ein undefined vor Dein active einbauen ....

mc-bain 7. Dez 2011 13:56

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?

DeddyH 7. Dez 2011 13:59

AW: Enum gesetzt?
 
Delphi-Quellcode:
constructor TMyClass.Create;
begin
  FStatus := inaktiv;
end;
That' s all.

Ralf Kaiser 7. Dez 2011 14:02

AW: Enum gesetzt?
 
Oder, noch einfacher:
Code:
  Status = (inaktiv,aktiv)
(In der Annahme, dass "inaktiv" als "Voreinstellung" gelten soll)

mc-bain 7. Dez 2011 14:04

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.

himitsu 7. Dez 2011 14:26

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:
type
  Status = (nicht_gesetzt, aktiv, inaktiv);
Alternativ mal in die TStringList schauen, welches mehrfach Version 1 implementiert hat:
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 00:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz