Uciążliwy maskedit - nie można pominąć jego edycji

0

Witam, mam problem z maskeditem, a mianowicie gdy jest on na formatce wśród editów i comboboxów oraz nawiguje po nich klawiszem TAB, to gdy kursor trafi na maskedita, który ma ustawioną maskę (dajmy na to kod pocztowy ##-###), to nawigować dalej TABEM mogę tylko jak wpisze poprawną wartośc do maskedita... jest to uciążliwe.
Chciałbym żeby sprawdzał on swoją zawartość tylko kiedy coś w nim wpiszemy a nie kiedy ustawimy focus - bo z pustego maskedita nie daje się wyjść.
proszę o rady, thx

0

OK, może jest błąd w moim pytaniu, a mianowicie samo nawigowanei TABEM po niewypełnionych kontrolkach działa, jednak chodzi mi o sytuacje gdy kursor postawiliśmy na maskedicie, zaczeliśmy coś wpisywać, ale się rozmyśliliśmy i chcemy jednak pole pozostawić puste, nie wypełniać go wcale - to wtedy nie można jużgosobie odpuścić - maskedit krzyczy wyjątkiem "'Invalid input value. Use escape key to abandon changes'" (który w jakiś sposób obsługuje sobie sam w application.OnException), chodzi mi o to żeby maskedit nie trzymał mnie na siłę...

0

Pod jakim Delphi tak masz? Próbowałem pod siódemką personal. I zarówno mam bezproblemowe wychodzenie z MaskEdit, Tabem jak i opuszczanie kontrolki, gdy maska jest niewypełniona. Może jest jakaś własność MaskEdita, która powoduje taki wyjątek. Pokaż jak wygląda ten konkretnie obiekt w tekstcie pliku projektu. Chyba, że też wina jest jakiegoś złego kodu.

0

załatwiłem to tak:

if Key in [VK_ESCAPE, VK_DELETE, VK_BACK] then
  begin
    TMaskEdit(Sender).Clear;
    Key := 0;
  end;

jakoś działa, najchetniej bym sie pozbyl maskedita, ale taki mam wymóg...

0

Treść wyjątku sugeruje, że aby porzucić akceptację zmienionej wartości to trzeba użyć klawisza Esc, a nie opuszczać go tabulatorem; Widać przerzucenie fokusa na następny komponent powoduje akceptację nowej wartości, a jeśli jest niezgodna to rzucany jest wyjątek; Nie wiem jednak, czy wyjątek rzuca faktycznie komponent, czy jakiś Twój kod, który wywoływany jest po zmianie wartości w MaskEdit, np. ze zdarzenia OnChange;

Po drugie - kasowanie zawartości komponentu za pomocą klawiszy BkSp i Del nie jest zgodne z ich przyjętymi akcjami i będzie to wkurzać użytkowników; Po trzecie - klawisz Esc wewnętrznie obsługuje anulowanie wprowadzonych zmian, a nie skasowanie zawartości komponentu;

Podsumowując - Twój powyższy kod upośledza funkcjonalność komponentu i wprowadza zamieszanie w jego obsłudze; Obstawiam, że wyjątku nie rzuca komponent, a inny kod.

0

Wyjątek rzuca maskedit.
Poponouję zrobić mały test dla ciekawskich.
ustawić maskedita z maską na kod pocztowy xx-xxx.
w programie wejsc na te pole (np tabulatorem), wpisac poprawny kod, ale jednak po chwili zastanowić się ;) i spróbować pozostawić pole puste przed przejsciem/po przejściu dalej....

0

u mnie jest ... maskedit ma maske: 00000;1;_

naformie edit oraz maskedit.
kursor stawiamy na edicie, przechodzimy tabem na maskedit, podajemy tam kod np 55555, przechodzimy tabem na edit, wpisujemy cos, przechodzimy tabem na maskedit usuwamy wartosc (powinien kursor ustawic sie na pierwszym znaku do wpisania), przeskakujemy tabem na edit z powrotem i u mnie błąd jest...

0

No z taka maska rzeczywiście jest wyjątek ale możesz spróbować go obsłużyć np. coś w stylu:

procedure TForm1.OnAppException(Sender: TObject; E: Exception);
begin
  if not (E is EDBEditError) then
    Application.ShowException(E) //inne wyjatki komunikat bledu
  else
  if Sender is TMaskEdit then
  begin
    TMaskEdit(Sender).Text:= ''; //wyczysc maskedit
    PostMessage(TMaskEdit(Sender).Parent.Handle, WM_NEXTDLGCTL, 0, 0); //przejdz do nastepnej
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnException:= OnAppException;
end;

Rozwiązanie nie jest doskonałe bo "nie wie" czy powinien przejść do następnej kontroli (naciśnięto klawisz TAB) czy nie i zawsze przechodzi (lub nie po usunięciu wysyłania komunikatu). Trzeba by jakoś sprawdzać czy był naciśnięty VK_TAB ale nie mam w tej chwili pomysłu jak.

0

wyjątek obsługuje jakoś na swój sposób żeby komunikatu nie było, tylko że czyszczę tekst maskedita w onkeydown, po wciśnieciu odpowiednich klawiszy... i to działa jako tako, po prostu przyjmuje zasade, ale wpisuejsz całość dobrze albo pole jest puste, a jak zle wpisales to kasuje ci wszystko i od nowa piszesz.

0

Ok mam chyba lepszy pomysł polega on na ustawianie maski gdy MaskEdit staje się aktywny i jej usuwaniu gdy przestaje być aktywny:

type
  TMaskEdit = class(Mask.TMaskEdit)
  private
    procedure WMKillFocus(var Msg: TMessage); message WM_KILLFOCUS;
    procedure WMSetFocus(var Msg: TMessage); message WM_SETFOCUS;
  end;
//...ciach...
procedure TMaskEdit.WMSetFocus(var Msg: TMessage);
begin
  Self.EditMask:= '00000;1;_';
  inherited;
end;

procedure TMaskEdit.WMKillFocus(var Msg: TMessage);
begin
  Self.EditMask:= '';
  inherited;
end;

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