Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Пресловутый EDIT [D7]


Страницы:   1 2

Neket ©   (2006-08-30 11:35:00) 

Подскажите как запретить вводить пробел в 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;


default   (2006-09-05 09:40:00) [1]


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 можно заменить на что-то более резвое)


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

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


default   (2006-09-04 23:50:00) [3]

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


default   (2006-09-04 23:49:00) [4]

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


Anatoly Podgoretsky   (2006-09-04 23:41:00) [5]

SelLength := 0

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


default   (2006-09-04 23:25:00) [6]

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


default   (2006-09-04 23:23:00) [7]

можно повысить эффективность кода по сравнению с [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;


Anatoly Podgoretsky   (2006-09-04 22:49:00) [8]

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


default   (2006-09-04 22:45:00) [9]

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

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 21:11:00) [10]

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


C@N   (2006-09-04 19:10:00) [11]

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


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

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


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

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

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

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


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

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;


Не проверял.


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


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

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


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

> 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:50:00) [17]


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

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


novill   (2006-08-30 11:45:00) [18]

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

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


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


> Neket   (30.08.06 11:35)  

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


novill   (2006-08-30 11:43:00) [20]

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

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

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

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

If key=' ' then key:=0;

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо