AV При использовании процедуры из одного компонента, вызываемого другим - PullRequest
0 голосов
/ 16 марта 2009

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

У меня есть 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

Follow Up: Из комментариев Мги, я переосмыслил об этом.

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

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

Ответы [ 2 ]

8 голосов
/ 16 марта 2009

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

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

0 голосов
/ 16 марта 2009

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

...