![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Завершение программы! [D7, XP]
NaRuTo © (2008-01-10 18:19:00)У меня возникла проблема. Программа находится в трее. Главная форма не показывается. При принудительном завершении её то есть при выполнение нажатие на кнопку она завершается, но если программа работает и вы нажимаете Завершение работы Windows она не даёт завершить работу. Я использовал
ShowWindow(Application.Handle,SW_HIDE);
Application.ShowMainForm:= False;
ShowWindow(Application.MainForm.Handle,SW_HIDE);
Помогите, если знаете!
NaRuTo (2008-01-10 20:37:00) [21]type
TMainForm = class(TForm)
PopupMenu1: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
ImageList1: TImageList;
Timer1: TTimer;
ListBox1: TListBox;
Timer2: TTimer;
procedure FormCreate(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
procedure ApplicationEvents1Minimize(Sender: TObject);
private
IconData: TNewNotifyIconData;
procedure SysTrayIconMsgHandler(var Msg: TMessage); message TRAY_CALLBACK;
procedure WMEndSession(var Msg: TWMEndSession); message WM_ENDSESSION;
procedure AddSysTrayIcon;
procedure ShowBalloonTips(TipInfo,TipTitle: String);
procedure DeleteSysTrayIcon;
{ Private declarations }
public
Destination: String;
procedure InstallSetup(Interval: Integer; CountPath: Integer; Wallaper: array of string);
{ Public declarations }
end;
@!!ex (2008-01-10 20:35:00) [22]> [10] NaRuTo (10.01.08 20:19)
А код главной формы можно посмотреть?
Вернее не код, а описание типа TMainForm
NaRuTo (2008-01-10 20:34:00) [23]Думаешь поможет
Dib@zol (2008-01-10 20:32:00) [24]> Startup:= Ini.ReadString('Main','Startup',Startup);
> if Startup = '' then begin
> Ini.WriteString('Main','Startup','1');
> MasterForm1.Show;
> end
> else
> Ini.WriteString('Main','Startup',Startup + '1');
Ты думаешь, что количество запусков удобнее хранить в виде длины строки, состоящей из единиц? :) Етож какая система счисления? Даж не двоичная. Однеричная! %)) А, не. там бы нули были, а не единицы... Вощем, в мемориз.
ЗЫ и процедуру проверки единичности процесса в памяти можно бы и подсократить:
...
begin
if OpenMutex(MUTEX_ALL_ACCESS, false, 'MyOwnMutex')<>0 then begin
MessageBox(0, 'Приложение уже запущено!', 'Вот так, ога', MB_OK or MB_ICONINFORMATION);
Exit;
end else CreateMutex(nil, false, 'MyOwnMutex');
...
NaRuTo (2008-01-10 20:19:00) [25]А вот и код:
program wallaper;
uses
Forms,
IniFiles,
SysUtils,
ExtCtrls,
Classes,
main in 'main.pas' {MainForm},
Windows,
master1 in 'master1.pas' {MasterForm1},
master2 in 'master2.pas' {MasterForm2},
master3 in 'master3.pas' {MasterForm3},
interval in 'interval.pas' {Form1},
wallp in 'wallp.pas' {Form2},
Preview in 'Preview.pas' {PreviewForm};
{$R *.res}
var
Ini: TiniFile;
Startup: string;
i: integer;
Destination: String;
HM: THandle;
function Check: boolean;
begin
HM := OpenMutex(MUTEX_ALL_ACCESS, false, 'MyOwnMutex');
Result := (HM <> 0);
if HM = 0 then
HM := CreateMutex(nil, false, 'MyOwnMutex');
end;
begin
if Check then begin
MessageBox(0,'Приложение уже запущено!','Вот так!',MB_OK or MB_ICONINFORMATION);
Exit;
end;
Application.Initialize;
Application.Title := 'Changeв Wallpaper';
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TMasterForm1, MasterForm1);
Application.CreateForm(TMasterForm2, MasterForm2);
Application.CreateForm(TMasterForm3, MasterForm3);
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TPreviewForm, PreviewForm);
Application.CreateHandle;
Destination:= ExtractFilePath(Application.ExeName);
Ini:= TIniFIle.Create(Destination + 'settings.cfg');
Startup:= Ini.ReadString('Main','Startup',Startup);
if Startup = '' then begin
Ini.WriteString('Main','Startup','1');
MasterForm1.Show;
end
else
Ini.WriteString('Main','Startup',Startup + '1');
Application.ShowMainForm := False;
ShowWindow(Application.Handle,SW_HIDE);
Application.Run;
end.
NaRuTo (2008-01-10 20:18:00) [26]Я прописываю эти строчки не в обрабочике onCreate, а в .dpr файле после создания главной формы
Dib@zol (2008-01-10 19:12:00) [27]И вообще, радуйся! Ты случайносмог сделать то, что кто-то (забыл за давностью лет) слёзно умолял сделать всю конференцию :)))
Dib@zol (2008-01-10 19:03:00) [28]Выложи проект целиком, или на крайняк смоделируй этот еррор на минимальном проекте. Я просто открыл делфи, и в обработчике OnCreate прописал те три строчки, что ты сюда выложил (зачем, кстати?). Винда прекрасно перезагрузилась. Или один эксперимент ещё ничего не доказывает? :)
NaRuTo (2008-01-10 18:55:00) [29]Dib@zol поверь!
Dib@zol (2008-01-10 18:35:00) [30]>если программа работает и вы нажимаете Завершение работы Windows она не даёт завершить работу.
Только из-за вот этого???
> ShowWindow(Application.Handle,SW_HIDE);
> Application.ShowMainForm:= False;
> ShowWindow(Application.MainForm.Handle,SW_HIDE);
Не верю! (с)
Нормально всё завершается. И по желанию системы, и без...
Тем более, первую и вторую строчку нужно поменять местами, а третью удалить.
Palladin (2008-01-10 18:35:00) [31]подика на OnCloseQuery формы что то замутил?
NaRuTo (2008-01-10 18:33:00) [32]Ты имеешь в виде END_SESSION
www (2008-01-10 18:30:00) [33]лови сообщение от винды, что она желает завершиться, рассылаемое всем активным процессам
NaRuTo (2008-01-10 18:26:00) [34]Никаких других функций я не ставил. Программа не может завершится по желанию системы.