2009-03-16 5 views
0

Ich bin nicht sicher, ob ich dies das Beste, was ich kann aber explaned habe, hier gehen wir ...AV Wenn eine Prozedur von einer Komponente von einem anderen genannt

Ich habe 2 kundenspezifische Komponenten auf einer Form, die Verbindung sind zusammen zur Design-Zeit durch die IDE. Immer, wenn ich eine Prozedur aus auf der Komponente aufrufen bekomme ich die Zugriffsverletzung,

Zugriffsverletzung bei Adresse 0049A614 in Modul ‚Project2.exe‘. Lesen von Adresse 00000034.

Dies ist ein kleiner Teil meines Code

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

und ...

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 bei der ist ***** und die Die IDE bleibt hier stehen.

Ich habe auch versucht mit

Presence1.theClient := MyClient1; 

ohne Glück

unter Verwendung von Verfahren aus Präsenz1 oder MyClient1 die assign zur Laufzeit zu tun, die auf einander funktionieren verlassen Sie sich nicht.

Delphi 7

Follow Up: von mghie Kommentare, wo ich darüber überdacht.

Ich habe die TPresence-Komponente aus dem Formular entfernt (was einige seltsame IDE-Fehler verursacht hat, die etwas damit zu tun haben könnten) und die Entwurfszeit erstellt und alles zugewiesen, was benötigt wurde. Jetzt funktioniert es, aber die TPresence Component zurück auf den from bringt den Fehler zurück.

Vielen Dank für Ihre Hilfe Jungs, ich soll diese erarbeiten nun in der Lage sein, wenn ich nicht krank andere Frage wieder öffnen kann :)

+0

Erstellen Sie nicht nur die Ausnahme. Sie müssen es auch heben. Und fangen Sie es nicht in derselben Prozedur ab. Lassen Sie es laufen, bis es einen Code erreicht, der die Ausnahme richtig behandeln kann. –

+0

yeh ich habe diesen Code in Frustration und eine Menge kopieren irgendwelche einfügen von anderen Orten usw. Ive haben die Ausnahme Handler jetzt seine Arbeit entfernt, Danke –

Antwort

8

Sie scheinen zu denken, dass die Ausnahme, weil der Client-Bereich angehoben von Presence1 ist nicht gesetzt - wenn Sie jedoch die Ausnahme "Adresse lesen 00000034" erhalten, bedeutet dies, dass der Self-Zeiger im SetStatus() Aufruf null ist. Das würde anzeigen, dass Sie SetStatus() auf einem nicht zugewiesenen TPresence Verweis aufrufen. Es ist nicht wirklich möglich, den Grund dafür aus dem von Ihnen geposteten Snippet zu ermitteln, aber es sollte Sie zum Debuggen bringen.

Ich würde Ihnen immer noch raten, eine richtige Setter-Methode für alle Komponentenreferenzen in Ihren eigenen benutzerdefinierten Komponenten zu schreiben - zuerst, weil Sie einen besseren Haken beim Debuggen solcher Probleme haben (Sie können dort einen Haltepunkt setzen), und zweitens, weil Sie sollten Rufen Sie immer TComponent.FreeNotification() auf solchen verknüpften Komponenten auf, um deren Zerstörung verfolgen zu können, und setzen Sie die interne Referenz auf null.

0

Wir brauchen wahrscheinlich mehr von Ihrem Code. Es ist möglich, dass Sie eine Instanz von TPresence nicht korrekt erstellen, die Ihnen den Fehler gibt, den Sie erfahren. Versuchen Sie, uns ein möglichst einfaches Code-Snippet zu geben, das Ihren Fehler verursacht.

Verwandte Themen