![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Вначале первая(главная) форма скрыта, а 2-я показана. При закрытии 2-й нужно свернуть приложение и сделать видимой первую форму. (Чтобы при нажатии на кнопку приложения в панели задач показалась первая форма)
Делал по-разному, например так: Project1: Код:
Application.CreateForm(TForm1, Form1); Application.ShowMainForm:=False; Application.CreateForm(TForm2, Form2); Form2.Show(); Unit2: Код:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Application.Minimize; Application.ShowMainForm:=True; form1.Visible:=true; end; Всё хорошо, но Form1 после этого не сворачивается, при попытке свернуть окно стандартным способом (кнопка в правом верхнем углу окна). Почему? и как сделать чтоб всё работало? |
|
#2
|
||||
|
||||
|
Код:
// Создание формы
procedure TForm1.FormCreate(Sender: TObject);
begin
//Скрыть главную форму
Application.ShowMainForm := False;
ShowWindow(Application.Handle, sw_Hide);
ShowWindow(Form_Main.Handle, sw_Hide);
end;
// Закрытие формы
procedure TForm1.FormClose
(Sender: TObject; var Action: TCloseAction);
begin
if MessageBox(Handle, 'Выйти?',
'Вопрос', MB_YESNO + MB_ICONQUESTION) = mrYes then
begin
//Показать главную форму
Action := caFree;
Application.ShowMainForm := True;
ShowWindow(Application.Handle, SW_RESTORE);
ShowWindow(Form_Main.Handle, SW_RESTORE);
end
else
Action := caNone;
end; |
|
#3
|
|||
|
|||
|
Цитата:
Мне нужно чтобы при закрытии 2-ой формы (та которая у вас модальная) приложение свернулось (чтоб на экране не было ни одной формы). Но чтоб при попытке развернуть приложение из панели задач показалась главная форма. Цитата:
У меня в примере Form1 это главная форма, она то и не сворачивалась, после всех проделанных операций. А второстепенную форму сворачивать пока не нужно, хотя все равно спасибо. Последний раз редактировалось thelv, 16.12.2009 в 12:28. |
|
#4
|
||||
|
||||
|
Цитата:
Код:
// Закрытие модальной формы
procedure TForm1.FormClose
(Sender: TObject; var Action: TCloseAction);
begin
if MessageBox(Handle, 'Выйти?',
'Вопрос', MB_YESNO + MB_ICONQUESTION) = mrYes then
begin
//Показать главную форму
Action := caFree;
Application.ShowMainForm := True;
ShowWindow(Application.Handle, SW_RESTORE);
ShowWindow(Form_Main.Handle, SW_RESTORE);
ShowWindow(Form_Main.Handle, SW_MINIMIZE);//Добавь строку
end
else
Action := caNone;
end; |
|
#5
|
|||
|
|||
|
Этот вариант тоже не годится.
Т.к. после закрытия второстепенной формы на доли секунды появляется свернутая Главная форма в левом нижнем углу экрана (над кнопкой Пуск). Последний раз редактировалось thelv, 16.12.2009 в 16:10. |
|
#6
|
||||
|
||||
|
Project1
Код:
Application.Initialize; Application.CreateForm(TForm1, Form1); Application.ShowMainForm:=False; Application.CreateForm(TForm2, Form2); Form2.Show(); Application.Run; Unit2 Код:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Application.ShowMainForm := true; Form1.Show; Application.Minimize; end; Поменял местами пару строк в Unit2. Все работает на ура. Никаких мерцаний и перепрыгиваний форм не наблюдал при десятке опытов Проверил на Delphi6 ибо другого нема. |
|
#7
|
|||
|
|||
|
К сожалению у меня Delphi 7 , и при точно таком коде мало того, что появляется на долю секунды (мерцает) Главная форма Form1 при закрытии Form2, так еще и при попытке воcстановить приложение появляются две(!) формы: Form1 и Form2, т.е. Form2 не удаляется.
|
|
#8
|
||||
|
||||
|
Могу предложить следующий вариант:
Project1: Код:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm1, Form1);
Application.Run;
end.Unit1 Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Application.Terminate;
end;
end.Unit2: Код:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm2 = class(TForm)
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormCreate(Sender: TObject);
private
procedure AppRestore(Sender: TObject);
public
{ Public declarations }
end;
var
Form2: TForm2;
F2Closed: Boolean = false;
implementation
uses Unit1;
{$R *.dfm}
procedure TForm2.AppRestore(Sender: TObject);
begin
if F2Closed then
Form1.Show;
end;
procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := false;
Form2.Hide;
Application.Minimize;
F2Closed := true;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
Application.OnRestore := AppRestore;
end;
end.![]() |
|
#9
|
|||
|
|||
|
Интересный вариант, спасибо.
Только когда уже Form1 восстанавливаем из панели задач, то при нажатии на кнопку сворачивания на форме, она сворачивается в левый нижний угол экрана (над кнопкой пуск). [это понятно, ведь Form2 мы не убили, а она - главная форма при таком коде Project1! ] И еще один баг - это мерцание кнопки приложения на панели задач при закрытии Form2 (она пропадает на долю секунды и появляется заново). Вот вродебы мне удалось создать полностью рабочий код, тоже с определением Application.onRestore. Project1 Код:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.ShowMainForm:=False;
Application.CreateForm(TForm2, Form2);
Form2.Show();
Application.Run;
end.Unit1 Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure onRestore(Sender:tobject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.onRestore(Sender:TObject);
begin
Form1.Visible:=True;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnRestore:=onRestore;
end;
end.Unit2 Код:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm2 = class(TForm)
procedure FormClose(Sender: TObject; var Action: TCloseAction);
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
uses
Unit1;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action:=caNone;
DestroyWindow(handle);
Application.Minimize;
end;
end.Тут я использую функцию DestroyWindow, чтобы закрытие Form2 не удаляло значок приложения из панели задач, как это случалось в случае если просто сделать close(). И приходится при Appication.onRestore, самому сделать Form1 видимой. Способ дурацкий, наверно можно проще как-то, если WinApi получше знать. И еще один баг остался: Form2 пока она еще открыта, сворачивается не вместе с приложением, а в левый нижний угол экрана. Но мне это не важно. В принципе вопрос решён. Всем спасибо. Но если у кого будут другие варианты буду рад увидеть. |