2017-11-21 35 views
0

iOS를 사용할 때 Delphi에서 가상 키보드의 "완료"버튼을 어떻게 감지합니까? 가상 키보드를 닫은 오른쪽 위 모서리에있는 버튼입니다.Delphi iOS - 완료 버튼의 KeyDown 감지

+0

TForm의 OnVirtualKeyboardHidden 이벤트를 사용하십시오. 사용자가 완료 버튼을 탭했는지 또는 다른 이유로 숨겨져 있는지 여부는 중요하지 않습니다. 동일한 코드가 호출됩니다. –

+0

다른 방법이있을 수 있지만 FMX.VirtualKeyboard.iOS에서 코드를 수정해야하므로 피할 수 있습니다. 대안이있을 수 있기 때문에 Done 버튼이 눌려지는 것을 감지 할 이유를 정확히 설명하는 데 도움이 될 수 있습니다. (대체 포커스가 없거나 다른 컨트롤과 대조적으로) –

+0

항상 "완료"버튼을 탭합니다. 행동의 끝. 나는 사용자가 같은 것을 기대한다고 생각한다. – Acid

답변

1

내 의견에 따라 FMX.VirtualKeyboard.iOS 단위를 수정해야합니다.

unit VirtualKeyboardMessages; 

interface 

uses 
    System.Messaging; 

type 
    TVirtualKeyboardDoneClickedMessage = class(TMessage); 

implementation 

end. 

이 FMX.VirtualKeyboard.iOS의 복사본을 만들고 프로젝트에 저장 :

가 TMessage 자손을 정의하기위한 장치, 예를 만듭니다 :이 단계는 솔루션에 당신에게 대부분의 방법이 있어야합니다 폴더. 그런 다음

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 방법을 수정

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 방법을 추가 : 위의 장치, 예를 포함하는 장치를 수정 위의 VirtualKeyboardMessages 유닛을 사용해야하는 양식의 TVirtualKeyboardDoneClickedMessage에 가입해야합니다. 나는 그것을 당신을위한 운동으로 남겨 둘 것입니다. 양식에 하나의은 TEdit이있는 경우

+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; 

는 // 현재 좋은 솔루션입니다. 그러나 당신은 여러 개 있다면 문제가 있습니다. 그리고 당신이 "Showmessage"이 시각적 대화 상자를 사용한다면 가상 키보드가 숨어 있지 않습니다.

+0

여러 번 편집하면 왜 문제가됩니까? 또한 Done을 ​​클릭했을 때 왜 ShowMessage를 사용하고 있습니까? –

+0

어떤 종류의 TEdit가 결정되지 않기 때문에. webbrowse ("done"then webbrowser.navigate (edit.text);)에 대해 "done capture"를 사용하지만 웹 페이지가 편집되고 다시 "done"을 탭하면 같은 이벤트가 다시 호출됩니다. Showmessage 또는 simular 유일한 방법은 사용자와 통신 할 수 있습니다. – Acid

+0

IsFocused를 사용하여 편집에 포커스가 있는지 여부를 확인할 수 있습니다. 더 나아가 ActiveControl 속성을 사용하여 포커스가 무엇인지 정확하게 확인하십시오. 사용자가 '완료'를 탭한 이유는 무엇입니까? –