Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.043 c
2-1157217824
olevacho_
2006-09-02 21:23
2006.09.24
ввод пароля


15-1156922134
Змей
2006-08-30 11:15
2006.09.24
литература по апи


2-1157452122
KItDod
2006-09-05 14:28
2006.09.24
вопрос


2-1157364800
Ragazor
2006-09-04 14:13
2006.09.24
Как создать в Dll переменную TDataModule из DataModule1.pas


4-1148130409
sicilla
2006-05-20 17:06
2006.09.24
Запись в FAT32





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский