Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.12.2019, 20:45
lenus lenus вне форума
Прохожий
 
Регистрация: 23.12.2019
Сообщения: 1
Версия Delphi: delphi xe2
Репутация: 10
Смущение Проблема. После компиляции, вылезает злосчастный "access violation at address"

Проблема вот в чем. В моей программе организован обмен между editми с двух разных форм. Обмен происходит после изменения какого либо edit. т. е. если поменялся edit на одной форме, то значение этого edit присваивается значению с таким же именем (За исключением form.) на другой форме. Проблема даже не в том чтоб понять почему (хотя хотелось бы, т. е. я понимаю что где то идет использование несуществующего значения), хотелось бы найти способ обойти эту проблему, т. е. организовать обмен таким оброазом, чтоб ошибка не вылезала (Работать то все работало бы, если не учитывать тот факт, что при создании пропадают все даные из form.create). Были попытки занести временно данные в глобальную переменную, а затем через пару секунд считать их оттуда, но этот не помогло по понятным причинам. (Delphi я начал изучать полторы недели назад.)
Вложения
Тип файла: rar Архив WinRAR.rar (11.1 Кбайт, 0 просмотров)
Ответить с цитированием
  #2  
Старый 24.12.2019, 08:16
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Любое изменение в Edit вызывает его метод OnChanged, если в этом методе Вы изменяете содержимое другого Edit, то у него (второго Edit) так же вызывается метод OnChanged. Если оба Edit-а изменяют содержимое друг друга, то происходит зацикливание, по кругу вызывая изменения.
Чтобы этого избежать, Вам необходимо временно назначить пустое событие на изменение в редактируемом программно Edit-е.
Выглядеть это должно примерно так:
Код:
procedure TForm1.Edit1OnChanged(Sender: TObject);
var
  OldProc: TNotifyEvent;
begin
  OldProc := Form2.Edit1.OnChanged; // Запоминаем какое событие было назначено
  Form2.Edit1.OnChanged := nil;  // Устанавливаем пустое событие
  Form2.Edit1.Text := 'new some text'; // Производим изменения
  Form2.Edit1.OnChanged := OldProc;  // Возвращаем старое событие
end;
Аналогично делаете и для "парного" Edit.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #3  
Старый 24.12.2019, 19:49
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

+1.
Только я бы просто метод написал, для того, что бы не копировать один и тот же код в разных обработчиках:
Код:
procedure TForm1.UpdateRemoteEdit(Edit : TEdit; Value : String);
var
  OldProc: TNotifyEvent;
begin
  OldProc := Form2.Edit1.OnChanged; // Запоминаем какое событие было назначено
  Edit.OnChanged := nil;  // Устанавливаем пустое событие
  Edit.Text := Value; // Производим изменения
  Edit.OnChanged := OldProc;  // Возвращаем старое событие
end;
Тогда обработчик события будет выглядеть так:
Код:
procedure TForm1.Edit1OnChanged(Sender: TObject);
begin
  UpdateRemoteEdit(Form2.Edit1,Edit1.Text);
end;
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:43.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter