Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2017, 11:33   #1
Tyom
Новичок
Джуниор
 
Регистрация: 14.04.2017
Сообщений: 5
По умолчанию Взаимное изменение двух полей Edit по событию OnChange

Добрый день!
Есть два поля Edit. По событию Edit1.OnChange хочу изменять поле Edit2, а по событию Edit2.OnChange изменять Edit1.
Подскажите, как это можно реализовать?
Tyom вне форума Ответить с цитированием
Старый 14.04.2017, 11:40   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

простите, а в чём проблема?

можно повесить два обработчика, один - на onChange поля Edit1,
второй - на onChange поля Edit2.

можно повесить на оба контрола один и тот же обработчик использовать,
тогда в нём проверять Sender:
Код:
if Sender=Edit1 then Edit2.Text := Edit1.Text
else Edit1.Text := Edit2.Text;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.04.2017, 11:44   #3
Tyom
Новичок
Джуниор
 
Регистрация: 14.04.2017
Сообщений: 5
По умолчанию

Ой, попробовал в пустой программе, и правда работает.
Видимо, ошибка в другом месте. Спасибо!
Tyom вне форума Ответить с цитированием
Старый 14.04.2017, 12:37   #4
Tyom
Новичок
Джуниор
 
Регистрация: 14.04.2017
Сообщений: 5
По умолчанию А вот с вычислениями сложнее становится..

В таком варианте уже не работает.

Код:
procedure TForm1.Edit1Change(Sender: TObject);
begin
  Edit2.Text := FloatToStr (StrToFloat(Edit1.Text) + 1);
end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
  Edit1.Text := FloatToStr (StrToFloat(Edit2.Text) + 1);
end;
Возможно ли заблокировать вызов события OnChange при программном изменении? Оставить только изменение пользователем (как в ComboBox)

Последний раз редактировалось Tyom; 14.04.2017 в 12:40.
Tyom вне форума Ответить с цитированием
Старый 14.04.2017, 12:53   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

1
Код:
procedure TForm1.Edit1Change(Sender: TObject);
begin
  Edit2.OnChange:=nil;
  Edit2.Text := FloatToStr (StrToFloat(Edit1.Text) + 1);
  Edit2.OnChange:=Edit2Change;
end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
  Edit1.OnChange:=nil;
  Edit1.Text := FloatToStr (StrToFloat(Edit2.Text) + 1);
  Edit1.OnChange:=Edit1Change;
end;
2
Код:
procedure TForm1.Edit1Change(Sender: TObject);
begin
  if Edit1.Tag=0 then begin
    Edit2.Tag:=1;
    Edit2.Text := FloatToStr (StrToFloat(Edit1.Text) + 1);
    Edit2.Tag:=0;
  end;
end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
  if Edit2.Tag=0 then begin
    Edit1.Tag:=1;
    Edit1.Text := FloatToStr (StrToFloat(Edit2.Text) + 1);
    Edit1.Tag:=0;
  end;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.04.2017, 13:22   #6
Tyom
Новичок
Джуниор
 
Регистрация: 14.04.2017
Сообщений: 5
По умолчанию

Спасибо большое за быстрые ответы!
Второй код работает.
А с первым проблемы. В Lazarus видимо есть отличия от Delphi..

Код:
unit1.pas(38,19) Error: Wrong number of parameters specified for call to "Edit2Change"
unit1.pas(18,15) Error: Found declaration: Edit2Change(TObject);
unit1.pas(45,19) Error: Wrong number of parameters specified for call to "Edit1Change"
unit1.pas(34,18) Error: Found declaration: Edit1Change(TObject);
Tyom вне форума Ответить с цитированием
Старый 14.04.2017, 13:25   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А так?
Код:
Edit1.OnChange:=@Edit1Change;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.04.2017, 13:29   #8
Tyom
Новичок
Джуниор
 
Регистрация: 14.04.2017
Сообщений: 5
По умолчанию

Так успешно! = )
Полная победа!
Tyom вне форума Ответить с цитированием
Старый 14.04.2017, 14:22   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Код:
procedure TForm1.Edit1Change(Sender: TObject);
begin
  Edit2.OnChange:=nil;
  Edit2.Text := FloatToStr (StrToFloat(Edit1.Text) + 1);
  Edit2.OnChange:=Edit2Change;
end;
не страшно до тех пока не начнутся "эксперименты" по замене обработчиков.

сценарий 1. жил-был Edit2 и был у него обработчик Edit2Change.
захотелось тут почему-то для Edit2 назначить другой обработчик Edit2ChangeNew, а старый (Edit2Change) приспособить еще к чему-то (или же он был уже приспособлен).

сценарий 2. жила была форма и был у нее Edit2 c обработчиком Edit2Change
захотелось разработать новую форму почти такую же (т.е. сделать её наследной)
и потребовалось в новой форме изменить обработчик Edit2Change.

в обоих сценариях мы потеряем правильные(исходные) обработчики. И работать-то скорей всего будет, но вот результаты будут не те.

исправленный вариант
Код:
procedure TForm1.Edit1Change(Sender: TObject);
var
   m: TNotifyEvent;
begin
  m:=Edit2.OnChange; //мы не знаем как он называется и даже был ли он, но мы знаем что он должен быть тут
  Edit2.OnChange:=nil;
  Edit2.Text := FloatToStr (StrToFloat(Edit1.Text) + 1);
  Edit2.OnChange:=m;Edit2Change; // вернем на место ровно то, что там было
end;
P.S. я знаю что приведенные сценарии достаточно маловероятны для ТС и не только для него, но тем не менее...

P.P.S. а еще все это надо заблокировать от ошибок.
Если в Edit1 окажется не число, то пиши пропало... мы "потеряем" обработчик

Код:
  m:=Edit2.OnChange; //мы не знаем как он называется и даже был ли он, но мы знаем что он должен быть тут
try
  Edit2.OnChange:=nil;
  Edit2.Text := FloatToStr (StrToFloat(Edit1.Text) + 1);
finally // при любом раскладе (ошибка или нет) 
  Edit2.OnChange:=m;Edit2Change; // вернем на место ровно то, что там было
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 14.04.2017 в 14:32.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
изменение полей в бд Esoone БД в Delphi 9 19.10.2012 19:37
из ADOTable в ListBox по Edit.OnChange kopoba БД в Delphi 6 19.04.2012 07:17
Очищение отдельных Edit полей. Mrsqler Общие вопросы Delphi 9 25.03.2012 19:29
Блокировка поля по событию onchange snikers987 PHP 2 01.05.2011 22:14
Событие OnChange - на одно из полей namazi74 БД в Delphi 4 22.04.2010 12:52