[DELPHI] Sprawdzanie poprawności danych

0

Witam, mam komponent StringGrid, w ktorym do jednej z kolumn wpisywane sa liczby rzeczywiste (dodatnie lub ujemne). Jak w prosty sposob wymusic wprowadzanie tylko poprawnych danych, tzn. zgodnych z formatem liczby rzeczywistej dodatniej lub ujemnej? Chcialem uzyc metody OnGetEditMask ale nie wiem co zrobic z opcjonalnym znakiem '-' dla liczb ujemnych.

Pozdrawiam
Marcin

0

Polecam dać taką akcję na edycję tekstu w kolumnie (poniższy przykład sprawdza wszystkie kolumny, więc do twoich potrzeb musisz go jeszcze dostosować):

procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,
  ARow: Integer; const Value: String);
begin
try
  StrToFloat(value+'0');
except
  StringGrid1.Cells[Acol, Arow]:='1,0';
end
end;

Jeśli ktoś wpisał złą liczbe, StrToFloat zakończy się wyjątkiem,

try except end;

to przejmie i jeśli był błąd, do komórki wpisze wartość domyślną (tu 1,0). Warto zwrócić uwagę na zapis (value+'0'). Po co on jest? SetEditText() jest wywoływane po każdym znaku. Więc napisanie minusa wywoływało by błąd i nie pozwalało rozpoczęcie wpisywania liczby na przykład -2. Sam znak już zmieniłby wartość na 1,0. Symbol -0 jest prawidłową liczbą. Ważnym jest też, że nie powinieneś zapamiętywać rezultatu StrToFloat w tym momencie, bo co prawda 1,2 odczyta jako 1,20 i będzie OK, to -3 odczyta jako -30 i będzie problem.

Mógłbyś ewentualnie skonstruować funkcję podwójną: jeśli bez dodawania '0' liczba jest OK to ją zapamiętaj i zakończ, jeśli nie to spróbuj dopisać '0' i sprawdź: będzie OK, to masz liczbę (jeśli nie zakończy się po pierwszym sprawdzaniu, to znaczy, że '0' nie zmieni liczby); w ostateczności weź wartość domyślną.

Przykład: [StringGrid1, Label1]

procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String);
begin
  try
    StrToFloat(value);
    Label1.Caption:=value;
    exit;
  except
  end;

  try
    StrToFloat(value+'0');
    Label1.Caption:=value+'0';
  except
    StringGrid1.Cells[ACol, ARow]:='1,0';
    Label1.Caption:='1,0';
  end;
end;
0

Dzieki za pomoc, znalazlem wlasnie prostszy sposob:

procedure TForm1.pom_altGetEditMask(Sender: TObject; ACol, ARow: Integer;
var Value: String);
begin
if ACol=1 then
value:='#99,99';
end;

W ten sposob na pierwszej pozycji moge wpisac -,+ lub liczbe a dalej tylko liczby. Dalem jeszcze w OnKeyPress warunek na to zeby nie dawal sie wpisac znak + i jest ok.

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