Zmienna liczbowa i 2 stany (jest wartość lub null)

0

Borykam się z pewnym problemem na który tam mam jakiś sposób ale mało elegancki. Zakładamy taką sytuację mam zmienną o nazwie "fstan" typu integer, oraz funkcję GetStan.

fstan: integer;
property stan: integer; read fstan write fstan;
function GetStan: string;

I teraz tak funkcja GetStan musi zwrócić takie wartości:

1). '' - jeżeli nie ustalono zmiennej
2). 0 - jeżeli przypisano 0 do fStan
3). 1 - jeżeli przypisano 1 do fStan

Jak wiadomo zmienna integer zawsze ma jakąś wartość. Dlatego jaki jest najlepszy sposób na rozwiązanie problemu? Zastosować zmienną OleVariant? Czy może coś takiego zrobić?

fstan: string;
property stan: integer; read getValue write setValue;

function GetStan: string; 
begin
  result := fstan;
end;

procedure setValue(V: integer);
begin
  fStan := inttostr(v);
end;
0

2 warianty

  • Uznać że wartość MinInt (= -2147483648) jest wartością nie ustaloną, czyli w konstruktorze: fstan:=MinInt; zaś:

    function GetStan: string; 
    begin
    if fstan=MinInt then result:='' else result:=fstan;
    end;
  • Dodatkowa zmienna boolean nostan; w konstruktorze nostan:=true;

    function GetStan: string; 
    begin
    if nostan then result:='' else  result:=fstan;
    end;
    //
    procedure setValue(V: integer);
    begin
    nostan:=false;
    fStan:=inttostr(v);
    end;
2

@Rafał D: użyj typu wyliczeniowego.

1

@_13th_Dragon Czy nie lepiej zamiast w konstruktorze przypisywać zmienna fstan := MinInt zrobić tak?

property Stan: integer; read fstan write fstan default MinInt;

I potem nie korzystać ze zmiennych fstan tylko Stan?

0

Nie, bo zmienna FStan po utworzeniu instancji klasy zostanie zainicjowana wartością 0, tak jak wszystkie inne pola typu porządkowego. Dlatego inicjalizacja w konstruktorze jest konieczna, bo domyślna wartość pola ma być niezerowa.

0
Rafał D napisał(a):

@_13th_Dragon Czy nie lepiej zamiast w konstruktorze przypisywać zmienna fstan := MinInt zrobić tak?

property Stan: integer; read fstan write fstan default MinInt;

Lepiej, tylko że nie będzie to dokładnie tym co pytający chce.
Wg mnie trzeba rozdzielić te dwie funkcji (trzymanie stanu, trzymanie informacji o braku inicjalizacji)

property Initialized:Boolean; read finitialized default false;
property Stan: integer; read fstan write setStan;
procedure setStan(Value:Integer);
begin
  finitialized:=true;
  fstan:=Value;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0