Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.03;
Скачать: CL | DM;

Вниз

Завершение программы!   Найти похожие ветки 

 
NaRuTo   (2008-01-10 18:19) [0]

У меня возникла проблема. Программа находится в трее. Главная форма не показывается. При принудительном завершении её то есть при выполнение нажатие на кнопку она завершается, но если программа работает и вы нажимаете Завершение работы Windows она не даёт завершить работу. Я использовал
ShowWindow(Application.Handle,SW_HIDE);
Application.ShowMainForm:= False;
ShowWindow(Application.MainForm.Handle,SW_HIDE);
Помогите, если знаете!


 
NaRuTo   (2008-01-10 18:26) [1]

Никаких других функций я не ставил. Программа не может завершится по желанию системы.


 
www   (2008-01-10 18:30) [2]

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


 
NaRuTo   (2008-01-10 18:33) [3]

Ты имеешь в виде END_SESSION


 
Palladin ©   (2008-01-10 18:35) [4]

подика на OnCloseQuery формы что то замутил?


 
Dib@zol ©   (2008-01-10 18:35) [5]

>если программа работает и вы нажимаете Завершение работы Windows она не даёт завершить работу.

Только из-за вот этого???
> ShowWindow(Application.Handle,SW_HIDE);
> Application.ShowMainForm:= False;
> ShowWindow(Application.MainForm.Handle,SW_HIDE);

Не верю! (с)
Нормально всё завершается. И по желанию системы, и без...
Тем более, первую и вторую строчку нужно поменять местами, а третью удалить.


 
NaRuTo   (2008-01-10 18:55) [6]

Dib@zol поверь!


 
Dib@zol ©   (2008-01-10 19:03) [7]

Выложи проект целиком, или на крайняк смоделируй этот еррор на минимальном проекте. Я просто открыл делфи, и в обработчике OnCreate прописал те три строчки, что ты сюда выложил (зачем, кстати?). Винда прекрасно перезагрузилась. Или один эксперимент ещё ничего не доказывает? :)


 
Dib@zol ©   (2008-01-10 19:12) [8]

И вообще, радуйся! Ты случайно смог сделать то, что кто-то (забыл за давностью лет) слёзно умолял сделать всю конференцию :)))


 
NaRuTo   (2008-01-10 20:18) [9]

Я прописываю эти строчки не в обрабочике onCreate, а в .dpr файле после создания главной формы


 
NaRuTo   (2008-01-10 20:19) [10]

А вот и код:
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.


 
Dib@zol ©   (2008-01-10 20:32) [11]

> 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:34) [12]

Думаешь поможет


 
@!!ex ©   (2008-01-10 20:35) [13]

> [10] NaRuTo   (10.01.08 20:19)

А код главной формы можно посмотреть?
Вернее не код, а описание типа TMainForm


 
NaRuTo   (2008-01-10 20:37) [14]

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:44) [15]

> [14] NaRuTo   (10.01.08 20:37)

Вооот.
А теперь неплохо было бы посмотреть реализацию методов FormClose и WMEndSession


 
NaRuTo   (2008-01-10 20:47) [16]

В FormClose я только указал Action:= caFree;
а вот
WMEndSession
procedure TMainForm.WMEndSession(var Msg: TWMEndSession);
begin
  if Msg.EndSession = True then
    Close();
  inherited;
end;


 
Dib@zol ©   (2008-01-10 21:23) [17]

А можно нескромный вопрос? А нафига вообще было ставить свои обработчики?

> if Msg.EndSession = True then Close();

Во-первых, постфикс " = True " это моветон. Грубо говоря, компилятор это интерпретирует как
if (Логическая_переменная = True) = True then...

итого - имеем одно лишнее сравнение, что к тому же не добавит изящества коду.

Так что впредь пиши просто:
if Логическая_переменная then...

Насчёт " = False " - ну тут уж ничего не поделаешь, разве что вместо него if not Логическая_переменная then писать. А можно и = False оставить. Без разницы.

Так. О чём бишь я? Ах да, о коде.
Чему ты удивляешься, если сам прописал "не выключаться" при приходе WM_ENDSESSION? Сам факт прихода етой мессаги означает, что нужно без разговоров выключаться! Это вам не WM_QUERYENDSESSION! Вощем, убирай обработчик EndSession"a и жЫви спокойно :) Или вразумительно объясняй, на кой чорт он тебе нужен :)


 
NaRuTo   (2008-01-10 21:32) [18]

Она у меня и без этого обработчика не выключается. Я добавил его из Delphi World


 
@!!ex ©   (2008-01-10 21:34) [19]

> [18] NaRuTo   (10.01.08 21:32)

Application.Terminate ? ^))


 
NaRuTo   (2008-01-11 19:30) [20]

Не помогает!


 
Сергей М. ©   (2008-01-11 19:33) [21]


> Не помогает


Помыль - поможет


 
NaRuTo   (2008-01-11 19:37) [22]

Помыль поможет

Так тоже не помагает


 
{RASkov} ©   (2008-01-11 19:39) [23]

> [22] NaRuTo   (11.01.08 19:37)
> Так тоже не помагает

Попроси кого нибудь... только не на форуме, а "вживую")


 
{RASkov} ©   (2008-01-11 19:40) [24]

> [22] NaRuTo   (11.01.08 19:37)

У тебя 7 форм и все создаются "автоматом" смотри у всех вот этот обработчик OnCloseQuery...


 
Сергей М. ©   (2008-01-11 19:47) [25]

Что, даже с мылом не лезет ?


 
Dib@zol ©   (2008-01-11 19:51) [26]

Неа :(

Вощем, аффтару: выкладывай код, а мы почитаем. А также укажем где грабли :)


 
Dib@zol ©   (2008-01-11 19:52) [27]

ЗЫ только не напрямую на форум!!! Лучше на внешний файлообменник, напр на этот: http://www.webfile.ru


 
NaRuTo   (2008-01-11 19:56) [28]

Как на этом сайте та работать!


 
{RASkov} ©   (2008-01-11 19:57) [29]

> [28] NaRuTo   (11.01.08 19:56)
> Как на этом сайте та работать!

Никто не заставляет :)


 
Сергей М. ©   (2008-01-11 19:57) [30]


> NaRuTo   (11.01.08 19:56) [28]


Очком-с)


 
{RASkov} ©   (2008-01-11 19:59) [31]

> [30] Сергей М. ©   (11.01.08 19:57)

Как не культурно.... :)
Дети же.... поверят еще....


 
{RASkov} ©   (2008-01-11 20:00) [32]

А вообще +1
:)


 
Сергей М. ©   (2008-01-11 20:04) [33]


> Как не культурно


Угу.

Культурней амбразурой)


 
Dib@zol ©   (2008-01-11 21:13) [34]

Сергей сегодня, определённо, в ударе :)

ЗЫ Аффтар, аууууу! Ждём исходник!



Страницы: 1 вся ветка

Текущий архив: 2008.02.03;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.022 c
11-1182271513
Vladimir Kladov
2007-06-19 20:45
2008.02.03
Секреты Delphi IDE - пополнения


2-1198947235
ChainikDenis
2007-12-29 19:53
2008.02.03
Считать файл в TntRichEdit


6-1172017429
Ш-К
2007-02-21 03:23
2008.02.03
Свои "контролы" в TWebBrowser.


2-1199727919
T54
2008-01-07 20:45
2008.02.03
TTreeView


15-1198483076
wipr
2007-12-24 10:57
2008.02.03
Проблемы с регистрацией Borland Developer Studio 2006