AV別のコンポーネントから呼び出された1つのコンポーネントのプロシージャを使用する場合

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

質問

これをできる限り詳しく説明したかどうかはわかりませんが、ここに行きます...

フォームには2つのカスタムコンポーネントがあり、IDEを介して設計時にリンクされます。コンポーネント上からプロシージャを呼び出すたびに、アクセス違反が発生します

  

アドレス0049A614でのアクセス違反   モジュール「Project2.exe」。読む   アドレス00000034。

これは私のコードの小さなセクションです

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

and ...

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コンポーネントを元に戻すとエラーが返されます。

助けてくれてありがとう、別の質問を再開できない場合は、今すぐこの問題を解決できるはずです:)

役に立ちましたか?

解決

Presence1のclientフィールドが設定されていないため、例外が発生していると考えているようです-ただし、例外<!> quot; Read of address 00000034 <!> quot;つまり、 SetStatus()呼び出しのSelfポインターは nil です。これは、未割り当ての TPresence 参照で SetStatus()を呼び出すことを示します。投稿したスニペットからその理由を伝えることは実際には不可能ですが、デバッグを開始できるはずです。

独自のカスタムコンポーネント内のすべてのコンポーネント参照に適切なセッターメソッドを記述することをお勧めします-そのような問題をデバッグするときにフックが優れているため(そこでブレークポイントを設定できます)、次に常にそのようなリンクされたコンポーネントで TComponent.FreeNotification()を呼び出して、それらの破壊を追跡し、内部参照を nil に設定します。

他のヒント

おそらくより多くのコードが必要です。 TPresenceのインスタンスを正しく作成しておらず、発生しているエラーが発生している可能性があります。エラーの原因となる可能性のある簡単なコードスニペットを提供してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top