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

Odpowiedz Nowy wątek
2019-09-29 22:51

Rejestracja: 7 lat temu

Ostatnio: 1 dzień temu

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;

Pozostało 580 znaków

2019-09-29 23:09

Rejestracja: 14 lat temu

Ostatnio: 2 dni temu

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;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2019-09-29 23:13

Pozostało 580 znaków

2019-09-30 01:56
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 1 minuta temu

Lokalizacja: Tuchów

2

@Rafał D: użyj typu wyliczeniowego.


Pozostało 580 znaków

2019-09-30 10:34

Rejestracja: 7 lat temu

Ostatnio: 1 dzień temu

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?

defaut służy do czegoś innego - jeśli property będzie miało taką wartość to nie zostanie zapisana w DFMie - abrakadaber 2019-09-30 22:19

Pozostało 580 znaków

2019-09-30 10:38
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 1 minuta temu

Lokalizacja: Tuchów

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.


Pozostało 580 znaków

2019-09-30 10:41

Rejestracja: 14 lat temu

Ostatnio: 2 dni temu

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;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

Odpowiedz

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