|
Вопрос # 5 440/ вопрос решён / |
|
Доброго времени суток, уважаемые эксперты!
Нужно, чтобы моя программа закрыла сама себя. Команд типа Form1.Close недостаточно, т.к. моя программа работает и без нее[формы]. Как это реализовать?
 |
Вопрос задал: Абрамов Павел (статус: Посетитель)
Вопрос отправлен: 23 июня 2011, 00:22
Состояние вопроса: решён, ответов: 1.
|
Ответ #1. Отвечает эксперт: Gooddy
Здравствуйте, Абрамов Павел!
Application.Terminate;
 |
Ответ отправил: Gooddy (статус: 3-ий класс)
Время отправки: 23 июня 2011, 00:30
|
Мини-форум вопроса
Всего сообщений: 26; последнее сообщение — 23 июня 2011, 01:07; участников в обсуждении: 3.
Страницы: [1] [2] [Следующая »]
|
Абрамов Павел (статус: Посетитель), 23 июня 2011, 00:24 [#1]:
Source-код:
program xxx;
uses
Forms,
Windows,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
var WhEvent:THandle;
begin
Application.Initialize;
ShowWindow(Application.Handle, SW_HIDE);
Form1:=TForm1.Create(nil);
Application.Run;
WhEvent:=CreateEvent(nil, true, false, 'et');
while (true) do
begin
WaitForSingleObject(WhEvent, 1000);
Application.ProcessMessages;
end;
end.
т.е. фишка в том, что в данном случае она будет и без формы пахать, а закрыть надо
|
|
Gooddy (статус: 3-ий класс), 23 июня 2011, 00:29 [#2]:
Application.Terminate;
Чисти код! Чисти код! Чисти код!
|
|
Gooddy (статус: 3-ий класс), 23 июня 2011, 00:34 [#3]:
Есть варианты
Application.Destroy;
Application.Free;
Но они не уничтожают приложение.
В твойм коде также можно написать:
needExit := false;
while ( not needExit ) do
begin
WaitForSingleObject(WhEvent, 1000);
Application.ProcessMessages;
if x>10 then needExit:=true; //Выход
end;
Чисти код! Чисти код! Чисти код!
|
|
DNK (статус: Студент), 23 июня 2011, 00:37 [#4]:
Если у процесса нет формы, то действие "закрыть" применительно к нему не совсем политкорректно. Чтобы программа завершилась, она должна до конца выполнитьт свой код. У вас же бесконечный цикл while-true-do, вместо true надо вписать условие по которому происходит выход.
"Digital Networked Knight"
|
|
Gooddy (статус: 3-ий класс), 23 июня 2011, 00:38 [#5]:
DNK: это я уже написал
Чисти код! Чисти код! Чисти код!
|
|
Абрамов Павел (статус: Посетитель), 23 июня 2011, 00:38 [#6]:
Application.Terminate;
При выполнении этой команды вылазит ошибка "Project raised exception class EPrivilege with message 'Privileged instruction'."
|
|
Gooddy (статус: 3-ий класс), 23 июня 2011, 00:38 [#7]:
needExit := false;
while ( not needExit ) do
begin
WaitForSingleObject(WhEvent, 1000);
Application.ProcessMessages;
if x>10 then needExit:=true; //Выход
end;
Чисти код! Чисти код! Чисти код!
|
|
Gooddy (статус: 3-ий класс), 23 июня 2011, 00:38 [#8]:
где x>10 - условие выхода.
Чисти код! Чисти код! Чисти код!
|
|
Gooddy (статус: 3-ий класс), 23 июня 2011, 00:40 [#9]:
Ещё вариант есть
while ( true ) do
begin
WaitForSingleObject(WhEvent, 1000);
Application.ProcessMessages;
if x>10 then break //Выход
end;
Чисти код! Чисти код! Чисти код!
|
|
Абрамов Павел (статус: Посетитель), 23 июня 2011, 00:42 [#10]:
хм, в моём случае ставить подобное ограничение на кол-во повторов нецелесообразно. Хотелось бы другое решение
|
|
Gooddy (статус: 3-ий класс), 23 июня 2011, 00:42 [#11]:
Короче чтобы прогу закрыть нужно в цикле break прописать.
Зачем кстати такое извращение понадобилось?
Чисти код! Чисти код! Чисти код!
|
|
Gooddy (статус: 3-ий класс), 23 июня 2011, 00:43 [#12]:
И какое условие для закрытия то?
Чисти код! Чисти код! Чисти код!
|
|
Абрамов Павел (статус: Посетитель), 23 июня 2011, 00:44 [#13]:
команда на выход приходит через компонент ClientSocket, поэтому ограничение на кол-во повторов не выход.
|
|
Абрамов Павел (статус: Посетитель), 23 июня 2011, 00:45 [#14]:
Наподобие этого:
text:=socket.ReceiveText();
if text='exit' then ...
|
|
Gooddy (статус: 3-ий класс), 23 июня 2011, 00:46 [#15]:
Причём тут количество повторов?
Заводишь переменную clientSockedExit:boolean (в том же модуле где компонент).
и пишешь
if clientSockedExit then break; в цикле.
где я написал x>10 - просто общее условие, я думал ты его можешь сам составить.
Чисти код! Чисти код! Чисти код!
|
|
Gooddy (статус: 3-ий класс), 23 июня 2011, 00:47 [#16]:
ну во. так и надо начинать.
text:=socket.ReceiveText();
if text='exit' then clientSockedExit:=true
в обработчике дописываешь и готово.
Чисти код! Чисти код! Чисти код!
|
|
Абрамов Павел (статус: Посетитель), 23 июня 2011, 00:53 [#17]:
вопрос: как в source коде обратится к переменной из подключаемых модулей?(я, мягко говоря, не профи)))
|
|
Gooddy (статус: 3-ий класс), 23 июня 2011, 00:54 [#18]:
напрямую clientSockedExit
или Unit1.clientSockedExit
Чисти код! Чисти код! Чисти код!
|
|
Gooddy (статус: 3-ий класс), 23 июня 2011, 00:54 [#19]:
Это должна быть глобальная переменная только.
Чисти код! Чисти код! Чисти код!
|
|
Gooddy (статус: 3-ий класс), 23 июня 2011, 00:55 [#20]:
Глобальную переменную можно объявить в глобальной секции var, там где формы объявляются.
var
Form1: TForm1;
clientSockedExit: Boolean;
Чисти код! Чисти код! Чисти код!
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|