Fangen Sie einen Mausklick auf eine beliebige VCL-Komponente und bestimmen Sie deren .Tag-Wert

8

Ich benutze ein selbst entwickeltes Übersetzungstool. (Nächstes Mal werde ich eine der Bibliotheken verwenden, wie hier beschrieben: delphi translation tool .)

Meine Übersetzer beschweren sich, dass das Übersetzen einer langen Liste von Strings schwierig ist, weil sie sie nicht im Kontext sehen (auf dem Bildschirm, auf dem sie erscheinen).

Ein Übersetzer hat einen guten Vorschlag gemacht, dass er in der Lage sein sollte, auf eine Komponente zu klicken, um ihren Text zu ändern. Ich kann das implementieren wenn Ich kann eine Möglichkeit finden, Programm weit zu haken, ein Ereignis, so dass, wenn ein Benutzer auf eine Komponente klickt, während die STRG-Taste gedrückt, ein Ereignishandler aufgerufen wird. Der Ereignishandler würde ermitteln, ob die Komponente eine .Caption -Eigenschaft hat, und wenn ja, den Wert der Tag-Komponente abrufen (und dann eine Benutzereingabe zulassen).

(Jede übersetzbare Komponente hat in ihrem Tag eine eindeutige Ganzzahl, mit der ich die .Caption der Komponente nachschlagen kann.)

Irgendwelche Vorschläge, wie man das macht? Es ist über meinem Kopf. Ich brauche so etwas wie die KeyPreview eines Formulars, aber für Mausklicks, die herausfinden würden, auf welche VCL-Komponente geklickt wurde, und den Tag-Wert bestimmen.

Tom

BEARBEITEN:

Wenn ich den Vorschlag von David H. benutze, sind die einzigen Ereignisse, die ich bekomme, wenn die App den Fokus erhält oder verliert. Was habe ich falsch gemacht?

%Vor%

EDIT 2

Ich bin fast da! FindDragTarget gibt jedoch selten etwas anderes als null zurück. Wenn ich einen riesigen Knopf mache, der den größten Teil der Kontrolle abdeckt, kann ich es manchmal zur Arbeit bringen. Die X-, Y-Koordinaten in der empfangenen tagMSG beziehen sich auf die Kontrolle. Ich hätte sie aber relativ zur Form gehabt. Verwende ich immer noch einen anderen Event-Hook als ich sollte? Irgendwelche Vorschläge:

%Vor%

ENDBEARBEITUNG:

Ich habe den obigen Code geändert, um GetCursorPos anstelle von Msg.lParam zu verwenden. Es funktioniert jetzt. Sehr cool! SO Rocks!

DANKE FÜR IHRE HILFE!

    
RobertFrank 10.11.2011, 17:06
quelle

1 Antwort

9

Ich gehe davon aus, dass es sich um eine VCL-App handelt. Für FireMonkey würde das nicht funktionieren.

  1. Fügen Sie einen Application.OnMessage -Ereignishandler hinzu.
  2. Suchen Sie im Event-Handler nach WM_LBUTTONDOWN oder vielleicht WM_LBUTTONUP und überprüfen Sie, ob der Modifier-Key-Status wie gewünscht ist, z. Die STRG-Taste ist gedrückt.
  3. Rufen Sie FindDragTarget auf, um die mit dem Mausereignis verknüpfte Position zu übergeben. Dies gibt Ihnen die Kontrolle unter der Maus, wenn es tatsächlich eine gibt (d. H. Auf nil prüfen).
  4. Tu, was immer du willst, kontrolliere das.
David Heffernan 10.11.2011, 17:17
quelle

Tags und Links