Не прокатывает:
- Код: Выделить всё
Application.Restore;
//Application.Minimize;
Hide();
С минимайзом глючит. Когда есть ещё окна - остаются видимыми.
Как, вообще, правильно делается, с использованием TTrayIcon?
Модератор: Модераторы
Application.Restore;
//Application.Minimize;
Hide();
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls,Unit2;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
TrayIcon1: TTrayIcon;
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure TrayIcon1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.TrayIcon1Click(Sender: TObject);
begin
Show; //показ формы
TrayIcon1.Visible:=False;//скрытие иконки, хотя можешь и не скрывать...
end;
procedure TForm1.Button1Click(Sender: TObject);
begin //короче при клике идет сворачивание в трей
Hide;
Unit2.Form2.Hide;//это должен сделать для каждой формы сам кто знает какие они у тебя :)
TrayIcon1.Visible:=True;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
Unit2.Form2.Show; //ну просто при создании видно еще одну форму для примера
end;
end.
unit Unit2;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm2 }
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form2: TForm2;
implementation
Uses Unit1;
{$R *.lfm}
{ TForm2 }
procedure TForm2.Button1Click(Sender: TObject);
begin
Unit1.Form1.Button1.Click; //вызов процедуры сварачивания в трэй
end;
end.
Скрытие побочных форм, твоя задача как программиста этого никто делать не будет за тебя.
если нужно сварачивать при минимизации, то необходимо будет отлавливать сообщения, но это для винды.
Если через Screen.Forms делать, придётся заводить список форм бывших видимыми?
Application.OnMinimize подойдёт или нет?
Show; //показ главной формы
For I:=0 to Screen.FormCount-1 do //пробегаем остальные формы
if Screen.Forms[I].Tag=1 then //если Tag=1 то форма была видна
Screen.Forms[I].Show; //собственно востанавливаем видимость..
hinst писал(а):или вот ещё мой вариант: отнаследуйте все ваши формы от некой такой, которая наследуется от TForm и добавляет к ней свойство wasVisible, и тогда перед сокрытием будете ставить ей wasVisible. а когда надо будет разворачивать, опять же проверять, была ли она раньше видима по этому свойству. и не придётся заводить список
Maxizar писал(а):Смотрите вложенный файл.
osago_new [2010-07-22 17:12:34.843 Error] NO DEBUG INFO (class: EInvalidOperation [addr: 41709C]): [TCustomForm.SetFocus] frmInfoManager:TfrmInfoManager Can not focus)
osago_new [2010-07-22 17:12:45.390 Error] NO DEBUG INFO (class: EInvalidOperation [addr: 41B046]): TCustomForm.ShowModal impossible )
procedure MinInTray();
type
TFormState = record
form: TForm;
is_modal: boolean;
tb_show: TShowInTaskbar;
end;
PFormState = ^TFormState;
var i: integer;
fs: PFormState;
begin
if (vis_forms_list = nil) then vis_forms_list := TList.Create;
if (Application.MainForm.Visible) then
begin
for i := 0 to vis_forms_list.Count - 1 do
Dispose(PFormState(vis_forms_list[i]));
vis_forms_list.Clear();
// Скрываю.
for i := 0 to Screen.FormCount - 1 do
begin
if (not Screen.Forms[i].Visible) then continue;
new(fs);
with fs^ do
begin
try
form := Screen.Forms[i];
if (form <> nil) then
with form do
begin
is_modal := fsModal in FormState;
tb_show := ShowInTaskBar;
end;
except
end;
end;
vis_forms_list.Add(fs);
//Application.ProcessMessages();
end;
for i := vis_forms_list.Count - 1 downto 0 do
with PFormState(vis_forms_list[i])^ do
begin
try
if (form = nil) then continue;
form.ShowInTaskBar := stNever;
form.Hide();
except
end;
end;
end
else
begin
// Показываю.
if (vis_forms_list = nil) then Application.MainForm.ShowModal()
else
begin
for i := vis_forms_list.Count - 1 downto 0 do
if (vis_forms_list[i] <> nil) then
with PFormState(vis_forms_list[i])^ do
try
if (form = nil) then continue;
if (is_modal) then form.ShowModal()
else form.Show();
form.ShowInTaskBar := tb_show;
// Application.ProcessMessages;
except
end;
end;
end;
end;
procedure TMainForm.MenuSetupClick(Sender: TObject);
begin
if (MainForm.Tag = 1)
then MainForm.Hide
else MainForm.show;
MainForm.Tag:= abs(MainForm.Tag - 1);
end;
procedure TMainForm.FormShow(Sender: TObject);
begin
//Application.MainForm.Hide; //или
//Hide; // или
MainForm.Hide;
end;
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 240