Blokowanie dopisywania znaków podczas pisania w TEdit

0

Haj. Jak "oszukać" kontrolkę TEdit, żeby ta nie dostawała informacji o dopisaniu znaku? Mamy obsługę zdarzenia naciśnięcia klawisza:

procedure TfrmSpis.edCiagSzukanyKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  var
    strTekst: string;
  begin
  if (Shift = [ssCtrl]) then
    begin
    strTekst := (Sender as TEdit).Text;
    if (Key = 8) then
        UsunWycinekTekst(strTekst);
    if Key = 32 then
      strTekst := strTekst + '°'; //176 ascii
    (Sender as TEdit).Text := strTekst;
    end;
  end;

Naciśnięcie ctrl+backspace (Key=8) ma skasować ostatni wyraz, ctrl+spacja wstawi znaczek stopni imitujący twardą spację, ale to nie jest istotne. Pytanie: jak zablokować wypisanie znaków ze zdarzenia wciśnięcia klawisza, przez co na początku tekstu pojawia się np. spacja albo prostokącik. Dodam, że skakanie karetką i kasowanie już wstawionych znaków wygląda bardzo nieelegancko.

0

Obsłużyć zdarzenie KeyPress i dać Keyowi #0 ?

0

Faktycznie jest jak wół var przed Key, ale najwyraźniej nic to nie wnosi. Spróbuję później jeszcze powalczyć tą metodą, może gdzieś schował się jakiś detal. Dzięki :)

Edit:

Dobra, wszystko jasne i banalne, spieszyłem się i niedoczytałem, że trzeba obsłużyć OnKeyPress. Jeśli kogoś interesuje obsługa ctrl+backspace, czyli skasowanie całego wyrazu na lewo od karetki, oraz wstawienie własnego znaczka do TEdita, to wygląda to następująco:

procedure TfrmSpis.edCiagSzukanyKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  begin
  Ctrl := (Shift = [ssCtrl]);
  end;

procedure TfrmSpis.edCiagSzukanyKeyPress(Sender: TObject; var Key: Char);
  var
    strTekst: string;
    Znak: PChar;
    PozKaretka: Integer;

  function ZnakAlfaNumeryczny(Znak: Char): Boolean;
    begin
    Result := ((Znak in ['0'..'9']) or (Znak in ['a'..'z']) or (Znak in ['A'..'Z']) or (Znak > #127));
    end;

  begin
  if Ctrl then
    with (Sender as TEdit) do
    begin
    strTekst := Text;
    if (Key = #127) and (Length(strTekst) > 0) then  //ctrl+backspace = del (127 ascii)
      begin
      Znak := @strTekst[SelStart];
      while (Znak >= @strTekst[1]) and ZnakAlfaNumeryczny(Znak^) do
        begin
        Znak^ := #255;
        Dec(Znak);
        end;
      while (Znak >= @strTekst[1]) and not ZnakAlfaNumeryczny(Znak^) do
        begin
        Znak^ := #255;
        Dec(Znak);
        end;
      PozKaretka := Integer(Znak) - Integer(@strTekst[1]) + 1;
      Text := AnsiReplaceText(strTekst, #255, '');
      SelStart := PozKaretka;
      end;
    if Key = ' ' then   //"twarda spacja" - tylko dla celów własnych, inne aplikacje nie strawią znaczka stopni :)
        begin
        PozKaretka := SelStart;
        Text := AnsiLeftStr(strTekst, PozKaretka) + '°' + AnsiRightStr(strTekst, Length(strTekst) - PozKaretka); //176 ascii
        SelStart := PozKaretka + 1;
        end;
    Key := #0;
    end;
  end;

Do tego można poprawić ctrl+del, który kasuje wszystko po prawej stronie karetki, a powinien tylko pierwszy wyraz, ale to może następnym razem.

0

Dziwne powinno działać a jak napisał maciejmt nie to kiedyś ktoś chciał to zrobić w memo
http://4programmers.net/Forum/642815#id642815
napisałem odpowiedź i raczej nie będziesz miał problemu z dostosowaniem tego kodu do swoich pot5rzeb ale jak coś to pisz.

Aha jak keypress nie działa to moze keyup, keydown

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