Domanda

Non sono sicuro di averlo spiegato al meglio, ma, eccoci qui ...

Ho 2 componenti personalizzati in un modulo, che sono collegati insieme in fase di progettazione tramite l'IDE. Ogni volta che chiamo una procedura dal componente, ottengo la violazione di accesso,

  

Violazione dell'accesso all'indirizzo 0049A614   nel modulo "Project2.exe". Leggi di   indirizzo 00000034.

Questa è una piccola sezione del mio codice

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

e ...

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 è al ***** e l'IDE si ferma qui.

Ho anche provato a fare l'assegnazione in fase di esecuzione con

Presence1.theClient := MyClient1;

senza fortuna

usando le procedure di Presence1 o MyClient1 che non si basano l'una sull'altra funzionano bene.

Delphi 7

Follow-up: dai commenti di mghie, ci ho ripensato.

Ho rimosso il componente TPresence dal modulo (che ha causato alcuni strani errori IDE, che potrebbero aver avuto qualcosa a che fare con esso) e l'ho creato in fase di progettazione, assegnando tutto ciò che era necessario. Ora funziona, ma rimettere il componente TPresence sul da riporta l'errore.

Grazie per il vostro aiuto ragazzi, dovrei essere in grado di risolverlo ora, se non riesco a riaprire un'altra domanda :)

È stato utile?

Soluzione

Sembra che tu stia pensando che l'eccezione è sollevata perché il campo client di Presence1 non è impostato - se ottieni comunque l'eccezione " Leggi l'indirizzo 00000034 " significa che il puntatore Self nella chiamata SetStatus () è nil . Ciò indicherebbe che si chiama SetStatus () su un riferimento TPresence non assegnato. Non è davvero possibile dirne la ragione dallo snippet che hai pubblicato, ma dovrebbe iniziare il debug.

Ti consiglierei comunque di scrivere un metodo setter adeguato per tutti i riferimenti ai componenti nei tuoi componenti personalizzati, in primo luogo perché hai un gancio migliore durante il debug di tali problemi (puoi impostare un punto di interruzione lì) e in secondo luogo perché dovresti sempre chiama TComponent.FreeNotification () su tali componenti collegati per poterne tracciare la distruzione e impostare il riferimento interno su zero .

Altri suggerimenti

Probabilmente avremo bisogno di più codice. È possibile che tu non stia creando correttamente un'istanza di TPresence che ti darebbe l'errore che stai riscontrando. Prova a darci uno snippet di codice il più semplice possibile che causi il tuo errore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top