![]() |
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? |
AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
Zitat:
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. |
AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
Zitat:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
Zitat:
Delphi-Quellcode:
Die Funktion selbst sieht so aus:
constructor TKlassenName.Create;
Delphi-Quellcode:
Vielleicht habe ich Dich noch nicht richtig verstanden, aber die vorgeschlagene Änderung von
AdsResult :=AdsSyncAddDeviceNotificationReq( @LocalAddr,
ADSIGRP_SYM_VALBYHND, varDaHandle, @adsNotificationAttrib, @NotificationCallback, Handle, @hNotificationDa );
Delphi-Quellcode:
in
Handle
Delphi-Quellcode:
, bzw.
self.Handle
Delphi-Quellcode:
funktioniert so nicht.
TKlassenName.Handle
Delphi-Quellcode:
ist nicht bekannt.
.Handle
|
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:
Und in der Form rufst du den Konstruktor dann mit
constructor TKlassenName.Create(AOwner: TWinControl);
begin AdsResult :=AdsSyncAddDeviceNotificationReq( @LocalAddr, ADSIGRP_SYM_VALBYHND, varDaHandle, @adsNotificationAttrib, @NotificationCallback, AOwner.Handle, @hNotificationDa ); end;
Delphi-Quellcode:
auf.
Klasse := TKlassenName.Create(self);
|
AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
Zitat:
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:
nicht
Delphi-Quellcode:
sondern
TKlassenName.Handle
Delphi-Quellcode:
({Objekt von TKlassenName}).Handle
|
AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
Zitat:
Der Compiler meldet den Fehler in der Definition des Konstruktors. |
AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
Wovon ist denn Deine Klasse abgeleitet?
|
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 |
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; |
AW: Verwendung der Variablen "Handle" aus Unit "Controls" in Klasse funktioniert nich
Zitat:
Delphi-Quellcode:
auch gemacht. Der Konstruktor wird so eingeleitet
inherited Create;
Delphi-Quellcode:
constructor TKlassenName.Create;
Zitat:
Zitat:
Ich verstehe das wahrscheinlich noch nicht. Kann ich hier irgendwo etwas darüber nachlesen, damit ich konkretere Fragen stellen kann? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:22 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