![]() |
|
|
Регистрация | << Правила форума >> | 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. Все работает на ура. Никаких мерцаний и перепрыгиваний форм не наблюдал при десятке опытов ![]() |
#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 пока она еще открыта, сворачивается не вместе с приложением, а в левый нижний угол экрана. Но мне это не важно. В принципе вопрос решён. Всем спасибо. Но если у кого будут другие варианты буду рад увидеть. |