![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Пресловутый EDIT [D7]
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;
Ну и хелп почитай :)