Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2009, 02:07   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
Вопрос Раздельное сворачивание форм

Такая проблема. Есть Form1 на ней кнопка при нажатии на которую показывается Form2 (Form2.Show). Если нажать на значок Form1 Свернуть, то свернуться обе формы (Form1 и Form2) как этого не допустить, тоесть сворачивание должно примениться к той форме, на которой было зделано.
Shouldercannon вне форума Ответить с цитированием
Старый 26.06.2009, 02:17   #2
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Поставьте на первую форму компонент ApplicationEvents и отлавливайте событие Minimize.
Всегда рад помочь!

Последний раз редактировалось Terran; 26.06.2009 в 02:22.
Terran вне форума Ответить с цитированием
Старый 26.06.2009, 09:27   #3
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Поместите код в форму, которая должна жить "сама по себе":
Код:
............................................
  public
    { Public declarations }
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;
............................................
procedure TForm2.CreateParams(var Params: TCreateParams);
begin 
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
  Params.WndParent := GetDesktopWindow;
end;
Alter вне форума Ответить с цитированием
Старый 01.07.2010, 11:21   #4
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Какие ещё есть альтернативы данному способу?
Код:
  public
    { Public declarations }
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;
............................................
procedure TForm2.CreateParams(var Params: TCreateParams);
begin 
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
  Params.WndParent := GetDesktopWindow;
end;
Данный способ не устраивает тем, что при выводе Hint чего либо на других форма, эти формы становятся позади главной и вывести их на передний план можно только по клику на заголовоке.
Был предложен такой вариант, но он извратный
Вложения
Тип файла: rar Projects.rar (13.0 Кб, 11 просмотров)
Shouldercannon вне форума Ответить с цитированием
Старый 01.07.2010, 11:54   #5
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

А почему бы не разворачивать форму 2 по закрытию формы 1, если форма 2 уже развернута?
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 01.07.2010, 12:33   #6
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Нет. Нужен сособ представленный в прикреплённом файле в посте #4, только без Form0.

Пересмотрим систему. Убираем procedure CreateParams(var Params: TCreateParams); override; и переходим на
Код:
procedure TForm2.FormCreate(Sender: TObject);
begin
  SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_APPWINDOW);
end;
Теперь осталось решить проблему сворачиваниях всех открытых форм при сворачивании Form1 (Главной формы).

А если использовать мультипоточность?

Последний раз редактировалось Stilet; 02.07.2010 в 13:45.
Shouldercannon вне форума Ответить с цитированием
Старый 09.09.2014, 14:16   #7
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Нашёл хороший способ, но на Windows 8 он даёт сбой. На Win8 всплывает форма, которой нет на Win7.
Вот код программы
Код:
program Project;

{$R 'resources.res' 'resources.rc'} // Свой manifest

uses
  Forms,
  frm_Main in 'frm_Main.pas' {FormMain},
  frm_PreMain in 'frm_PreMain.pas' {FormPreMain},
  frm_Settings in 'frm_Settings.pas' {FormSettings};

{$R *.res}

begin
  Application.Initialize;
  Application.ShowMainForm := False;
  Application.Title := 'Test';
  Application.CreateForm(TFormPreMain, FormPreMain);
  Application.CreateForm(TFormMain, FormMain);
  Application.CreateForm(TFormSettings, FormSettings);
  Application.Run;
end.

unit frm_PreMain;

interface

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

type
  TFormPreMain = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure AppMinimize(Sender: TObject);
  end;

var
  FormPreMain: TFormPreMain;

implementation

{$R *.dfm}

procedure TFormPreMain.AppMinimize(Sender: TObject);
begin
  ShowWindow(Application.Handle, SW_HIDE);
end;

procedure TFormPreMain.FormCreate(Sender: TObject);
begin
  Application.OnMinimize := AppMinimize;
  Application.OnRestore := AppMinimize;
  Application.Minimize;
  AppMinimize(@Self);
  SetWindowLong(Application.Handle, GWL_EXSTYLE, not WS_EX_APPWINDOW);
end;

end.

unit frm_Main;

...
  private
    { Private declarations }
    SessionEnding: Boolean;
    procedure PreExit;
    procedure WMQueryEndSession(var Message: TMessage); message WM_QUERYENDSESSION; // Для корректного завершения работы Windows
  public
    { Public declarations }
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

var
  FormMain: TFormMain;

implementation

{$R *.dfm}

uses frm_PreMain, frm_Settings;

procedure TFormMain.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;

procedure TFormMain.WMQueryEndSession(var Message: TMessage);
begin
  PreExit;
  SessionEnding := True;
  Message.Result := 1;
  inherited;
end;

procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose := SessionEnding;

  if not CanClose then
  begin
    Hide;
    PopupMainMenu.Items[0].Caption := 'Показать ' + ProgramName;
  end;
end;

procedure TFormMain.FormCreate(Sender: TObject);
begin
  Caption := ProgramName;
  CoolTrayIcon1.Hint := ProgramName;
  PopupMainMenu.Items[0].Caption := 'Показать ' + ProgramName;
end;

procedure TFormMain.PreExit;
begin
  FormPreMain.Close;
end;

procedure TFormMain.PMMExitClick(Sender: TObject);
begin
  PreExit;
end;

procedure TFormMain.CoolTrayIcon1Click(Sender: TObject);
begin
  if Showing then
  begin
    Hide;
    PopupMainMenu.Items[0].Caption := 'Показать ' + ProgramName;
  end
  else
  begin
    WindowState := wsNormal;
    Show;
    Application.BringtoFront;
    PopupMainMenu.Items[0].Caption := 'Скрыть ' + ProgramName;
  end;
end;

procedure TFormMain.Button1Click(Sender: TObject);
begin
  FormSettings.WindowState := wsNormal;
  FormSettings.Show;
end;

end.

unit frm_Settings;

interface

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

type
  TFormSettings = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

var
  FormSettings: TFormSettings;

implementation

uses frm_Main;

{$R *.dfm}

procedure TFormSettings.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;

end.
Подскажите, пожалуйста, в чём проблема.
Изображения
Тип файла: jpg Win7.jpg (26.6 Кб, 128 просмотров)
Тип файла: jpg Win8.jpg (23.2 Кб, 127 просмотров)
Shouldercannon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сворачивание окон zzzzz Общие вопросы Delphi 4 20.10.2008 09:16
Сворачивание окон Blackmore Общие вопросы Delphi 1 19.05.2008 18:27
Сворачивание окон Legat Win Api 2 08.10.2007 16:36
Сворачивание формы. Diogo Общие вопросы Delphi 29 31.08.2007 10:31
Сворачивание формы s-force Общие вопросы Delphi 1 29.08.2007 19:52