0

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

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

モジュール 'Project2.exe' のアドレス 0049A614 でアクセス違反が発生しました。アドレス 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 からのプロシージャを使用しても問題ありません。

デルフィ 7

フォローアップ: mghie のコメントから、私はそれについて再考しました。

フォームから TPresence コンポーネントを削除し (何らかの原因で奇妙な IDE エラーが発生したため)、設計時に作成し、必要なものをすべて割り当てました。今は動作しますが、TPresence コンポーネントを元に戻すと、エラーが再発します。

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

4

2 に答える 2

8

Presence1 の client フィールドが設定されていないために例外が発生したと考えているようですが、「アドレス 00000034 の読み取り」という例外が発生した場合は、SetStatus()呼び出しの Self ポインターがnilであることを意味します。これは、割り当てられていないTPresence参照でSetStatus()を呼び出すことを示しています。投稿したスニペットからその理由を特定することは実際には不可能ですが、デバッグを開始できるはずです。

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

于 2009-03-16T05:38:13.177 に答える
0

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

于 2009-03-16T10:28:36.613 に答える