2016-02-08 58 views
0

我在Delphi 10 Seattle中有一個Firemonkey多設備項目,用戶可以在應用程序的開始處獲取屏幕。這裏用戶需要填寫2個字段。但是當我點擊編輯字段時虛擬鍵盤沒有顯示。如果我在開始時跳過此屏幕並稍後調用,則會顯示虛擬鍵盤。這也是以相同的方式完成的。VirtualKeyboard不顯示焦點在Firemonkey項目中編輯字段

我找到了一種解決方案: 當我點擊編輯字段時,我稱之爲顯示VirtualKeyboard自己。唯一的問題是光標不顯示在編輯字段中。

有沒有辦法讓光標自己放置?還是有人知道如何解決虛擬鍵盤不以其他方式顯示問題?

問題是在Android和iOS

在下面的代碼,你可以看到最初的形式創建。問題是當在ConnectFromProfile方法中調用actCreateNewProfileExecute時。在那裏它會調用一個新的表單。在這種形式下(TfrmProfile)虛擬鍵盤沒有顯示。我也用另一個動作調用這個表單,然後工作正常。

procedure TfrmNocoreDKS.FormCreate(Sender: TObject); 
begin 
    Inherited; 
    System.SysUtils.FormatSettings.ShortDateFormat := 'dd/mm/yyyy'; 
    CheckPhone; 
    ConnectfromProfile; 
    if not Assigned(fProfileAction) then 
    ConnectDatabase 
    Else 
    lstDocuments.Enabled := False; 

{$IFDEF ANDROID} 
    ChangeComboBoxStyle; 
{$ENDIF} 
end; 

procedure TfrmNocoreDKS.ConnectfromProfile; 
begin 
    fdmProfileConnection := TdmConnection.Create(nil); 
    fdmProfileConnection.OpenProfileDb; 
    fdmProfileConnection.LoadProfiles; 

    if fdmProfileConnection.Profiles.Count = 0 then 
    begin // Createdefault Profile 
    fProfileAction := actCreateNewProfileExecute; 
    end 
    else if fdmProfileConnection.Profiles.Count = 1 then 
    begin // one profile load connection; 
    fProfileAction := nil; 
    fCurrentProfile := fdmProfileConnection.Profiles.Items[0]; 
    end 
    else 
    begin // multiple profiles choose connection; 
    fProfileAction := SelectProfileOnStartUp; 
    end; 
end; 

procedure TfrmNocoreDKS.FormShow(Sender: TObject); 
begin 
    if Assigned(fProfileAction) then 
    fProfileAction(Self); 
end; 

procedure TfrmNocoreDKS.actCreateNewProfileExecute(Sender: TObject); 
var 
    profilename, databasename, pathname: string; 
    prf: TfrmProfile; 
begin 
    prf := TfrmProfile.Create(nil); 
    prf.Data := fdmProfileConnection.Profiles; 
    prf.ShowModal(
    procedure(ModalResult: TModalResult) 
    begin 
     if ModalResult = mrOk then 
     begin 
     profilename := prf.edtProfilename.Text; 
     databasename := prf.edtDatabaseName.Text; 

{$IFDEF IOS} 
     pathname := System.IOUtils.TPath.GetDocumentsPath; 
{$ENDIF} 
{$IFDEF ANDROID} 
     pathname := System.IOUtils.TPath.GetDocumentsPath; 
{$ENDIF} 
{$IFDEF WIN32} 
     pathname := ExtractFilePath(ParamStr(0)) + '\Data'; 
{$ENDIF} 
     FDSQLiteBackup1.Database := System.IOUtils.TPath.Combine(pathname, 
      'default.sqlite3'); // Default Database 
     FDSQLiteBackup1.DestDatabase := System.IOUtils.TPath.Combine(pathname, 
      databasename + '.sqlite3'); 
     FDSQLiteBackup1.Backup; 
     fdmProfileConnection.AddProfile(databasename + '.sqlite3', profilename); 
     fdmProfileConnection.LoadProfiles; 
     fCurrentProfile := fdmProfileConnection.Profiles.Items[0]; 
     connectDatabase; 
     end else 
     Application.Terminate; 
    end); 
end; 
+0

你的意思是'在應用程序開始時獲取屏幕'?它是一種形式還是它是一種對話? –

+0

@SergeyKrasilnikov它是一種形式。但它並不總是顯示。這取決於某些條件。 – Remi

+0

@Remi請顯示您的.dpr代碼(我認爲,登錄表單顯示在那裏(?))並指定目標平臺。 – kami

回答

2

不要在MainForm.OnCreate/OnShow中顯示任何其他表格。在iOS 9.2上嘗試此操作,在「啓動屏幕」上凍結應用程序。

取而代之的是,展示新形式異步,像這樣:

procedure TForm4.FormShow(Sender: TObject); 
begin 
    TTask.Run(procedure 
    begin 
     TThread.Synchronize(nil, procedure // work with visual controls - only throught Synchronize or Queue 
     begin 
      Form5:=TForm5.Create(Application); 
      Form5.ShowModal; 
     end) 
    end); 
end; 
五言的

,您可以將此代碼中分離到外部程序:

procedure ShowMyForm; 
begin 
    Form5:=TForm5.Create(Application); 
    Form5.ShowModal; 
end; 

procedure TaskProc; 
begin 
    TThread.Synchronize(nil, ShowMyForm); 
end; 

procedure TForm4.FormShow(Sender: TObject); 
begin 
    TTask.Run(TaskProc); 
end; 

========

另一種方式 - 不要使用任何其他形式。創建框架並將其放在MainForm上(運行時),Align = Contents。在所有需要的操作之後 - 隱藏或釋放(由於ARC不要忘記將nil設置爲幀變量)此幀。

+1

將代碼從onFormShow移動到onFormActivate後,問題就解決了。感謝您的提示! – Remi

+0

@Remi。 Imho,將代碼移到OnActivate並不是很好的解決方案。您可以進入無限循環:第二個窗體關閉 - >主窗體自動激活 - >第二個窗體顯示。再次,再次。這個解決方案將需要開發人員更多的關注 – kami

+0

不,這是不可能的。我已經添加了一個檢查,如果它啓動。 – Remi

相關問題