Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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 удалить.



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

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

Наверх





Память: 0.47 MB
Время: 0.005 c
3-8787
Андре
2002-01-08 10:24
2002.02.04
dbiRegenIndexes


6-8970
Oplg
2001-11-12 18:57
2002.02.04
Вопрос


3-8764
KonuhovSegey
2002-01-02 09:28
2002.02.04
Убрать ограничения на количество изменений в одной транзакции


1-8809
Alexsum
2002-01-17 09:59
2002.02.04
Ошибка при открытии формы.


1-8887
KvORubin
2002-01-16 19:07
2002.02.04
Memo1 или RichBox1.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский