Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Минимизация окна приложения на старте


Автор: MacTep 15.6.2006, 08:54
Как сделать, чтобы при старте программы, появилась главная форма программы, а потом сразу взяла и свернулась? 

Автор: Rennigth 15.6.2006, 09:01
хм, ну самое банальное что приходит в голову это на OnShow формы поставить задержку после которой минимизируй ее. Или я не правильно понял вопрос? 

Автор: MacTep 15.6.2006, 09:36
Да вот я тоже так делал. Но не работает. И что значит "поставить задержку"? Можно пример обработчика события OnShow? 

Автор: Sunr1se 15.6.2006, 10:17
Лучше уж таймер кинуть, интервал установить на 1, и на событие OnTimer прописать:
Код

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Form1.Hide;
end;



Тебе же не скрывать, а сворачивать... Тогда там же впиши
Код

  Form1.WindowState := wsMinimized;
 

Автор: Romikgy 15.6.2006, 10:24
В формкреате 
Application.Minimize; 

Автор: MacTep 15.6.2006, 10:30
Romikgy, так точно работать не будет. Пробовал... 

Автор: Romikgy 15.6.2006, 10:37
MacTep, а че у меня так работает
Код

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.Minimize;
end;
 

Автор: Rennigth 15.6.2006, 10:50
Romikgy, я как понял ему нужно чтобы окно сначала показалось а потом свернулось. в твоем случае окно сразу будет свернутым. 

Автор: Sunr1se 15.6.2006, 10:56
Тогда делать, как я предлагал, с помощью таймера... В interval ставить время, в течение которого будет видно форму, а в обработчике события OnTimer прописать
Код

Form1.WindowState := wsMinimized;

или
Код

Application.Minimize;
 

Автор: Rennigth 15.6.2006, 11:05
так симпатичней :
Код

unit Unit1;

interface

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

type
  TPauseThread = class(TThread)
  protected
    FDelay: Cardinal;
    procedure Execute; override;
  public
    constructor Create(Delay: Cardinal); reintroduce; virtual;
  end;

  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    FPauseThread: TPauseThread;
    procedure OnPTTerminate(ASender: TObject);
  end;

var
  Form1: TForm1;
  bTPSuspended: Boolean;

implementation

{$R *.dfm}

{ TPauseThread }

constructor TPauseThread.Create(Delay: Cardinal);
begin
  inherited Create(True);
  FreeOnTerminate := True;
  FDelay := Delay;
end;

procedure TPauseThread.Execute;
begin
  bTPSuspended := False;
  WaitForSingleObject(Handle, FDelay);
  bTPSuspended := True;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  FPauseThread := TPauseThread.Create(500);
  FPauseThread.OnTerminate := OnPTTerminate;
  FPauseThread.Resume;
end;

procedure TForm1.OnPTTerminate(ASender: TObject);
begin
  Application.Minimize;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if not bTPSuspended then
    WaitForSingleObject(FPauseThread.Handle, INFINITE);
end;

initialization
  bTPSuspended := True;

end.

)  

Автор: Romikgy 15.6.2006, 11:43
Rennigth, имхо для такой простой задачи, лучше уж воспользоваться таймером , чем городить отдельный поток!
И чем так симпатичней? smile 

Автор: z-END 15.6.2006, 11:52
Код

procedure TForm1.SimpleMinimize (Sender: TObject);
begin
 Application.Minimize;
FreeAndNil(Sender);
end;
procedure TForm1.FormCreate (sender: TObject);
var Minimize:TTimer;
begin
Minimize:=TTimer.Create;
Minimize.OnTimer:=SimpleMinimize;
Minimize.Interval:=1000;
Minimize.Enabled:=True;
end;

можно как-нить такsmile 

Автор: Rennigth 15.6.2006, 11:53
Romikgy, ну не люблю я таймеры  smile  

Автор: Romikgy 15.6.2006, 11:57
Rennigth, а sleep / delay

Добавлено @ 11:58 
?
ps забыл  smile  

Автор: Rennigth 15.6.2006, 13:05
Цитата(Romikgy @  15.6.2006,  11:57 Найти цитируемый пост)
Rennigth, а sleep / delay

Добавлено @ 11:58 
?
ps забыл     

имеешь ввиду Sleep + ProcessMessages?
Тож не очень, MainThread еле ползет, в часных случаях мона конечно...  smile  

Автор: Romikgy 15.6.2006, 13:25
ну дык для данной цели, причем одноразово, имхо получше нежели с потоками завязыватся, хотя для тя может потоки это семечки, а для людей, в большей массе жуть такая.... 

Автор: z-END 15.6.2006, 13:28
Цитата(Romikgy @  15.6.2006,  14:25 Найти цитируемый пост)
 хотя для тя может потоки это семечки, а для людей, в большей массе жуть такая.... 

ну батенька... потоки вещь архи-нужная и полезная, у меня практически  во всех приложениях используюется как минимим один доп. поток.
другое дело что для данной задачи это конечно извратsmile 

Автор: Romikgy 15.6.2006, 13:39
Цитата(z-END @  15.6.2006,  12:28 Найти цитируемый пост)
другое дело что для данной задачи это конечно изврат

Дык !
Цитата(z-END @  15.6.2006,  12:28 Найти цитируемый пост)
 у меня практически  во всех приложениях используюется как минимим один доп. поток.

Ну и не все приложения этого требуют smile 

Автор: z-END 15.6.2006, 13:43
Цитата(Romikgy @  15.6.2006,  14:39 Найти цитируемый пост)
Ну и не все приложения этого требуют

если приложение хеловорд, то конечно нет, а вот если у тебя идет математический обсчет, работа с файлами/удаленной БД/сетью то по человекчески неполучится сделать без потоков... 

Автор: Akella 16.6.2006, 10:39
я решил это так:
в пакете JVCL есть компонента TrayIcon - там всё ясно и понятно 

Автор: z-END 16.6.2006, 12:02
Цитата(Akella @  16.6.2006,  11:39 Найти цитируемый пост)
в пакете JVCL есть компонента TrayIcon - там всё ясно и понятно 

ага, сам им пользуюсь=)
TrayIcon1.HideApplication;
TrayIcon1.ShowApplication; 

Автор: Демо 16.6.2006, 12:12
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
     procedure Idle(Sender: TObject; var Done: Boolean);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnIdle := Idle;
end;

procedure TForm1.Idle(Sender: TObject; var Done: Boolean);
begin
  Application.Minimize;
  Application.OnIdle := nil;
end;

end.

 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)