Delphi - 如果使用project by方法创建表单,则TEdit不显示游标

时间:2016-02-24 13:45:13

标签: delphi firemonkey

如果我创建如下方法:

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.

2 个答案:

答案 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)。

这不是最干净的解决方案,但这是唯一对我有用的方法。