Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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

Gooddy (статус: 3-ий класс), 23 июня 2011, 00:29 [#2]:

Application.Terminate;
Чисти код! Чисти код! Чисти код!
Gooddy

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

DNK (статус: Студент), 23 июня 2011, 00:37 [#4]:

Если у процесса нет формы, то действие "закрыть" применительно к нему не совсем политкорректно. Чтобы программа завершилась, она должна до конца выполнитьт свой код. У вас же бесконечный цикл while-true-do, вместо true надо вписать условие по которому происходит выход.
"Digital Networked Knight"
Gooddy

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

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

Gooddy (статус: 3-ий класс), 23 июня 2011, 00:38 [#8]:

где x>10 - условие выхода.
Чисти код! Чисти код! Чисти код!
Gooddy

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

Gooddy (статус: 3-ий класс), 23 июня 2011, 00:42 [#11]:

Короче чтобы прогу закрыть нужно в цикле break прописать.

Зачем кстати такое извращение понадобилось?
Чисти код! Чисти код! Чисти код!
Gooddy

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

Gooddy (статус: 3-ий класс), 23 июня 2011, 00:46 [#15]:

Причём тут количество повторов?

Заводишь переменную clientSockedExit:boolean (в том же модуле где компонент).

и пишешь
if clientSockedExit then break; в цикле.

где я написал x>10 - просто общее условие, я думал ты его можешь сам составить.
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 23 июня 2011, 00:47 [#16]:

ну во. так и надо начинать.

text:=socket.ReceiveText();
if text='exit' then clientSockedExit:=true

в обработчике дописываешь и готово.
Чисти код! Чисти код! Чисти код!
Абрамов Павел

Абрамов Павел (статус: Посетитель), 23 июня 2011, 00:53 [#17]:

вопрос: как в source коде обратится к переменной из подключаемых модулей?(я, мягко говоря, не профи)))
Gooddy

Gooddy (статус: 3-ий класс), 23 июня 2011, 00:54 [#18]:

напрямую clientSockedExit
или Unit1.clientSockedExit
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 23 июня 2011, 00:54 [#19]:

Это должна быть глобальная переменная только.
Чисти код! Чисти код! Чисти код!
Gooddy

Gooddy (статус: 3-ий класс), 23 июня 2011, 00:55 [#20]:

Глобальную переменную можно объявить в глобальной секции var, там где формы объявляются.

var
Form1: TForm1;
clientSockedExit: Boolean;
Чисти код! Чисти код! Чисти код!

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:01
Выполнено за 0.03 сек.