Skocz do zawartości


Problem KeyUp


2 odpowiedzi w tym temacie

#1 miduraa11

    Nowy na forum

  • Użytkownicy
  • 5 Postów:

Napisano śro, 28 gru 2016 - 14:37

Witam

Mam pewnie problem z procedurą KeyUp.

Chcę zablokować wpisywanie niedozwolonych znaków.

Kawałek kodu:

pascal
if not (Key in ['0'..'9']) then
  Key := #0
  else
  begin  (kod działający poprawnie) end


Program ma za zadanie wczytywać w TMemo1 jakąś cyfrę (string) i wypisywać w TMemo2 jej dzielniki od 1 do 11.

Program się wysypywał jeśli wpisałem coś innego jak cyfrę, gdy dodałem ten kawałek kodu to przestał się wysypywać, ale nadal jestem w stanie wpisywać litery.

Jak mogę to zablokować? Jeśli jest coś innego jak cyfra to żeby mi zablokowało klawiaturę.

KeyDown i KeyPress nie wchodzi niestety w grę, bo gdy wpiszę dla przykładu cyfrę '2' to nic mi nie wypisze, a gdy dopiszę jeszcze '0' to wyświetla mi dzielniki dla '2' a nie dla '20'.

Da się tak zablokować klawiature na KeyUp?

Z góry przepraszam, ale to mój pierwszy post gdyby było coś nie tak.

#2 spike

    Pomocna dłoń

  • Super użytkownicy
  • 181 Postów:

Napisano śro, 28 gru 2016 - 17:23

Nie da się zmienić kodu klawisza, który ma zostać dodany do zawartości memo w innych funkcjach jak KeyPress.

W Twoim wypadku do KeyPress wstaw:
delphi

if not (Key in ['0'..'9', #8] ) then begin
 Key := #0;
 if Memo1.Lines.text <> '' then
   Label1.Caption := IntToStr(StrToInt(Memo1.Lines.text));
end;
 


Nie wiem czy o to chodziło... ;]
Ps. Gdy w KeyPress robisz taki warunek to pamiętaj, aby obsługiwać wszelkie klawisze np Backspace = #8, aby móc później kasować zawartość Memo czy edit'a

#3 miduraa11

    Nowy na forum

  • Użytkownicy
  • 5 Postów:

Napisano śro, 28 gru 2016 - 18:12

Wyświetl postUżytkownik spike dnia śro, 28 gru 2016 - 17:23 napisał

Nie da się zmienić kodu klawisza, który ma zostać dodany do zawartości memo w innych funkcjach jak KeyPress.

W Twoim wypadku do KeyPress wstaw:
delphi

if not (Key in ['0'..'9', #8] ) then begin
Key := #0;
if Memo1.Lines.text <> '' then
   Label1.Caption := IntToStr(StrToInt(Memo1.Lines.text));
end;
 


Nie wiem czy o to chodziło... ;]
Ps. Gdy w KeyPress robisz taki warunek to pamiętaj, aby obsługiwać wszelkie klawisze np Backspace = #8, aby móc później kasować zawartość Memo czy edit'a


A możesz mi powiedzieć co to jest Label1.Caption ? I czy trzeba to wcześniej zadeklarować?

I z góry dziekuję za odpowiedź! :)

Edit.

Ale czy to zlikwiduje mój problem co wcześniej?
Bo gdy wpisywałem do memo1 np 2 to w memo2 nic nie pokazywało dopiero gdy nacisnąłem kolejna cyfrę np 3 to wyskakiwały mi dzielniki dla 2 nie dla 23.
Tego problemu dalej nie będzie?

Edit 2.

W miedzy czasie wymyśliłem coś takiego :D

pascal
procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Char; Shift: TShiftState);
var
  i, dlugosc_memo1, linia : integer;
  napis,wyraz, NoweMemo : string;
begin
  if Key in ['0'..'9',#8] then
  begin
        (obliczanie jakie dzielniki)
  end else
  begin
        NoweMemo := Copy (Memo1.Text,0,(length(Memo1.text)-1));
        Memo1.Lines.Clear;
        Memo1.Text := NoweMemo; (caly napis ten sam ale jeśli dam inny znak niz 0 - 9 to kopjuje cale memo bez zle wpisanego znaku)
begin
(znowu obliczanie jakie dzielniki)
end;
  end;
 
endł
 


Może trochę przekombinowane ale działa tak jak chciałem :D

Edit 3

Dobra jednak to nie był dobry pomysł :D
Nadal mogę wpisywać litery gdy np kursorem kliknę pomiędzy cyfry, strzałki i enter nie działają itd..
Także dalej szukam pomocy w rozwiązaniu tego :)

Edit 4

Ok już sobie poradziłem z tym problemem :)
Dodałem KeyUp i KeyDown jednocześnie i działa :)