如果我创建如下方法:
function Login : boolean;
begin
with TMyForm.Create(Application) do
Result := ShowModal = mrOk;
end;
在dpr中
begin
Application.Initialize;
if Login then
begin
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end
else
Application.Terminate;
end.
光标在MyForm的TEdit控件上没有显示,但它有焦点。但是,如果我从其他地方调用相同的Login方法,则可以查看。它为什么会发生以及如何解决它。
以下是我的代码:
unit Unit16;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
FMX.Controls.Presentation, FMX.Edit;
type
TMyForm = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Button2: TButton;
private
{ Private declarations }
public
{ Public declarations }
end;
function Login : boolean;
var
MyForm: TMyForm;
implementation
{$R *.fmx}
function Login : boolean;
begin
with TMyForm.Create(Application) do
begin
Result := Showmodal = mrOk;
end;
end;
end.
和我的程序代码:
program Project14;
uses
System.StartUpCopy,
FMX.Forms,
Unit15 in 'Unit15.pas' {Form15} ,
Unit16 in 'Unit16.pas' {MyForm};
{$R *.res}
begin
Application.Initialize;
if Login then
begin
Application.CreateForm(TForm15, Form15);
Application.Run;
end
else
Application.Terminate;
end.
答案 0 :(得分:1)
我一直在C ++ Builder中研究同样的问题。问题似乎是ApplicationState()必须返回TApplicationState.Running才能显示游标。当Application.FRunning为true时,ApplicationState()返回Running。在Application.Run()中将Application.FRunning设置为true。
我已将以下代码添加到我的项目中,该项目将ApplicationState()替换为始终返回Running的项目。我不知道你是如何在Delphi中那样做的。
extern DELPHI_PACKAGE TApplicationState __fastcall Fmx::Forms::ApplicationState(void)
{
return TApplicationState::Running;
}
答案 1 :(得分:0)
我不是专家,也不知道是否可以解决问题,但是我遇到了完全相同的问题,所以我想我会分享我的解决方案。
我发现添加MainForm.Activate可以解决问题。我不确定为什么,但是Application.Run似乎会覆盖它,因此MainForm.Activate必须称为AFTER Application.Run。
我是通过将MainForm.Activate放在TMainForm.FormFocusChanged事件中来实现的。
要使其更有效,您甚至可以使用公共布尔变量和if语句来确保MainForm.Activate仅被调用一次(即第一次调用TMainForm.FormFocusChanged)。
这不是最干净的解决方案,但这是唯一对我有用的方法。