| 
| 
 | Вопрос # 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] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |