Einzelnen Beitrag anzeigen

FriendOfDelphi

Registriert seit: 21. Mai 2010
163 Beiträge
 
Delphi 5 Professional
 
#3

AW: Aufgerufene Methode erkennt aufrufendes Objekt nicht.

  Alt 25. Nov 2010, 16:12
AOwner wird normalerweise im Konstruktor von Komponenten übergeben. Der Owner ist für die Freigabe der zu erzeugenden Komponente zuständig. Der Sender ist das Objekt, was die Aktion ausgelöst hat. Zu Deiner Fehlermeldung: Du hast vermutlich dynamisch eine Komponente erzeugt, aber vergessen, ihr einen Parent (nicht zu verwechseln mit dem Owner) zuzuweisen. Der Parent ist für die Darstellung der Komponente zuständig.
Nein, ganz so einfach ist es nicht.
Ich habe 2 Units. Die eine ist nur zum Testen der Klasse/der anderen Unit gedacht.
Die Test-Unit baut zwar ein Windows-Fenster auf, aber nur weil das unter Delphi bei "\Datei\Neu\Anwendung" automatisch so erzeugt wird. Gebraucht wird das nicht.

Delphi-Quellcode:
[...schnipp...]

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  UNotifikationen; //<-- die verwendete, eigene Unit

[...schnipp...]

var
  Form1: TForm1;
  Test: TNotifikationen; //<-- die verwendete Klasse aus eigenen Unit

[...schnipp...]

procedure TForm1.FormCreate(Sender: TObject); //<-- und die beiden Methoden aus der Klasse
begin
  Test:=TNotifikationen.Create(self);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Test.Free;
end;

end.
In der zu testenden Unit tritt der Fehler auf. Dort wird aber nichts grafisches gemacht.
Zu testende Unit:
Delphi-Quellcode:
[...schnipp...]

type
  TNotifikationen = class(TWinControl)
    procedure WMAdsDeviceNotificationSRr( var Message: TMessage );
    message WM_ADSDEVICENOTIFICATIONSRr;
  private
    { Private-Deklarationen }
    LocalAddr : TAmsAddr;
    procedure AdsOpen();
    procedure AdsClose();
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

[...schnipp...]

procedure TNotifikationen.AdsOpen();
var
  VarName : PChar;
begin
  ClientPort := AdsPortOpen();
  if ClientPort > 0 then {OK}
  begin
    adsResult := AdsGetLocalAddress( @LocalAddr );
    if adsResult = 0 then {OK}
    begin
      LocalAddr.port := 801;
      {get handles}
      VarName := PChar('.SRrBuffer');
      adsResult :=
      adsResult + AdsSyncReadWriteReq( @LocalAddr, ADSIGRP_SYM_HNDBYNAME, 0, sizeof(varSRrHandle), @varSRrHandle, Length(VarName)+1, varName );

      adsNotificationAttrib.nTransMode := ADSTRANS_SERVERONCHA;
                                                                    
      adsNotificationAttrib.nMaxDelay := 250*10000;
      adsNotificationAttrib.nCycleTime := 250*10000;

      adsNotificationAttrib.cbLength := sizeof(SRrBuffer);

      AdsResult := AdsResult + //<--wenn diese Zeile ausgeführt wird, kommt die Fehlermeldung
        AdsSyncAddDeviceNotificationReq( @LocalAddr,
                                         ADSIGRP_SYM_VALBYHND,
                                         varSRrHandle,
                                         @adsNotificationAttrib,
                                         @NotificationCallback,
                                         Handle,
                                         @hNotificationSRr );

[...schnipp...]
Herzlichen Gruß
FriendOfDelphi
  Mit Zitat antworten Zitat