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

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

OnChange - игнор


chir ©   (2005-01-09 22:35:00) 

Можно ли как нибудь сделать так, чтобы на
Edit1.Text := 'lalala';
Не срабатывало событие OnChange?


begin...end   (2005-01-14 11:11:00) [1]

> [13] chir   (14.01.05 00:47)

Класс TObject не содержит свойства Text и метода OnChange.


Юрий Зотов   (2005-01-14 00:56:00) [2]

> chir   (14.01.05 00:47) [13]
> а еще лучше вот так:

А еще лучше вот так:

OldOnChange := Receiver.OnChange;
try
 Receiver.OnChange:= NIL;
 Receiver.Text := NewText;
finally
 Receiver.OnChange:= OldOnChange;
end;


chir   (2005-01-14 00:47:00) [3]

> A.S.D

а еще лучше вот так:

procedure SetEditText(Receiver: TObject; NewText: string);
var
OldOnChange: TNotifyEnent;
begin
 OldOnChange := Receiver.OnChange;
 Receiver.OnChange:= NIL;
 Receiver.Text := NewText;
 Receiver.OnChange:= OldOnChange;
end;

умнею однако :) test


chir   (2005-01-14 00:42:00) [4]

> A.S.D.
Отличная идея! :) ща переделаю... а то у меня штук 20 подряд идет подобного текста:

 cxTE_surname.Properties.OnChange := nil;
 cxTE_surname.Text := DM.ADOQ2.FieldByName('surname').AsString;
 cxTE_surname.Properties.OnChange := cxFIOPropertiesChange;

спасибо всем!


A.S.D.   (2005-01-10 13:46:00) [5]


> begin...end ©   (10.01.05 13:36) [9]


А ещё лучше оформить процедуру установки значения Edit:
procedure SetEditText(Edit: TEdit; NewText: string);
var
OldOnChange: TNotifyEnent;
begin
  OldOnChange := Edit.OnChange;
  Edit.OnChange:= NIL;
  Edit.Text := NewText;
  Edit.OnChange:= OldOnChange;
end;


Gero   (2005-01-10 13:39:00) [6]


> var
>  ...
>  OldChange: TNotifyEvent;
> begin
>  with (Sender as TEdit) do
>  begin
>    OldChange := OnChange;
>    OnChange := NIL;
>    // Здесь - манипуляции с Text
>    OnChange := OldChange
>  end
> end.

Угу, пожалуй лучший вариант.


begin...end   (2005-01-10 13:36:00) [7]

> [8] pasha_golub ©   (10.01.05 12:38)

А зачем заводить флажок, если можно обойтись и без флажка? :-)

Но вот ещё пример. Допустим, требуется изменять (как-нибудь преобразовывать) текст edit'а в самом обработчике OnChange.

Вот код обработчика Edit1.OnChange (высосанный из пальца):

var
 I: Integer;
 S: String;
begin
 with (Sender as TEdit) do
 begin
   S := Text;
   for I := 1 to Length(S) do
     S[I] := Chr(Ord(S[I]) + 1);
   Text := S
 end
end.


Присвоение значения свойству Text снова вызывает обработчик OnChange, и... ничего хорошего из этого не выйдет.

Здесь-то и можно поступить так, как написано выше:

var
 I: Integer;
 S: String;
begin
 with (Sender as TEdit) do
 begin
    OnChange := NIL;
   S := Text;
   for I := 1 to Length(S) do
     S[I] := Chr(Ord(S[I]) + 1);
   Text := S;
    OnChange := Edit1Change
 end
end.


Хотя последняя выделенная строка - это тоже не есть хорошо. Я бы сохранял старый обработчик события, а потом восстанавливал его:

var
 ...
 OldChange: TNotifyEvent;
begin
 with (Sender as TEdit) do
 begin
   OldChange := OnChange;
   OnChange := NIL;
   // Здесь - манипуляции с Text
   OnChange := OldChange
 end
end.


pasha_golub   (2005-01-10 12:38:00) [8]

begin...end ©   (10.01.05 12:27) [6]
Все равно неудачный, если изменения сделаны програмно можно завести флажок, а в OnChange его опрашивать и сбрасывать.


pasha_golub   (2005-01-10 12:30:00) [9]

begin...end ©   (10.01.05 12:27) [6]
Может. :0) Спасибо за пример


begin...end   (2005-01-10 12:27:00) [10]

> [3] pasha_golub ©   (10.01.05 11:41)

Разве не может возникнуть ситуация, когда требуется отслеживать толькоизменения edit'а, сделанные пользователем?


pasha_golub   (2005-01-10 12:25:00) [11]

www.Vlad.uk   (10.01.05 11:54) [4]
Ага, хук слева, хук справа....


www.Vlad.uk   (2005-01-10 11:54:00) [12]

Хук ставь!


pasha_golub   (2005-01-10 11:41:00) [13]

А можно узнать, зачем?


chir   (2005-01-09 23:16:00) [14]

какой здоровский совет однако!
спасибо преогроменное! :)


DrPass   (2005-01-09 22:39:00) [15]

Edit1.OnChange:=nil;
Edit1.Text := 'lalala';
Edit1.OnChange:=Edit1Change;


Наверх

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