Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.24;
Скачать: CL | DM;

Вниз

Пресловутый EDIT   Найти похожие ветки 

 
Neket   (2006-08-30 11:35) [0]

Подскажите как запретить вводить пробел в EDIT. пытаюсь через OnChange так он ругается причем непонятно на что. Вот пример того как я это делаю:

procedure TForm1.Edit4Change(Sender: TObject);
Var
s:string;
begin
s:=Edit4.Text;
IF s[Length(s)]=" " then
                   begin
                   Showmessage("Пробел не допустимый символ");
                   Edit4.SetFocus;
                   Edit4.Text:="";
                   end;
end;


 
Palladin ©   (2006-08-30 11:40) [1]

В событие OnKeyPress

If Key=" " Then key:=#0;


 
Ega23 ©   (2006-08-30 11:42) [2]


> Palladin ©   (30.08.06 11:40) [1]


Не защитит от вставки из буфера.  :(


 
Neket   (2006-08-30 11:42) [3]

Спасибо.


 
novill ©   (2006-08-30 11:43) [4]

Ты понимаешь что в строчке
Edit4.Text:="";

ты генерируешь новый вызов OnChange ?

А вообще для блокировки пробела испльзую событие OnKeyPress

впиши туда это

If key=" " then key:=0;

Ну и хелп почитай :)


 
Плохиш ©   (2006-08-30 11:44) [5]


> Neket   (30.08.06 11:35)  

Как думаешь, что произойдёт после Edit4.Text:="";?


 
novill ©   (2006-08-30 11:45) [6]

If key=" " then key:=#0;

в по поводу вставки из буфера  можно и ONChange пользовать, только корректно выходить из рекурсии.


 
Плохиш ©   (2006-08-30 11:50) [7]


> novill ©   (30.08.06 11:45) [6]

Там нет рекурсии ;-) просто автор по заморскому читать не умеет, поэтому и "ругается причем непонятно на что" при if s[0] = " "


 
SergP.   (2006-08-30 11:51) [8]

> procedure TForm1.Edit4Change(Sender: TObject);
> Var
> s:string;
> begin
> s:=Edit4.Text;
> IF s[Length(s)]=" " then
>                   begin
>                   Showmessage("Пробел не допустимый символ")
> ;
>                   Edit4.SetFocus;
>                   Edit4.Text:="";
>                   end;
> end;


Перед Edit4.Text:=""; нужно сделать Edit4.OnChange:=nil;
А после Edit4.OnChange:=Edit4Change;


 
Плохиш ©   (2006-08-30 11:55) [9]


> Перед Edit4.Text:=""; нужно сделать Edit4.OnChange:=nil;
> А после Edit4.OnChange:=Edit4Change;

Дурдом, и это вместо единственной проверки, что строка не пустая.
Кстати, нет никакой гарантии, что пробел будет введён последним символом ;-)


 
Жуков Олег   (2006-08-30 11:58) [10]

procedure ...EditChange(...);
var
 SpacePos: Integer;
 s: string;
 CaretPos: Integer;
begin
 s := Edit.Text
 SpacePos := Pos(" ", s);
 if SpacePos > 0 then
 begin
   Delete(s, SpacePos);
   CaretPos := Edit.SelStart;
   Edit.Text := s;
   if CaretPos > SpacePos then
     Dec(CaretPos);
   Edit.SelStart := CaretPos;
 end;
end;


Не проверял.


 
novill ©   (2006-08-30 12:00) [11]

> [7] Плохиш ©   (30.08.06 11:50)
>
> > novill ©   (30.08.06 11:45) [6]
>
> Там нет рекурсии ;-)

Там просто неявный вызов самой себя :) правда по написанному коду всего один. :)

Причем, что интересно при вводе пробела очищается ВЕСЬ edit :)


 
Desdechado ©   (2006-08-30 12:07) [12]

Не проще ли перед использованием введенного в эдит значения вычищать из него пробелы StringReplace"ом?


 
C@N ©   (2006-09-04 19:10) [13]

Можно и кейдаун/кейап ловить... корректней будет...


 
Anatoly Podgoretsky ©   (2006-09-04 21:11) [14]

C@N ©   (04.09.06 19:10) [13]
Корректнее у Desdechado ©   (30.08.06 12:07) [12]


 
default ©   (2006-09-04 22:45) [15]

с буфером тоже работает

procedure TForm1.Edit1Change(Sender: TObject);
begin
  with Edit1 do begin
    Text := StringReplace(Text, " ", "", [rfReplaceAll]);
    SelStart := Length(Text);
    SelLength := Length(Text);
  end;
end;

если коряво, то звиняйте


 
Anatoly Podgoretsky ©   (2006-09-04 22:49) [16]

Как насчет рекурсии
И не понятны манипуляции с SelX, особенно с SelLength


 
default ©   (2006-09-04 23:23) [17]

можно повысить эффективность кода по сравнению с [15]
здесь StringReplace работает только при вставке из буфера и при удалении части строки путём выделения, идея почти тривиальна
за возможные ошибки не ручаюсь, потыкайтесь авось вас это устроит;)
код не прозрачен, то если загоритесь - сможете понять:)

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  Edit1.Tag := 1;
  if (Key = " ") or (Key = #8) then begin
    if Key = " " then Key := #0;
    Edit1.Tag := 0;
  end;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  if Edit1.Tag = 0 then
    with Edit1 do begin
      Text := StringReplace(Text, " ", "", [rfReplaceAll]);
      SelStart := Length(Text);
      SelLength := Length(Text);
  end else Edit1.Tag := 0;
end;


 
default ©   (2006-09-04 23:25) [18]

Anatoly Podgoretsky ©   (04.09.06 22:49) [16]
манипуляции с SelStart и SelLength это чтобы курсор взад строки поставить
все решения опробовал на практике


 
Anatoly Podgoretsky ©   (2006-09-04 23:41) [19]

SelLength := 0

Только вот ставить надо не в конец, а туда где был


 
default ©   (2006-09-04 23:49) [20]

к [17]
-когда мы набираем на клавиатуре текст в едите сначала возникает событие OnKeyPress, а потом OnChange
-когда идёт копирование из буфера возникает только OnChange
-когда мы удаляем часть строки выделением и энтером возникает только OnCnange
-когда курсор упёрся в левый бок едита и мы пытаемся передвинуть курсор ещё левее возникает только OnKeyPress с кодом символа #8
-когда в OnKeyPress мы ставим Key := #0 событие OnCnange не возникнет
вот на этом и базируется код


 
default ©   (2006-09-04 23:50) [21]

Anatoly Podgoretsky ©   (04.09.06 23:41) [19]
да, не учёл, и уже не буду


 
default ©   (2006-09-05 00:18) [22]

+[20]
и это ещё далеко не полный список все вариантов возникновения событий...
так что для полностью работоспособного варианта на выбранном пути ещё надо ещё работать...гемор одним словом
по-моему как-то через винапи можно одной строчкой запретить пробел во всех случаях


 
default ©   (2006-09-05 09:40) [23]


procedure TForm1.Edit1Change(Sender: TObject);
var
  i, c, p: Integer;
  OnChg: TNotifyEvent;
begin
  with Edit1 do begin
    c := 0;
    for i := 1 to SelStart do
      if Text[i] = " " then Inc(c);
    p := SelStart - c;
    OnChg := OnChange;
    OnChange := nil;
    Text := StringReplace(Text, " ", "", [rfReplaceAll]);
    OnChange := OnChg;
    SelStart := p;
    SelLength := 0;
  end;
end;


можно юзать вот такую фигню(StringReplace можно заменить на что-то более резвое)



Страницы: 1 вся ветка

Текущий архив: 2006.09.24;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.032 c
2-1157301812
Konstantin555
2006-09-03 20:43
2006.09.24
Как в ходе программы задать параметр CanResize формы?


15-1157266346
Ketmar
2006-09-03 10:52
2006.09.24
Gero, ты клиента чинить будешь?


1-1155130706
NailMan
2006-08-09 17:38
2006.09.24
Чего пользовать для ввода чисел?


2-1157048371
Интересующийся
2006-08-31 22:19
2006.09.24
Две копии приложения и одна таблица


3-1153901322
partizan
2006-07-26 12:08
2006.09.24
Скорость работы запроса, и количество полей в таблице