AV При использовании Процедуры из одного компонента, вызываемой другим

StackOverflow https://stackoverflow.com/questions/649183

Вопрос

Я не уверен, объяснил ли я это как можно лучше, но вот так...

У меня есть 2 пользовательских компонента в форме, которые соединяются во время разработки через IDE.Всякий раз, когда я вызываю процедуру из Компонента, я получаю сообщение о нарушении доступа,

Нарушение доступа по адресу 0049A614 в модуле 'Project2.exe'.Читайте о адресе 00000034.

Это небольшой раздел моего кода

TMyClient = class(TClientSocket)
{...}
end;

и...

TPresence = class(TComponent) 
 private
  ftheClient: TMyClient 
 public 
  procedure SetStatus(status: string);

 published
  property UserName : string read fUserName write fUserName;
  property theClient: TMyClient read ftheClient write ftheClient;
 end;   



procedure TPresence.SetStatus(status: string);
begin
 try
*****   if theClient = nil then
     Exception.Create('theClient  is Nil');
 except
   on e:Exception do
   MessageDlg(e.classname+', '+e.message, mtWarning, [mbOK], 0);
 end;
  {...}
end;

0049A614 находится в *****, и IDE останавливается здесь.

Я также пытался выполнить назначение во время выполнения с

Presence1.theClient := MyClient1;

безрезультатно

использование процедур из Presence1 или MyClient1, которые не зависят друг от друга, работает нормально.

Delphi 7

Последующие действия:судя по комментариям mghie, я переосмыслил это.

Я удалил компонент TPresence из формы (что вызвало некоторые странные ошибки IDE, которые, возможно, имели к этому какое-то отношение) и создал его во время разработки, назначив все, что было необходимо.Теперь это работает, но повторное включение компонента TPresence в from возвращает ошибку.

Спасибо вам за вашу помощь, ребята, я должен быть в состоянии разобраться с этим прямо сейчас, если я не смогу, я снова открою другой вопрос :)

Это было полезно?

Решение

Вы, кажется, думаете, что исключение вызвано тем, что клиентское поле Presence1 не задано - если вы, однако, получаете исключение "Чтение адреса 00000034", это означает, что указатель Self в setStatus() Установить статус() вызов - это ноль.Это означало бы, что вы звоните setStatus() Установить статус() на неназначенном Тприсутствие ссылка.На самом деле невозможно определить причину этого из опубликованного вами фрагмента, но это должно помочь вам начать отладку.

Я бы все же посоветовал вам написать правильный метод установки для всех ссылок на компоненты в ваших собственных пользовательских компонентах - во-первых, потому что у вас есть лучший хук при отладке таких проблем (вы можете установить там точку останова), а во-вторых, потому что вы всегда должны вызывать TComponent.Бесплатное уведомление() на таких связанных компонентах, чтобы иметь возможность отслеживать их уничтожение и устанавливать внутреннюю ссылку на ноль.

Другие советы

Вероятно, нам понадобится больше вашего кода.Возможно, вы неправильно создаете экземпляр TPresence, который выдал бы вам ошибку, с которой вы столкнулись.Попробуйте предоставить нам как можно более простой фрагмент кода, который вызывает вашу ошибку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top