Verwendung von Fensterfokusnachrichten für ein Delphi-Bildschirmtastaturformular

8

Ich brauche eine integrierte numerische Tastatur auf dem Bildschirm in meiner Anwendung. Aus verschiedenen Gründen kann ich die TMS-Software oder andere Angebote kommerzieller Komponenten nicht verwenden. Ich bin sehr zufrieden mit einer unten abgebildeten buttonbasierten Lösung, aber ich kann noch nicht sehen, wie das Problem mit dem Fokusschalter gelöst werden kann, wenn das Klicken auf die Schaltfläche das Tastaturfeld aktiviert und ich die fokussierte Kontrolle verliere, in die ich die Charaktere wollte. Meine Lösung funktioniert, wenn ich die Tastaturtasten innerhalb des Zielformulars belasse, aber ich möchte eine formunabhängige Lösung. Gibt es eine Möglichkeit, die Aktivierung der Schaltfläche zu deaktivieren oder zu wissen, woher der Fokus stammt, damit ich etwas wie Scree.ActiveControl verwenden kann: = ?? um es zurück zu legen?

    
Brian Frost 06.05.2011, 10:49
quelle

3 Antworten

2

Ich weiß nicht, wie man Fenster mit dem Rahmen erstellt, der nicht fokusierbar ist, wenn man darauf klickt, also ist der folgende ohne Rand. Und wie Andreas erwähnt, benutze TSpeedButtons.

%Vor%

Und hier ist, wie das Tastaturfenster angezeigt wird

%Vor%     
user532231 06.05.2011, 13:29
quelle
5

Sie können einen TSpeedButton für diese Aufgabe auf Ihrem Keypad verwenden. TSpeedButton stählt den Fokus nicht. Aber die Form tut es. Und das ist hässlich, selbst wenn Sie den Fokus auf Ihre Hauptform zurückführen, flackert der Fokus zwischen den beiden Formen. Also würde ich versuchen, ein Formular ohne Fokus zu erstellen.

Mit einem Flag namens WS_EX_NOACTIVATE kann ein Fenster (Formular) erstellt werden, das nicht zum Vordergrundfenster wird, wenn der Benutzer darauf klickt. Außerdem bringt das System dieses Fenster nicht in den Vordergrund, wenn der Benutzer das Vordergrundfenster minimiert oder schließt.

Um ein nicht aktivierbares Formular zu erstellen, überschreiben Sie die CreateParams-Methode wie folgt:

%Vor%

Wenn Delphi ein Formular erstellt, ruft die Create-Methode die CreateWindowEx-API-Funktion auf, um das tatsächliche Fenster zu erstellen.

Vor dem Ausführen von CreateWindowEx wird die CreateParams-Methode aufgerufen. Mit CreateParams können Sie den Standardstil eines Fensters ändern, wenn es nach Ihren Anforderungen erstellt wird.

    
Andreas 06.05.2011 11:09
quelle
0

Meine endgültige Lösung ist wie folgt. Dies erzeugt ein numerisches Pad mit einem Rahmen und - ja - es wird aktiviert, wenn der Rahmen angeklickt oder in der Größe verändert wird, aber das Klicken auf die Buttons stehlt den Fokus nicht vom Zielformular / Steuerelement. CreateParams einfach zu verwenden, funktionierte nicht für mich - es schien stattdessen die WMMouseActivate-Nachricht zu benötigen.

Ich habe es mit einer Routine kombiniert, die ich gefunden habe und die den Schlüssel an das Betriebssystem sendet, nicht nur das fokussierte Steuerelement. Beachten Sie, dass der folgende Code eine einfache Unterstützung von einem Vorfahren-Formular zum Festlegen einer Standardgröße und -position voraussetzt. Danke für Ihre Hilfe.

%Vor%     
Brian Frost 07.05.2011 15:55
quelle

Tags und Links