Конференция "Начинающим" » Запрет на вставку текста из буфера в Edit [D7, XP]
 
  • KiLLiR © (29.03.08 18:57) [0]
    В моей программе нужно, чтобы Edit принимал только цифры. Событие нажатия клавиатуры я обработал как:
    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
    If not (Key in [ #48..#57]) then
    Key := #0
    end;


    Но до сих пор можно вставить все, что угодно из буфера. Нашел пример защиты от нажатия комбинации Ctrl+V, но не могу сделать аналогично для Shift+Insert.
    Может кто-то знает как сделать еще проще. Скажем, постоянно производить какую-нибудь проверку и в случае вставки из буфера мгновенно очищать поле. Буфер очищать нельзя - вдруг там что-то полезное для пользователя. И желательно чтобы это не было ресурсозатратным.
    Буду очень признателен, если кто-то поможет.

    P.S. Нигде не могу найти коды для служебных клавиш и их комбинаций.
  • {RASkov} © (29.03.08 19:39) [1]
    > [0] KiLLiR ©   (29.03.08 18:57)

    unit Unit2;
    interface
    uses Windows, Messages, StdCtrls;

    const EM_AFTERPASTE = WM_USER+10;
         PASTE_CODE    = 22;
         MAX_LENGTH    = 10;

    type
     TMyEdit = class(TEdit)
     protected
       procedure KeyPress(var Key: Char); override;
       procedure WndProc(var Mes: TMessage); override;
     end;

    implementation

    { TMyEdit }
    procedure TMyEdit.KeyPress(var Key: Char);
    begin
     inherited;
     if ORD(Key) = PASTE_CODE then Exit;
     if not (Key in ['0'..'9', #8]) then Key:=#0 else
      if ((Length(Text)>MAX_LENGTH-1) and (Key<>#8)) then
       if SelStart<MAX_LENGTH then SelLength:=1 else Key:=#0;
    end;

    procedure TMyEdit.WndProc(var Mes: TMessage);
    var S: String; N: Integer;
    begin
    if Mes.Msg = WM_PASTE      then PostMessage(Handle, EM_AFTERPASTE, 0, 0);
    if Mes.Msg = EM_AFTERPASTE then begin
     S:=Text;
     for N:= Length(S) downto 1  do if not (S[N] in ['0'..'9']) then Delete(S, N, 1);
     if Length(S)>MAX_LENGTH then SetLength(S, MAX_LENGTH);
     Text:=S;
    end else inherited;
    end;

    end.

  • KiLLiR © (30.03.08 18:35) [2]
    Создал новый Unit в проекте и засунул весь этот код туда, Edit назвал MyEdit, в главном юните в разделе uses тоже добавил этот юнит. Программа компилируется нормально, но Edit принимает всё и отовсюсду: все символы с клавиатуры, можно делать вставку из буфера. Что я делаю не так?
  • {RASkov} © (30.03.08 19:33) [3]
    > [2] KiLLiR ©   (30.03.08 18:35)
    > Edit назвал MyEdit

    :) Нда...
    не нужно его никак обзывать...

    в модуле с тестовой формой пропиши в раздел
    uses ..., Unit2;


    сам Unit2 выше.
    И например на OnCreate формы напиши следующее:

    TMyEdit.Create(self).Parent:=Self;


    F9 и проверяй.
    Объясняю:
    В модуле Unit2 мы описали и реализовали новый класс с именем TMyEdit.
    На создании формы мы создаем экземпляр нашего нового класса с родителем и владельцем которого есть - тек. форма(self)...
    И еще Edit1(брошенный в дизайнере) <> нашему новому классу... Что еще не понятно? :)
  • KiLLiR © (30.03.08 21:36) [4]
    Все, разобрался :)  Но появился новый вопрос. Edit создается в левом верхнем углу формы. Как задать ему определенные координаты?
  • {RASkov} © (30.03.08 21:39) [5]
    > [4] KiLLiR ©   (30.03.08 21:36)

    Гы... у "нового" эдита есть теже свойства, что и у старого :)
  • {RASkov} © (30.03.08 21:40) [6]
    with TMyEdit.Create(self) do begin
    Parent:=Self;
    left:=
    top:=
    ....
    end;
    Ты в первом классе? :)
 
Конференция "Начинающим" » Запрет на вставку текста из буфера в Edit [D7, XP]
Есть новые Нет новых   [134433   +22][b:0][p:0.001]