Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];




Вниз

Как оставить приложение без окна выполнятся до окончания работы 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 удалить.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.02.04;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.061 c
14-8971           Pat                   2001-12-10 23:58  2002.02.04  
IconForge5.23a


4-9041            AlexandrH             2001-12-06 14:26  2002.02.04  
Кто-нибудь знает что мне выдает функция EnumProps


4-9022            diasm                 2001-12-06 18:21  2002.02.04  
Анимированные иконки


1-8846            Dmitriy_R             2002-01-21 11:05  2002.02.04  
Как выяснить целое число и его остаток после какой нить математической операции?


1-8953            corvalol              2002-01-18 11:08  2002.02.04  
Нужна приличная и