Текущий архив: 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.52 MB
Время: 0.077 c