Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как оставить приложение без окна выполнятся до окончания работы Windows? [D5, Win95/98, NT4, Win2k]


Valdemar ©   (2002-01-16 12:36:00) 

Я создал приложение в котором нет окон (есть только модули). Мне надо чтобы это приложение висело в памяти и закрывалось только когда его закроют через Ctrl+Alt+Del или при завершении работы Windows.
Заранее спасибо.


Набережных С.   (2002-01-17 19:53:00) [1]

В приведенном коде exit следует заменить на Break, строку Application.Run поставить после until false, а строки try и finally удалить.


Valdemar   (2002-01-17 19:05:00) [2]

Большое всем спасибо эту проблему с вашей помощью я решил.
Если комуто интересно то вот кусок исходника:

var Msg: TMsg;

begin
Application.Initialize;
Application.Title := "MyProg";
Application.CreateForm(TDataModule1, DataModule1);
Application.CreateForm(TDataModule2, DataModule2);
try
repeat
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
case Msg.Message of
WM_Quit:exit;
wm_Close:exit;
wm_Destroy:exit;
end;
until false
finally
end;
Application.Run;
end.


Набережных С.   (2002-01-17 16:25:00) [3]

В примере забыл про цикл:
1. Сразу после try вставить repeat;
2. Перед finally вставить until false;


Набережных С.   (2002-01-17 16:16:00) [4]

Если в программе нет MainForm, то прогамма и будет сразу
закрываться. Нужно из файла проекта удалить строку
Application.Run и вместо нее вставить свою процедуру выборки
и обработки сообщений по примеру Application.ProcessMessage.
Просмотрите цепочку
Application.Run -> HandleMessage -> ProcessMessage.


Набережных С.   (2002-01-17 16:05:00) [5]

Если программа работает не внутри Application.Run, то она должна выглядеть примерно так:

var Msg: TMsg;

begin
{захват ресурсов}
try
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
case Msg.Message of
WM_QUIT:Exit;
{Можно предусмотреть обработку других сообщений}
end;
{Выполняешь свою работу}
finally
{Освобождение ресурсов}
end;
end;

Можно и подругому, главное - периодически проверять очередь и при получении WM_QUIT завершать приложение.


Valdemar   (2002-01-17 16:05:00) [6]

procedure TDataModule2.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
var
MySocket: TWinSocketStream;
tr:Trec;
begin
MySocket := TWinSocketStream.Create(Socket,60000);
while not MySocket.WaitForData(100) do
Application.ProcessMessages;
MySocket.ReadBuffer(tr,sizeof(tr));
MySocket.Free;
//write in database

datamodule1.ADOTable1.Insert;
datamodule1.ADOTable1.Fields[0].AsString:=tr.User;
datamodule1.ADOTable1.Fields[1].AsString:=tr.Path;
datamodule1.ADOTable1.Fields[2].AsString:=tr.Title;
datamodule1.ADOTable1.Fields[3].AsDateTime:=tr.StartTime;
datamodule1.ADOTable1.Fields[4].AsDateTime:=tr.EndTime;


end;

procedure TDataModule2.DataModuleCreate(Sender: TObject);
begin
ServerSocket1.Active:=true;
end;

procedure TDataModule2.DataModuleDestroy(Sender: TObject);
begin
ServerSocket1.Active:=false;
ServerSocket1.Close;
end;

При таком раскладе у меня програма сразу после запуска закрывается.


Digitman   (2002-01-17 14:39:00) [7]

А при чем здесь - есть окно или нет его ? ServerSocket создает собственное для работы с гнездовыми событиями на уровне Win-сообщений. Проблема у тебя в чем-то другом. Приводи фрагменты кода


Valdemar   (2002-01-17 14:33:00) [8]

Суть в том как сделать чтоб она вертелась и в тоже время что бы была возможность обработки событий serversocket. А то у меня получается что программа запускается, я открываю сокет и сразу закругляется.


Digitman   (2002-01-17 10:40:00) [9]

Это понятно. Так, а проблемы-то какие ? Ну, запустил ты задачу свою, визуально она себя нигде не обнаруживает, кроме как в списке задач. Пользователь закрыть ее не сможет традиционным способом, и задача будет "крутиться по хозяйству" до тех пор, пока не сочтет нужным завершиться либо возникнут два указанных тобой события (принудительное ее снятие в TaskManager"е и завершение сеанса работы ОС)


Valdemar   (2002-01-16 22:30:00) [10]

В моём примере нету форм но оно не консольное.
Я кладу в модуль компонент TServerSocket и мне надо чтоб этот компонент сканировал порты поак работает ОС.


Digitman   (2002-01-16 13:53:00) [11]

А какие прочие существующие (кроме явно указанных), на твой взгляд, варианты завершения приложения тебя не устраивают ? И что значит - "нет окон" ? У тебя консольное приложение ? Или ты просто ни одну форму не создаешь в нем ? Ведь если приложение использует объект Application, то в нем все равно существует по кр.мере одно окно, даже если не создается ни одна форма (окно Windows и форма Делфи - далеко не одно и то же !!)


Наверх

Титульная страница Поиск, карта сайта Написать письмо