2017-11-21 16 views
0

iOSを使用しているときに、Delphiの仮想キーボードの「完了」ボタンの押下を検出するにはどうすればよいですか?仮想キーボードを閉じた右上隅のボタン。Delphi iOS - 終了ボタンのKeyDownの検出

+0

TFormのOnVirtualKeyboardHiddenイベントを使用します。ユーザーが[完了]ボタンをタップしたかどうかは関係ありません。同じコードが呼び出されます。 –

+0

別の方法があるかもしれませんが、FMX.VirtualKeyboard.iOSのコードを修正する必要があります。なぜなら、代替ボタンがある可能性があるため、Doneボタンが押されている(コントロールがフォーカスを失うなどの理由で)理由が何であるかを正確に説明するのに役立つかもしれません。 –

+0

私はいつも「完了」ボタンをタップします。アクションの終わり。私はユーザーが同じことを期待していると思います。 – Acid

答えて

1

あなたの質問では、FMX.VirtualKeyboard.iOSユニットを変更する必要があります。例えば、TMessageの子孫を定義するためのユニットを作成

unit VirtualKeyboardMessages; 

interface 

uses 
    System.Messaging; 

type 
    TVirtualKeyboardDoneClickedMessage = class(TMessage); 

implementation 

end. 

がFMX.VirtualKeyboard.iOSのコピーを作成し、プロジェクトに保存し、これらのステップは、あなたのソリューションへの道のほとんどを持っている必要がありますフォルダ。例えば、上記ユニットを含むように単位を変更します

implementation 

uses 
    System.Classes, System.SysUtils, System.TypInfo, System.Generics.Collections, System.UITypes, System.Types, 
    System.Messaging, System.Math, Macapi.ObjectiveC, Macapi.ObjCRuntime, Macapi.Helpers, 
    iOSapi.CocoaTypes, iOSapi.Foundation, iOSapi.UIKit, iOSapi.CoreGraphics, 
    FMX.Types, FMX.VirtualKeyboard, FMX.Platform, FMX.Forms, FMX.Platform.iOS, FMX.Consts, FMX.Helpers.iOS, 
    // Add this to the uses clause 
    VirtualKeyboardMessages; 

はIKeyboardEventsインターフェースとTKeyboardEventHandlerクラスにDoneButtonClickedメソッドを追加します。次に

procedure TCocoaVirtualKeyboardService.RefreshToolbarButtons; 
var 
    I: Integer; 
    B: UIBarButtonItem; 
    AutoReleasePool: NSAutoReleasePool; 
begin 
    // code snipped for brevity, and to avoid copyright issues 

     //Hide button 
     if FHideButton = nil then 
     begin 
     FHideButton := TUIBarButtonItem.Create; 
     FHideButton.setTitle(StrToNSStr(SEditorDone)); 
     FHideButton.setStyle(UIBarButtonItemStyleDone); 
     FHideButton.setTarget(FKeyboardHandler.GetObjectID); 
     // Following line commented out from original code: 
     // FHideButton.setAction(sel_getUid('HideVirtualKeyboard')); 
     // Following line added: 
     FHideButton.setAction(sel_getUid('DoneButtonClicked')); 
     end; 

    // code snipped for brevity, and to avoid copyright issues 
end; 

IKeyboardEvents = interface(NSObject) 
    ['{72D3A7FD-DDE3-473D-9750-46C072E7B3B7}'] 
    // code snipped for brevity, and to avoid copyright issues 

    // Add this method 
    procedure DoneButtonClicked; cdecl; 
    end; 

    TKeyboardEventHandler = class(TOCLocal) 
    strict private type 
    TKeyboardState = (Shown, Hidden); 
    private 
    FKeepFocus: Boolean; 
    // code snipped for brevity, and to avoid copyright issues 

    // Add this method 
    procedure DoneButtonClicked; cdecl; 
    end; 

procedure TKeyboardEventHandler.DoneButtonClicked; 
begin 
    HideVirtualKeyboard; 
    TMessageManager.DefaultManager.SendMessage(Self, TVirtualKeyboardDoneClickedMessage.Create); 
end; 

はRefreshToolbarButtons方法を変更します上記のVirtualKeyboardMessagesユニットを使用する必要があるフォームのTVirtualKeyboardDoneClickedMessageを購読する必要があります。私はあなたのための練習としてそれを残します。

+0

このメソッドにコメントするのはなぜですか?FHideButton.setAction(sel_getUid( 'HideVirtualKeyboard')); – Acid

+0

DoneButtonClickedメソッドがそれを置き換えるため –

0
uses VirtualKeyboardMessages; 
type 
    TMainForm = class(TForm) 
    {...} 
private 
    { Private declarations } 
    MessageManager: TMessageManager; 
    SubscriptionId: Integer; 
end; 

procedure TMainForm.FormCreate(Sender: TObject); 
begin 
    MessageManager := TMessageManager.DefaultManager; 
    SubscriptionId := MessageManager.SubscribeToMessage(TVirtualKeyboardDoneClickedMessage, procedure(const Sender: TObject; const M: TMessage) 
begin 
    ShowMessage('Done'); 
end); 
end; 

procedure TMainForm.FormDestroy(Sender: TObject); 
begin 
TMessageManager.DefaultManager.Unsubscribe(TVirtualKeyboardDoneClickedMessage, SubscriptionId); 
end; 

//フォームに1つのTEditしかない場合、現在のところ適切なソリューションです。しかし、あなたは複数の問題がある場合。そして、あなたがこのケースでは "Showmessage"のビジュアルダイアログを使用している場合、仮想キーボードは隠れていません。

+0

複数の編集があると、なぜ問題になりますか?また、なぜDoneをクリックしたときにShowMessageを使用していますか? –

+0

どのような種類のTEditが決定されないためです。私はwebbrowse( "完了"してからwebbrowser.navigate(edit.text);)に "完了キャプチャ"を使用しますが、Webページに編集があり、再度 "完了"をタップすると同じイベントが再び呼び出されます。 Showmessageまたはsimularは、ユーザーと通信する唯一の方法です。 – Acid

+0

IsFocusedを使用すると、編集にフォーカスがあるかどうかを確認できます。さらに、ActiveControlプロパティを使用してフォーカスがあるものを正確に確認してください。 「完了」をタップしたときに、何か情報をユーザーに伝えたいのはなぜですか? –

関連する問題