|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Проблема. После компиляции, вылезает злосчастный "access violation at address"
Проблема вот в чем. В моей программе организован обмен между editми с двух разных форм. Обмен происходит после изменения какого либо edit. т. е. если поменялся edit на одной форме, то значение этого edit присваивается значению с таким же именем (За исключением form.) на другой форме. Проблема даже не в том чтоб понять почему (хотя хотелось бы, т. е. я понимаю что где то идет использование несуществующего значения), хотелось бы найти способ обойти эту проблему, т. е. организовать обмен таким оброазом, чтоб ошибка не вылезала (Работать то все работало бы, если не учитывать тот факт, что при создании пропадают все даные из form.create). Были попытки занести временно данные в глобальную переменную, а затем через пару секунд считать их оттуда, но этот не помогло по понятным причинам. (Delphi я начал изучать полторы недели назад.)
|
#2
|
||||
|
||||
Любое изменение в 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; Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#3
|
|||
|
|||
+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; |