Herausfinden, von welchem Steuerelement auf der Form das folgende Handle stammt...
-
Hallo liebes Forum.
Ich habe folgendes Problem:
Immer nach Aufruf einer eigenen Methode empfängt die Form die KeyDown Message
für VK_LEFT. Das Problem ist jetzt, dass ich null Plan habe, wann und welches
Steuerelement diese Message schickt. Ich bin jede einzelne Zeile der Methode und
anderer Methoden, die auch aufgerufen mit Haltepunkten durchgegangen, und
irgendwann, zwischen zwei Haltepunkten empfängt die Form halt diese Message.
Ich schicke aber nie eine solche Message, und die Taste drücke ich auch nicht.
Wenn ich diese Msg dann in OnKeyDown der Form auswerte (KeyPreview ist übrigens
true) habe ich ja die Möglichkeit, mir über Sender das Handle des Steuerelements
zu holen, welches die Message geschickt hat. Da ich aber ziemlich viele Steuer-
elemente auf der Form habe, kann ich ja nicht jedes einzelne überprüfen...
Deshalb frage ich, ob es irgendwie eine Möglichkeit gibt, über das Handle an den
Namen einer Komponente zu kommen... ? Geht das? Oder wie könnt ich das Problem
lösen? Ich habe null Plan...Dankeschön
Mfg Aoeke
-
Endlich kann ich auch mal helfen *froi*
Hab n bischen rumprobiert, hätte dir aber auch einfallen können...HANDLE hHandle=Button1->Handle; for(int i=0;i<ComponentCount;i++) { if(hHandle==static_cast<TWinControl *>(Components[i])->Handle) Label1->Caption=Components[i]->Name; }
-
Naja ganz so leicht ist es nun doch nicht...
Ich weiß ja nicht, ob das Handle von nem Button kommt... Ich weiß nur, dass
es :01171E18 ist... Mehr habe ich ja nicht...
Das könnte von allem möglichen das Handle sein.....
Trotzdem danke für deine Mühe...
-
Hast du dir den Quelltext überhaupt durchgelesen???hHandle kann ja alles Mögliche sein, das mit dem Button war nur ein Beispiel... Setz einfach für hHandle immer dein eigenes ein...
Das da liefert dir den Namen des Steuerelements auf deiner Form von dem das Handle ist... DAS wolltest du doch, oder?
[ Dieser Beitrag wurde am 13.06.2003 um 20:28 Uhr von aaaabyx editiert. ]
-
Schneller:
TWinControl* GetControlByHandle(HWND handle) { TWinControl* retVal = NULL; for(int i=0; i < ControlCount; ++i) { TControl* control = Controls[i]; if( control->ClassNameIs("TWinControl") ) if( ((TWinControl*)control)->Handle == handle ) { retVal = Controls[i]; break; } } return retVal; }
-
Oh sorry aaaabyx, seh ich wirklich erst jetzt... Das mit dem Button
hatte mich irritiert... SORRY...
Ich werde beides mal ausprobieren... mal sehen vielleicht heute noch...
Danke jedenfalls...
MfG Aoeke
-
Hi...... Ich hatte es jetzt so gemacht:
// in OnKeyDown der Form (KeyPreview = true) Label1->Caption = ( ( TWinControl* )Sender )->Name;
Da kam dann aber natürlich der Name der Form, da diese ja als erstes (wegen
KeyPreview) diese Message erhält...
Also erstelle ich mir jetzt wahrscheinlich für alle Steuerelemente ein OnKeyDown
Ereigniss und prüf das dann nach...Muss ich mal sehen....
Trotzdem DANKE euch beiden!!!MfG Aoeke
[ Dieser Beitrag wurde am 14.06.2003 um 10:05 Uhr von Aoeke editiert. ]
-
(Vermutlich) noch Schneller und vor Allem vor AccessVoilations und den bösen C-Style-Casts sicher:
TWinControl* GetControlByHandle(HWND handle) { TWinControl* retVal = NULL; for(int i=0; i < ControlCount; ++i) { retVal = dynamic_cast<TWinControl *>(Controls[i]); if( retVal && retVal->Handle == handle ) break; else retVal = NULL; } return retVal; }
@Aoeke Deine Lösung ist böse. Was machst du wenn Sender gar kein TWinControl ist? Dann wird der Zeiger falsch gecastet und eine AccessVoilation ist das Ergebnis.
@Fritzi: Willkommen zurück (o; Trotzdem sind C-Style-Casts böse (o;
-junix
-
Original erstellt von junix:
@Fritzi: Willkommen zurück (o;Danke.
-
joh,WebFritzi ist wieder da
*freu*