Как уже сказал Дэвид Хеффернан, изменение основной формы уже запущенного приложения невозможно. Это ограничение самих окон.
То, что вы можете сделать, это обмануть и никогда не изменять основную форму, но только заставляйте ее выглядеть так, как вы.
Как вы это достигаете?
Шаг 1: добавьте код ко второй форме, чтобы создать собственную кнопку панели задач
procedure TWorkForm.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;
Шаг 2. Динамически создайте вторую форму непосредственно перед ее переключением. После его создания ранее добавленный код создаст новую кнопку панели задач для вашей второй формы.
Шаг 3: Теперь скройте вас фактическую основную форму. Скрытие также скроет принадлежащую ему кнопку панели задач. Таким образом, вы все еще показываете одну кнопку панели задач, и она принадлежит вашей второй форме.
Шаг 4: Чтобы ваша вторая форма завершила ваше приложение при его закрытии, вызовите метод Close вашей реальной основной формы из вашего второго события Forms OnClose или OnFormCloseQuery.
Если вы хотите вернуться к истинному вызову основной формы, выберите метод «Моя основная форма» вместо метода «Закрыть».
Этот подход позволяет нам быстро менять формы, поэтому только самые острые пользователи заметят короткую анимацию кнопки «Панель задач».
ПРИМЕЧАНИЕ. Если ваш второй вариант является сложным, и из-за этого требуется некоторое время для создания, вы можете создать его скрытым, а затем, как только его процесс создания завершится, покажите его и выполните обмен. В противном случае вы можете в итоге показать две кнопки панели задач, которые, как я полагаю, вы хотите избежать.
Вот краткий пример:
- LoginForm - это настоящая основная форма, созданная при запуске приложения. WorkForm - это форма, по которой пользователь будет проводить большую часть времени после входа в систему, и этот файл создается в процессе входа в систему
Форма входа в систему:
unit ULoginForm;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TLoginForm = class(TForm)
BLogIn: TButton;
procedure BLogInClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
LoginForm: TLoginForm;
//Global variable to tell us if we are only logging out or closing our program
LoggingOut: Boolean;
implementation
uses Unit2;
{$R *.dfm}
procedure TLoginForm.BLogInClick(Sender: TObject);
begin
//Create second Form
Application.CreateForm(TWorkForm, WorkForm);
//Hide Main Form
Self.Hide;
//Don't forget to clear login fields
end;
end.
Код формы работы:
unit UWorkForm;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TWorkForm = class(TForm)
BLogOut: TButton;
//Used in overriding forms creating parameters so we can add its own Taskbar button
procedure CreateParams(var Params: TCreateParams); override;
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure BLogOutClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
WorkForm: TWorkForm;
implementation
uses Unit1;
{$R *.dfm}
procedure TWorkForm.BLogOutClick(Sender: TObject);
begin
//Set to true so we know we are in the process of simply logging out
LoggingOut := True;
//Call close method to begin closing the current Form
Close;
end;
procedure TWorkForm.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;
procedure TWorkForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
//Check to see if we are in the process of simply logging out
if not LoggingOut then
begin
//If we are not in the process of logging out close the Main Form
LoginForm.Close;
//and then allow closing of current form
CanClose := True;
end
else
begin
//But if we are in the process of simply logging out show the Main Form
LoginForm.Show;
//Reset the LoggingOut to false
LoggingOut := False;
//and then alow closing of current form
CanClose := True;
end;
end;
end.