iOSを使用しているときに、Delphiの仮想キーボードの「完了」ボタンの押下を検出するにはどうすればよいですか?仮想キーボードを閉じた右上隅のボタン。Delphi iOS - 終了ボタンのKeyDownの検出
答えて
あなたの質問では、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を購読する必要があります。私はあなたのための練習としてそれを残します。
このメソッドにコメントするのはなぜですか?FHideButton.setAction(sel_getUid( 'HideVirtualKeyboard')); – Acid
DoneButtonClickedメソッドがそれを置き換えるため –
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"のビジュアルダイアログを使用している場合、仮想キーボードは隠れていません。
複数の編集があると、なぜ問題になりますか?また、なぜDoneをクリックしたときにShowMessageを使用していますか? –
どのような種類のTEditが決定されないためです。私はwebbrowse( "完了"してからwebbrowser.navigate(edit.text);)に "完了キャプチャ"を使用しますが、Webページに編集があり、再度 "完了"をタップすると同じイベントが再び呼び出されます。 Showmessageまたはsimularは、ユーザーと通信する唯一の方法です。 – Acid
IsFocusedを使用すると、編集にフォーカスがあるかどうかを確認できます。さらに、ActiveControlプロパティを使用してフォーカスがあるものを正確に確認してください。 「完了」をタップしたときに、何か情報をユーザーに伝えたいのはなぜですか? –
- 1. iOS - アプリケーション終了時の検出
- 2. Delphi:ウィンドウ移動の開始と終了の検出
- 3. スレッド終了の検出
- 4. Delphi:終了後のAV Delphi 6
- 5. iOS 3Dタッチピークが終了した(ポップなし)場合の検出
- 6. KeyDownでのバックスペースの検出
- 7. 検出ページ終了イベント
- 8. keydownイベントの検出(モバイル)
- 9. エディタの終了/終了を検出する
- 10. xcode IOSボタンは、ホームボタンのようなアプリケーションを終了するボタン
- 11. Delphi 10.1を終了する
- 12. ブラウザの終了タブの検出
- 13. iOS検出アプリが終了しました
- 14. Andengineの終了ボタン
- 15. スイフト:ビデオの終了を検出
- 16. アプリの終了を検出する
- 17. 終了したハングアップアプリケーションの検出
- 18. SCORM終了ボタン
- 19. コントロール終了ボタン
- 20. Delphi Indyスレッドを終了せずに終了タイムアウト
- 21. iosが終了状態のブルートゥース状態の変化を検出しました
- 22. KeyDownイベントでのアスタリスクキーの検出
- 23. iOSバッチイメージダウンロードの終了とコールバック
- 24. ActionScript 3.0の終了ボタン?
- 25. UIWebview(iOS)の戻りボタンを検出
- 26. 終了EOFが検出されない
- 27. Chrome - ブラウザ終了時に検出する
- 28. マルチスレッド(TThread)Delphiアプリケーションが終了しない
- 29. node.jsのコンソール出力の終了を検出する
- 30. Delphiのカスタムアニメーション - 衝突検出
TFormのOnVirtualKeyboardHiddenイベントを使用します。ユーザーが[完了]ボタンをタップしたかどうかは関係ありません。同じコードが呼び出されます。 –
別の方法があるかもしれませんが、FMX.VirtualKeyboard.iOSのコードを修正する必要があります。なぜなら、代替ボタンがある可能性があるため、Doneボタンが押されている(コントロールがフォーカスを失うなどの理由で)理由が何であるかを正確に説明するのに役立つかもしれません。 –
私はいつも「完了」ボタンをタップします。アクションの終わり。私はユーザーが同じことを期待していると思います。 – Acid