Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nicht (https://www.delphipraxis.net/153257-verwendung-der-variablen-handle-aus-unit-controls-klasse-funktioniert-nicht.html)

FriendOfDelphi 27. Jul 2010 10:42

Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nicht
 
Hallo Allerseits,

ich habe eine Frage zu der Variablen "Handle".

Wenn ich mit dem Mauszeiger in der IDE über die Variable fahre, erhalte ich die Information "prop TWinControl.Handle - Control.pas".
Sofern ich dies richtig interpretiere, dann bedeutet dies, dass diese Variable in der Delphi Standard Unit "Controls" definiert ist.

Soweit so gut.

Ich habe nun folgendes Problem:

Schreibe ich ein Programm, in welchem die Variable "Handle" verwendet wird prozedural, also mit Funktionen und Prozeduren, so funktioniert alles fehlerfrei.

Nun möchte ich das Programm auf Klassen und Objekte umstellen.
Sobald ich den Programmteil, der die Variable "Handle" enthält in eine Klasse auslagere, erhalte ich die Fehlermeldung "Undefinierter Bezeichner: 'Handle'" vom Compiler, obwohl ich natürlich unter uses Controls mit eingebunden habe.

Weiß jemand von Euch was ich falsch mache?

himitsu 27. Jul 2010 10:50

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Zitat:

verwendet wird prozedural, also mit Funktionen und Prozeduren, so funktioniert alles fehlerfrei.
Sicher daß du prozedual meinst und nicht "Methode meiner Form" ?

Handle in soeiner Methode entspricht self.Handle , also z.B. Form1.Handle ... jedes (fast) WinControl enthält ein "Handle", bzw ein Property names Handle, über welches man von der VCL auf das enthaltene/gekapselte Windows-Control zugreifen kann.

FriendOfDelphi 27. Jul 2010 14:05

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Zitat:

Zitat von himitsu (Beitrag 1037815)
Sicher daß du prozedual meinst und nicht "Methode meiner Form" ?

Ja, richtig. Ist in einer ganz normalen
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
Zitat:

Zitat von himitsu (Beitrag 1037815)
Handle in soeiner Methode entspricht self.Handle , also z.B. Form1.Handle ... jedes (fast) WinControl enthält ein "Handle", bzw ein Property names Handle, über welches man von der VCL auf das enthaltene/gekapselte Windows-Control zugreifen kann.

Nun habe ich mir eine Klasse gebaut und will das Ganze im Konstruktor unterbringen:
Delphi-Quellcode:
constructor TKlassenName.Create;
Die Funktion selbst sieht so aus:
Delphi-Quellcode:
AdsResult :=AdsSyncAddDeviceNotificationReq( @LocalAddr,
                 ADSIGRP_SYM_VALBYHND,
                 varDaHandle,
                 @adsNotificationAttrib,
                 @NotificationCallback, Handle, @hNotificationDa );
Vielleicht habe ich Dich noch nicht richtig verstanden, aber die vorgeschlagene Änderung von
Delphi-Quellcode:
Handle
in
Delphi-Quellcode:
self.Handle
, bzw.
Delphi-Quellcode:
TKlassenName.Handle
funktioniert so nicht.
Delphi-Quellcode:
.Handle
ist nicht bekannt.

blackfin 27. Jul 2010 14:09

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Das CodeInsight sagt dir ja nur, dass "handle" deines Controls in der unit "classes.pas" deklariert ist.
Handle ist hier die Eigenschaft des Controls, aber nicht der Variablen-Typ.
Der ist nämlich HWND und ist in der unit windows deklariert.

Edit:
Wenn deine Klasse nicht von TWinControl abgeleitet ist, dann hat sie auch kein Handle.
In deiner FormCreate()-Funktion bezieht sich ja das Handle auf das der Form, nicht deiner Klasse.
Brauchst du das Handle der Form in der Klasse, musst du diese dem Konstruktor übergeben, z.B:

Delphi-Quellcode:
constructor TKlassenName.Create(AOwner: TWinControl);
begin
 AdsResult :=AdsSyncAddDeviceNotificationReq( @LocalAddr,
                 ADSIGRP_SYM_VALBYHND,
                 varDaHandle,
                 @adsNotificationAttrib,
                 @NotificationCallback, AOwner.Handle, @hNotificationDa );
end;
Und in der Form rufst du den Konstruktor dann mit
Delphi-Quellcode:
Klasse := TKlassenName.Create(self);
auf.

himitsu 27. Jul 2010 14:16

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Zitat:

Zitat von FriendOfDelphi (Beitrag 1037869)
Ja, richtig. Ist in einer ganz normalen
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);

also sind es Methoden

Tja, und das Handle gehört nunmal zu deiner TForm1-Klasse.

Self ist immer die Klasse, bzw. das Objekt, in welcher sich die Methode befindet.
Also das Self in deiner TKlassenName zeigt auf die TKlassenName (bzw. auf das davon erstellte Objekt).
Und das Self in deiner TForm1 zeigt auf das TForm1-Objekt.


Zitat:

bzw.
Delphi-Quellcode:
TKlassenName.Handle
funktioniert so nicht.
.Handle ist ein Property des Objekts und nicht ein Class-Property der Klasse ... es ist also nur über ein Objekt erreichbar.

nicht
Delphi-Quellcode:
TKlassenName.Handle
sondern
Delphi-Quellcode:
({Objekt von TKlassenName}).Handle

FriendOfDelphi 3. Aug 2010 16:15

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Zitat:

Zitat von himitsu (Beitrag 1037874)
Zitat:

bzw.
Delphi-Quellcode:
TKlassenName.Handle
funktioniert so nicht.
.Handle ist ein Property des Objekts und nicht ein Class-Property der Klasse ... es ist also nur über ein Objekt erreichbar.

nicht
Delphi-Quellcode:
TKlassenName.Handle
sondern
Delphi-Quellcode:
({Objekt von TKlassenName}).Handle

Ja, aber es besteht doch zu dieser Zeit noch kein Objekt.
Der Compiler meldet den Fehler in der Definition des Konstruktors.

DeddyH 3. Aug 2010 16:23

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Wovon ist denn Deine Klasse abgeleitet?

himitsu 3. Aug 2010 16:38

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Normaler Weise wird ja vorher (sollte man zumindestens am Anfang machen) via inherited die Vorfahrenklasse eingerichtet, womit also die Grundlagen für ein Handle gelegt werden. Im Getter von .Handle wird dann über .HandleNeeded geprüft, ob es existiert und wenn nicht, dann wird Eines erstellt.

Aber dafür muß es aber auch ein Handle geben.
Also wenn du keines einrichtest/erzeugst, dann muß die Vorfahrenklasse dafür ausgelegt sein ... also es muß irgendwo von TWinControl abgeleitet worden sein.

TForm hat dieses als Vorfahre und darum gibt es dort auch das Property .Handle .
Deine Klasse wurde anscheinend nicht von sowas abgeleitet und darum gibt's da auch kein Handle (das wurde dir aber auch schon mehrmals gesagt).
Lösung:
- anderer Vorfahre
- oder man besorgt sich das nötige Handle wo anders (auch dieses wurde dir schon vorgeschlagen)
- oder man erstellt sich extra ein MessageOnlyWindows (und nimmt dessen Handle), wenn man Messages empfangen muß
- oder man kommt ohne soein Handle aus

Andreas L. 3. Aug 2010 17:16

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Warum nicht das Applikations-Handle verwenden?

Delphi-Quellcode:
[
uses
  ..., Forms;

...

begin
  h := Application.Handle;
  ...
end;

FriendOfDelphi 3. Aug 2010 17:45

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Zitat:

Zitat von himitsu (Beitrag 1039259)
Normaler Weise wird ja vorher (sollte man zumindestens am Anfang machen) via inherited die Vorfahrenklasse eingerichtet, womit also die Grundlagen für ein Handle gelegt werden. Im Getter von .Handle wird dann über .HandleNeeded geprüft, ob es existiert und wenn nicht, dann wird Eines erstellt.

Das habe ich mit
Delphi-Quellcode:
inherited Create;
auch gemacht. Der Konstruktor wird so eingeleitet
Delphi-Quellcode:
constructor TKlassenName.Create;
Zitat:

Zitat von himitsu (Beitrag 1039259)
Aber dafür muß es aber auch ein Handle geben.
Also wenn du keines einrichtest/erzeugst, dann muß die Vorfahrenklasse dafür ausgelegt sein ... also es muß irgendwo von TWinControl abgeleitet worden sein.

Wie kann ich das prüfen, bzw. herausfinden?
Zitat:

Zitat von himitsu (Beitrag 1039259)
TForm hat dieses als Vorfahre und darum gibt es dort auch das Property .Handle .
Deine Klasse wurde anscheinend nicht von sowas abgeleitet und darum gibt's da auch kein Handle (das wurde dir aber auch schon mehrmals gesagt).
Lösung:
- anderer Vorfahre
- oder man besorgt sich das nötige Handle wo anders (auch dieses wurde dir schon vorgeschlagen)
- oder man erstellt sich extra ein MessageOnlyWindows (und nimmt dessen Handle), wenn man Messages empfangen muß
- oder man kommt ohne soein Handle aus

Tut mir leid, dass ich hier anscheinend so dumme Fragen stelle.
Ich verstehe das wahrscheinlich noch nicht.
Kann ich hier irgendwo etwas darüber nachlesen, damit ich konkretere Fragen stellen kann?

DeddyH 3. Aug 2010 17:48

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Nochmal: wovon ist Deine Klasse abgeleitet?

FriendOfDelphi 3. Aug 2010 17:57

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Zitat:

Zitat von DeddyH (Beitrag 1039257)
Wovon ist denn Deine Klasse abgeleitet?

Vielleicht ist das der Fehler!?
Ich habe das so gemacht:
Delphi-Quellcode:
TKlassenName = class(TObject)
.

DeddyH 3. Aug 2010 18:02

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Nicht TObject, sondern TWinControl, dann hast Du auch ein Handle.

FriendOfDelphi 5. Aug 2010 11:52

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Zitat:

Zitat von DeddyH (Beitrag 1039298)
Nicht TObject, sondern TWinControl, dann hast Du auch ein Handle.

Ja, dass war der entscheidende Hinweis.
Das Handle ist nun bekannt.

Ich erhalte dann folgende Fehlermeldung vom Compiler: "Nicht genügend wirkliche Parameter" für die Zeile mit dem
Delphi-Quellcode:
inherited Create;
.
Da meine Klasse nun eine Erweiterung der TWinControl-Klasse, bzw. von dieser abgeleitet ist, muss hier die Create-Methode von TWinControl verwendet werden. Richtig?
Die ist so deklariert:
Delphi-Quellcode:
constructor Create : procedure(AOwner: TComponent)
.

Welchen Parameter muss ich denn in die Klammern des Create schreiben?

DeddyH 5. Aug 2010 11:57

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Was macht denn das "procedure" da? Normalerweise sieht das so aus:
Delphi-Quellcode:
type
  TBlubb = class(TwinControl)
  ...
  public
    constructor Create(AOwner: TComponent); override;

FriendOfDelphi 5. Aug 2010 12:20

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Zitat:

Zitat von DeddyH (Beitrag 1039725)
Was macht denn das "procedure" da? Normalerweise sieht das so aus:
Delphi-Quellcode:
type
  TBlubb = class(TwinControl)
  ...
  public
    constructor Create(AOwner: TComponent); override;

Nein, nein, dass habe nachgeguckt, indem ich
Delphi-Quellcode:
TWinControl.
in der IDE eingegeben habe. Der Compiler macht ja dann Vorschläge, welche Methoden es in TWinControl gibt. Und für Create hat er eben die Deklaration
Delphi-Quellcode:
constructor Create : procedure(AOwner: TComponent)
genannt.

Ich habe das so gemacht:
Delphi-Quellcode:
[...]
TBlubb = class(TWinControl)
[...]
  public
    constructor Create;
[...]
constructor TSoftSPS.Create;
var
  i, j: integer;
begin
  inherited Create;
[...]
Und da meldet der Compiler dann in der Zeile mit dem
Delphi-Quellcode:
inherited Create;
: "Nicht genügend wirkliche Parameter".

DeddyH 5. Aug 2010 13:20

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Mach es doch einfach mal so, wie ich es geschrieben hatte.

FriendOfDelphi 5. Aug 2010 13:46

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Zitat:

Zitat von DeddyH (Beitrag 1039747)
Mach es doch einfach mal so, wie ich es geschrieben hatte.

Das habe ich ja gemacht:
Delphi-Quellcode:
[...]
TBlubb = class(TWinControl)
[...]
  public
    constructor Create(AOwner: TComponent); override;
[...]
constructor TBlubb.Create;
var
  i, j: integer;
begin
  inherited Create;
[...]
Der Fehler ist jedoch gleich geblieben: "Nicht genügend wirkliche Parameter" für die Zeile mit dem
Delphi-Quellcode:
inherited Create;
. Da dem Create etwas übergeben werden muss. Ich weiss aber nicht was.
Grundsätzlich sollte das ja der Konstruktor meiner eigenen Klasse sein, dem ich gar nichts übergeben will.

DeddyH 5. Aug 2010 13:49

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Delphi-Quellcode:
constructor TBlubb.Create(AOwner: TComponent);
var
  i, j: integer;
begin
  inherited Create(AOwner);
  //oder alternativ, da gleiche Parameter
  inherited;

FriendOfDelphi 5. Aug 2010 14:13

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Zitat:

Zitat von DeddyH (Beitrag 1039757)
Delphi-Quellcode:
constructor TBlubb.Create(AOwner: TComponent);
var
  i, j: integer;
begin
  inherited Create(AOwner);
  //oder alternativ, da gleiche Parameter
  inherited;

Ja, so funktioniert das.
Kannst Du mir bitte noch ein bisschen was dazu sagen warum man das so machen muss?
Oder einen Link senden, wo zu der Thematik etwas steht?
Vielen Dank für Deine Hilfe :-D

DeddyH 5. Aug 2010 14:33

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Eigentlich ganz einfach: der Konstruktor der Basisklasse TWinControl erwartet einen Parameter vom Typ TComponent. Rufst Du nun diesen mit Namen auf, musst Du auch den Parameter übergeben. Unterscheidet sich Dein Konstruktor nicht von dem der Basisklasse, so kannst Du einfach inherited ohne den Methodennamen aufrufen, da der Compiler das dann automatisch auflösen kann. Dies gilt übrigens für alle abgeleiteten Methoden.

FriendOfDelphi 6. Aug 2010 12:59

AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
 
Vielen Dank für die Hilfe.
Für mich ist meine Frage damit zunächst einmal beantwortet.
Ich schließe daher dieses Thema als beantwortet ab.
Sofern sich weitere Fragen ergeben, werde ich diese mit einem neuen Thema eröffnen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz