Форум: "Начинающим";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];
ВнизПресловутый 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.046 c