-2

我有两种形式:frmMain 和 frmLogin。frmLogin 是一个可用的表单,它是在“激活”frmMain 时创建的:

procedure TfrmMain.FormActivate(Sender: TObject);
begin
If (frmLogin = Nil) Then 
frmLogin := TFrmLogin.Create(Application); 
frmLogin.WindowState := wsNormal; 
frmLogin.Showmodal;
frmLogin.free;
frmLogin:=nil;
end;

在 frmLogin 中,我将 button1 modalresult 更改为 mrOk:

procedure TfrmLogin.Button1Click(Sender: TObject);
begin
if Edit1.Text = '123456' then
 begin
modalresult:=1;
fechar:=true;

end else begin
application.MessageBox(pchar('Wrong Pass'), 'Login não autorizado',Mb_Ok+mb_iconerror);
modalresult:=0;
end;

在 button2 中,我将 modalresult 更改为 mrCancel。但是我需要当用户单击登录表单中的取消按钮时关闭并且主表单被隐藏,只显示托盘图标。我在button2中使用了以下代码:

frmMain.visible: = false

但它返回错误“无法在 OnShow 或 OnHide 中更改可见”。谁能帮我?

4

1 回答 1

2

使用消息循环将隐藏推迟到稍后的时刻:

const
  WM_USERCANCEL = WM_USER + 1;

type
  TForm245 = class(TForm)
    procedure FormActivate(Sender: TObject);
  private
  protected
    procedure WMUSERCANCEL(var Message: TMessage); message WM_USERCANCEL;
  public
  end;

procedure TForm245.FormActivate(Sender: TObject);
begin
  If (frmLogin = Nil) Then
    frmLogin := TFrmLogin.Create(Application);
  frmLogin.WindowState := wsNormal;
  if frmLogin.Showmodal = mrCancel then
    PostMessage(Handle, WM_USERCANCEL, 0, 0);
  frmLogin.free;
  frmLogin := nil;
end;

procedure TForm245.WMUSERCANCEL(var Message: TMessage);
begin
  inherited;
  Visible := false;
end;
于 2013-08-18T08:28:18.910 回答