Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.12.2009, 11:49
thelv thelv вне форума
Прохожий
 
Регистрация: 19.07.2009
Сообщения: 7
Репутация: 10
По умолчанию 2 формы:1-я скрыта. Нужно при закрытии 2-й свернуть приложение и сделать видимой 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  
Старый 16.12.2009, 12:12
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Код:
// Создание формы
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  
Старый 16.12.2009, 12:23
thelv thelv вне форума
Прохожий
 
Регистрация: 19.07.2009
Сообщения: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от NIch
при закрытии модальной формы главная появляется..

Мне нужно чтобы при закрытии 2-ой формы (та которая у вас модальная) приложение свернулось (чтоб на экране не было ни одной формы). Но чтоб при попытке развернуть приложение из панели задач показалась главная форма.

Цитата:
Сообщение от NIch
модальная нормально сворачивается

У меня в примере Form1 это главная форма, она то и не сворачивалась, после всех проделанных операций.
А второстепенную форму сворачивать пока не нужно, хотя все равно спасибо.

Последний раз редактировалось thelv, 16.12.2009 в 12:28.
Ответить с цитированием
  #4  
Старый 16.12.2009, 14:03
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Цитата:
Мне нужно чтобы при закрытии 2-ой формы (та которая у вас модальная) приложение свернулось (чтоб на экране не было ни одной формы). Но чтоб при попытке развернуть приложение из панели задач показалась главная форма.
Код:
// Закрытие модальной формы
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  
Старый 16.12.2009, 14:16
thelv thelv вне форума
Прохожий
 
Регистрация: 19.07.2009
Сообщения: 7
Репутация: 10
По умолчанию

Этот вариант тоже не годится.
Т.к. после закрытия второстепенной формы на доли секунды появляется свернутая Главная форма в левом нижнем углу экрана (над кнопкой Пуск).

Последний раз редактировалось thelv, 16.12.2009 в 16:10.
Ответить с цитированием
  #6  
Старый 16.12.2009, 18:05
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
Лампочка

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  
Старый 16.12.2009, 18:17
thelv thelv вне форума
Прохожий
 
Регистрация: 19.07.2009
Сообщения: 7
Репутация: 10
По умолчанию

К сожалению у меня Delphi 7 , и при точно таком коде мало того, что появляется на долю секунды (мерцает) Главная форма Form1 при закрытии Form2, так еще и при попытке воcстановить приложение появляются две(!) формы: Form1 и Form2, т.е. Form2 не удаляется.
Ответить с цитированием
  #8  
Старый 16.12.2009, 19:08
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Могу предложить следующий вариант:
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  
Старый 16.12.2009, 19:54
thelv thelv вне форума
Прохожий
 
Регистрация: 19.07.2009
Сообщения: 7
Репутация: 10
По умолчанию

Интересный вариант, спасибо.

Только когда уже 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 пока она еще открыта, сворачивается не вместе с приложением, а в левый нижний угол экрана.
Но мне это не важно.

В принципе вопрос решён. Всем спасибо. Но если у кого будут другие варианты буду рад увидеть.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:00.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025