Stworzenie komponentu typu Edit z możliwością formatowania dowolnych liczb

0

Typhon v.5.7 + fpc 3.1.1 + Windows 10 (64 bity)

Stworzyłem sobie nowy komponencik (TNumberEdit) dziedziczący po standardowym TEdit mający za zadanie obsługę danych numerycznych według zadanych parametrów. Jedną z właściwości jest właściwość Value, która jest typu Variant (może być NULL). Obsługuję (oczywiści między innymi) zdarzenia :

var
  Settings : TFormatSettings;

procedure TNumberEdit.DoEnter;
begin
  inherited;

  if (FValue <> Null) then
    begin
      Text := FormatFloat(<FORMAT>, FValue);
      SelectAll;
    end
  else 
    Clear;
end;

procedure TNumberEdit.DoExit;
begin
  inherited;

  if (FValue <> Null) then
    Text := FormatFloat(<FORMAT>, FValue, Settings);
  else 
    Clear;
end;

Wartość FValue jest na bieżąco ustawiana podczas obsługi KeyPress;

var
  NE_1, NE_2 : TNumberEdit;

Umieszczam na formie NE_1 oraz NE_2.

Jeżeli NE_1.Value <> null to podczas przechodzenia z NE_1 do NE_2 wykonuje się prawidłowo (NE_2)DoEnter. Jeżeli NE_1.Value = null to podczas przechodzenia z NE_1 do NE_2 (NE_2)DoEnter się nie wykonuje !

Podobnie jest w drugą stronę. Taka konstrukcja w Delphi wykonuje się bezproblemowo.
Gdzie może być "pies pogrzebany" ? Dopiero zaczynam się bawić Lazarusem i po prostu nie mogę się z tym problemem uporać.

Będę wdzięczny za każdą sugestię !

0

W Pascalu jest Nil, nie żaden Null; I po co Ci do tego dodatkowe pole, i to jeszcze Variant?

Poza tym nie wiem w ogóle co chcesz z tym komponentem zrobić - opis problemu jest obskurny; Podaj przykładowe dane wejściowe oraz napisz jak mają się prezentować w komponencie, a coś sensownego się wymyśli.

0

Jak napisałem wcześniej komponent ten służy do obsługi (wprowadzania i odczytu) dowolnych liczb.
Mamy przykładową liczbę reprezentującą cenę towaru, której format uwzględnia DecimalSeparator oraz ThousandSeparator(dwa miejsca po przecinku oraz spacja jako separator tysięcy -> 1 234,56). Może się zdarzyć, iż nie znamy ceny towaru i dlatego Value komponentu ustawiamy na null (stąd Variant). W wielu komponentach tego typu możemy ustawić w takim przypadku tylko 0 co samo w sobie jest jakąś konkretną wartością. Po wykonaniu DoEnter następuje sformatowanie tekstu "do edycji" (1234,56) w taki sposób, że tekst reprezentujący liczbę wyświetla się bez separatora tysięcy. Po wykonaniu DoExit następuje ponowne sformatowanie tekstu do postaci z separatorem tysięcy (1 234,56). Oczywiście komponent ten ma możliwość ustawiania wielu innych parametrów jak np.ilość miejsc po przecinku itd. ale w tej chwili nie o to chodzi. Reszt tak jak napisałem wyżej. Jeśli NE_1 = null to w momencie przejścia do NE_2 nie wykonuje się NE_2.DoEnter co powinno skutkować sformatowaniem tekstu NE_2 "do edycji" (oczywiście jeśli NE_2.Value <> null). Gdy NE_1 <> null to jest OK !

0

Powtarzam, w Pascalu nie ma Null - jest Nil i kropka;

Wszystko da się bez problemu wykonać z istniejącą właściwością Text oraz zdarzeniami OnKeyDown i OnKeyUp lub OnKeyPress (osobiście wolę te dwa pierwsze, bo dają możliwość wygodnej kontroli klawiszy specjalnych); Aby oznaczyć wartość pola edycyjnego jako niustalona/nieznana, wystarczy wpisać sam znak -; Tak więc nie potrzeba żadnych dodatkowych pól (tym bardziej wariantów), aby komponent był wygodny w obsłudze i aby interfejs był czytelny dla użytkownika; Zresztą równie dobrze wartością nieokreśloną może być po prostu puste pole (pusty ciąg znaków), co jest jeszcze bardziej intuicyjne;

Nie wiem czy potrzebujesz ustalić własne dane do formatowania (np. separatory), ale jeśli tak to od razu je przygotuj; Na początek stwórz sobie wszystkie potrzebne właściwości, a dopiero później zabierz się za pisanie właściwego kodu;

Podsumowując - w całości skup się na właściwości Text i modyfikuj ją wtedy kiedy trzeba, czyli:

  • po otrzymaniu focusa,
  • przy wciskaniu klawiszy (nie zapomnij o obsłudze zastępowania tekstu, gdy ten jest zaznaczony),
  • po utracie focusa,
  • podczas operacji związanych ze schowkiem (głównie Wytnij, Wklej i Usuń);
    Kodu mimo wszystko trzeba napisać dość sporo, aby obsłużyć wszystkie przypadki, więc zadanie nie jest proste.
0
furious programming napisał(a):

Powtarzam, w Pascalu nie ma Null - jest Nil i kropka;

Zlituj się... Dwukrotnie powtórzyłeś bzdurkę.
Oczywiście, że jest null i nil.
NIL to pusty wskaźnik, a NULL to wartość pusta (analogicznie do SQL) dla typu Variant. Oczywiście to nie jest to samo.
OP pisze o wariantach, a więc poprawnie używa null.
Zresztą:
Null :D

Kropka ;-)

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