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

Вниз

Как оставить приложение без окна выполнятся до окончания работы Windows?   Найти похожие ветки 

 
Valdemar   (2002-01-16 12:36) [0]

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


 
Digitman ©   (2002-01-16 13:53) [1]

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


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

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


 
Digitman ©   (2002-01-17 10:40) [3]

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


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

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


 
Digitman ©   (2002-01-17 14:39) [5]

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


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

Если программа работает не внутри 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) [7]

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;

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


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

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



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

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


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

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

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 19:53) [11]

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



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

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

Наверх




Память: 0.49 MB
Время: 0.015 c
1-8943
Mitrofan
2002-01-18 11:34
2002.02.04
Как програмно проскролировать RichEdit ?


1-8828
Dailagig
2002-01-20 12:11
2002.02.04
Help ME


1-8822
Аркадий
2002-01-20 00:27
2002.02.04
Физические и логические диски


7-9015
fsp
2001-10-24 19:30
2002.02.04
Зацепить обьект из другого приложения


1-8908
kostushock
2002-01-17 12:15
2002.02.04
Модальные формы