Модальная форма входа в Delphi не восстанавливается после сворачивания

Я создал приложение Delphi 2010, которое отображает модальную форму входа через функцию перед Application.Initialize. Форма входа НЕ является моей основной формой. Это код моей формы входа:

unit frmLogin_u;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TfrmLogin = class(TForm)
    edtPass: TEdit;
    btnLogin: TButton;
    procedure btnLoginClick(Sender: TObject);
  private
    { Private declarations }
  public
    class function Execute: Boolean;
  end;

var
  frmLogin: TfrmLogin;

implementation

{$R *.dfm}

{ TForm2 }

procedure TfrmLogin.btnLoginClick(Sender: TObject);
begin
  if edtPass.Text = 'Delphi' then
    ModalResult :=  mrOk
  else
    MessageDlg('Incorrect password.', mtError, [mbOk], 0);
end;

class function TfrmLogin.Execute: Boolean;
begin
  with TfrmLogin.Create(nil) do
  try
    Result := ShowModal = mrOk;
  finally
    Free;
  end;
end;

end.

А вот исходный код моего приложения:

program frmLogin_p;

uses
  Forms,
  frmMain_u in 'frmMain_u.pas' {frmMain},
  frmLogin_u in 'frmLogin_u.pas' {frmLogin};

{$R *.res}

begin
  if TfrmLogin.Execute then
  begin
    Application.Initialize;
    Application.MainFormOnTaskbar := True;
    Application.CreateForm(TfrmMain, frmMain);
    Application.Run;
  end;
end.

Вот моя проблема: когда отображается форма входа, даже если для ее стиля границы установлено значение bsDialog, когда форма минимизируется путем нажатия на значок на панели задач, я не могу восстановить ее после повторного нажатия на значок панели задач. Итак, теперь мне нужно закрыть приложение через диспетчер задач и снова открыть его, потому что у меня нет возможности восстановить или закрыть его, пока оно свернуто.

Кто-нибудь может знать, почему это происходит и что я могу сделать, чтобы решить эту проблему?


person Community    schedule 10.04.2014    source источник
comment
Формы VCL полагаются на уже инициализированное приложение. Попробуйте что-то вроде этого: позвольте приложению инициализироваться, создайте основную форму (скрытую), покажите диалог входа в систему, в случае успеха покажите основную форму, в противном случае выйдите.   -  person Ondrej Kelle    schedule 10.04.2014
comment
расширяя совет @ TOndrej: используйте событие FormCreate и поместите туда свою логику входа ...   -  person whosrdaddy    schedule 10.04.2014
comment
Спасибо за быстрый ответ, ребята. Я дал программе инициализироваться и попробовал несколько вариантов: 1. Помещение всего после инициализации в блок if. Это удаляет значок с панели задач и предотвращает сворачивание через него. Единственная проблема сейчас в том, что пользователь все еще может свернуть все открытые окна с помощью Windows Key + D или щелкнув в правом нижнем углу экрана.   -  person    schedule 10.04.2014
comment
Почему вы хотите, чтобы пользователь не видел свой рабочий стол?   -  person David Heffernan    schedule 10.04.2014
comment
Application.Initialize делает немного больше, чем вызывает процессы инициализации, которые просто запускают com, если память не изменяет.   -  person David Heffernan    schedule 10.04.2014
comment
2. Я позволил создать основную форму и спрятал ее. Я выполнил свою функцию через обработчик событий FormCreate, как вы сказали. Результаты такие же, как и выше. На панели задач нет значка, но модальную форму можно свернуть.   -  person    schedule 10.04.2014
comment
Я не хочу препятствовать тому, чтобы пользователь видел рабочий стол, я просто хочу восстановить свое окно входа в систему, если оно каким-то образом стало минимальным.   -  person    schedule 10.04.2014
comment
Эта проблема, похоже, не влияет на D7. В любом случае на панели задач есть значок, и с его помощью я могу как свернуть, так и восстановить форму входа. Кстати, я использую Windows 7.   -  person GabrielF    schedule 10.04.2014
comment
Вы все время говорите о минимизации блокировки. Это проблема? Или вы хотите иметь возможность восстановить форму входа.   -  person David Heffernan    schedule 10.04.2014
comment
Я использую Delphi 2010, и да, Дэвид, я не могу восстановить его после того, как он был свернут.   -  person    schedule 11.04.2014
comment
Так ты этого хочешь? Чтобы можно было восстановить? Вы не возражаете против минимизации или сокрытия?   -  person David Heffernan    schedule 11.04.2014
comment
Application инициализируется в строке begin исходного кода проекта в разделе инициализации Control.pas. Application.Initialize просто по умолчанию инициализирует COM. Единственное, на что могут повлиять первые комментарии, - это строка MainFormOnTaskBar, до или после того, как вы покажете свою модальную форму.   -  person Sertac Akyuz    schedule 12.04.2014


Ответы (1)


если вы сделаете это так:

program Project2;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  if TForm2.Execute then
  begin
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end;
end.

не показывать значок на панели задач. Не знаю, решит ли это вашу проблему.

person maperx    schedule 11.04.2014