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...]