2016-10-11 3 views
3

Wir haben ein bestimmtes Suchformular bei der Arbeit, das kürzlich überarbeitet wurde. Seine Funktionalität ist die eines Standard-Suchformulars: Geben Sie oben in einigen Feldern ein paar Kriterien ein, klicken Sie auf die Schaltfläche Suchen und zeigen Sie die Ergebnisse unten in einem Raster an. Aber es war hässlich und funktional sehr eingeschränkt, also hat einer meiner Mitarbeiter es umgebaut ... kurz bevor er zu einem neuen Job ging. Jetzt versuche ich, die letzten Details zu vervollständigen.Wie kann ich einen TVirtualStringTree-Prozessschlüssel mit einer höheren Priorität drücken?

Eine der Änderungen war das Ersetzen der alten TListBox Gitter mit einem viel stärkeren TVirtualStringTree. Aber in diesem Prozess scheint es etwas gebrochen zu haben: Vorher, wenn Sie auf eine Zeile im Raster geklickt haben (geben Sie das Raster im Fokus) und drücken Sie Geben Sie ein, der entsprechende Event-Handler würde auslösen und Ihre Eingabe bearbeiten und öffnen die Detailansicht für den ausgewählten Artikel. In diesem Raster wird jedoch TButton auf das Formular mit der Default = true Eigenschaft statt dessendrücken.

Wie kann ich die TVirtualStringTree Vorrang haben, wenn es Eingabefokus hat, so dass es auf den Benutzer reagieren wird, drücken Sie sich selbst eingeben (und vorzugsweise statt) es an das Formular zu senden?

Antwort

5

Behandeln Sie die Nachricht WM_GETDLGCODE und fügen Sie DLGC_WANTALLKEYS in den zurückgegebenen Wert ein. Zum Beispiel:

procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE; 

.... 

procedure TMyControl.WMGetDlgCode(var Message: TWMGetDlgCode); 
begin 
    inherited; 
    Message.Result := DLGC_WANTALLKEYS; 
end; 

Je nachdem, ob Ihr Steuer diese Nachricht bereits behandelt und gibt etwas anderes als 0 könnten Sie verwenden müssen:

Message.Result := Message.Result or DLGC_WANTALLKEYS; 

Wenn Sie den Code nicht ändern möchten Verwenden Sie für diese Klasse dann einen Interposer, oder legen Sie die Eigenschaft WindowProc des Steuerelements fest, um die Fensterprozedur abzufangen.

+0

Hmm ... das würde wahrscheinlich funktionieren, aber gibt es eine Lösung, die keine Änderung des Codes einer Drittanbieterkomponente erfordert? –

+0

Gern geschehen. Sie müssen den Code nicht ändern. Sie können einen Interposer verwenden oder die Fensterprozedur abfangen, indem Sie der Eigenschaft 'WindowProc' des Steuerelements zuweisen. Wenn Sie 'WM_GETDLGCODE' nicht behandeln, wird die Standardschaltfläche die Nachricht erhalten. Was du nicht willst. –

+1

Wow. Ich wusste eigentlich nicht, dass die "WindowProc" -Eigenschaft eine Sache war. Das war genau das, was ich brauchte, um es zu reparieren. Vielen Dank! –

Verwandte Themen