Выход из формы

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Выход из формы

Сообщение Сквозняк » 03.03.2011 16:47:52

Модуль который запускает гуёвину
Код: Выделить всё
unit pr1;
{$mode objfpc}{$H+}

interface
procedure interfeis;
implementation

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, Unit1, LResources,
  { you can add units after this }
  ;

{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}

procedure interfeis;
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  //здесь по логике должна быть операция закрывающая Application
end;

begin
{$I project1.lrs}
end.

При использовании в обработчике события родительской формы оператора Close, выполняется следующий за interfeis оператор а форма продолжает висеть и генерировать баги. Как правильно закрыть форму чтобы потом можно было опять её открыть.
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32

Re: Выход из формы

Сообщение v-t-l » 03.03.2011 17:13:45

Что-то странное Вы пытаетесь сделать.
Почему Application.Initialize находиться в модуле, а не в основной программе?
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: Выход из формы

Сообщение Сквозняк » 03.03.2011 17:34:10

Так основная программа пишется в фпцэшном иде на чистом фпс и запускает время от времени блобы на объектпаскале и дельфийском диалекте. Вполне естественное желание спрятать куски написанные на других языках куда-нибуть подальше и общаться с ними исключительно через глобальные переменные и типизованные константы. И вот тут-то и вылезло что в стандартной проге на лазарусе есть инициализация гуёвины а ".done" ещё надо поискать. Когда последний раз пользоватся турбовизион, там гуёвина без проблем отключалась а потом включалась любое количество раз.
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32

Re: Выход из формы

Сообщение Maxizar » 03.03.2011 21:19:53

Вот если честно, я Вас не понял.... ну честно.. если у вас есть формы, так запускайте их как формы.. если Вам нужно запустить другое приложение (от плеера до виртуальной машины) ну так пользуйтесь:
ShellExecute .. или Tprocess и все такое…
Вы же делаете запуск программы в своей программе в той же области памяти и все такое… Вы пытаетесть породить новый Application.. а он должен быть в программе один.. или я не так все понял?. Если вы делаете эксплойт или червя так запускаете… так это не в этом форуме нужно было писать.. и делается это на сколько мне известно немного по-другому.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Выход из формы

Сообщение daesher » 03.03.2011 21:28:33

Вы хотите эту форму потом создать заново? Тогда просто освободите её после Application.Run (командой Form1.Free). У меня работает.
daesher
постоялец
 
Сообщения: 221
Зарегистрирован: 09.03.2010 22:17:14

Re: Выход из формы

Сообщение leo_bsv » 03.03.2011 21:42:32

все формы кроме главной я обычно создаю во время работы как-то так (пишу в основном гуи):
Код: Выделить всё
procedure TMainForm.OptionsExecute(Sender: TObject);
begin
  OptionsForm := TOptionsForm.Create(nil);
  try
    OptionsForm.ShowModal;
  finally
    OptionsForm.Free;  // освобождаем место в памяти
  end;
end; 

естественно модуль формы должен быть подключен... ну и следуя логике вещей наверно с Application.CreateForm нужно поступать так же, в смысле освобождать после эксплуатации :)
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: Выход из формы

Сообщение Сквозняк » 03.03.2011 22:10:54

Да не надо "Вы" с большой буквы, эта большая буква постоянно напрягает, от неё ордин вред :) Да чего тут непонятного, если ты не понял зачем позволять программисту писать так как ему хочется, то и разработчики этого наверно тоже непонимают. В результате сколько бы ни пилили новые фичи, старые не доведут до ума и пользоваться ими для нестандартных вещей - никаких нервов не хватит а потом можно зайти в тупик. Просто виндовс какой-то с глупыми ограничениями. Должна быть возможность грохнуть класс и запустить его по новой, а зачем - вдруг кому-то понадобится. В борландпаскале это нормально работало: запустил программу, _из неё гуёвину_, вырубил гуёвину, запустил графику, вырубил графику, врубил гуёвину и так далее. Никаких эксплойтов, обычная программа.
а он должен быть в программе один..
А он и будет один или ноль в любой момент времени, если предыдущий удалится. Вот как удалить форму если Application.done в классе отсутствует :twisted:
если у вас есть формы, так запускайте их как формы..
Есть две дочерние формы, из других проектов. Запускаются. Но речь сейчас не про них.

Добавлено спустя 33 минуты 28 секунд:
leo_bsv писал(а):ну и следуя логике вещей наверно с Application.CreateForm нужно поступать так же, в смысле освобождать после эксплуатации :)
Пробовал уже весь день. Результаты один хуже другого. В лучшем случае при последующем запуске формы рушится вся программа :D
Ну очень не хочетсязапускать графику и логику из обработчика событий, несмотря на то, что лазарус к этому принуждает. А если форму запустить в отдельный поток, то тогда наверно можно при обработке события её подвесить и пусть себе болтается раз выключить нельзя. Надеюсь она не будет мешать программе.
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32

Re: Выход из формы

Сообщение daesher » 03.03.2011 23:00:26

Пробовал уже весь день. Результаты один хуже другого. В лучшем случае при последующем запуске формы рушится вся программа

Возможно, Вы повторно вызываете Application.Initialize? Это очень плохо.

В крайнем случае, кто мешает тогда просто отказаться от Application.CreateForm+Application.Run (оставив только Application.Initialize и бесконечный цикл while true do Application.ProcessMessages), создавать и показывать формы динамически, также их скрывать? Конечно, по close форма не освобождается (но закрывается!), но при желании можно как-то это сделать (скажем, в обработчике события OnClose изменить какую-нибудь переменную/поле, после чего в цикле это отследить).
daesher
постоялец
 
Сообщения: 221
Зарегистрирован: 09.03.2010 22:17:14

Re: Выход из формы

Сообщение Сквозняк » 03.03.2011 23:53:50

Возможно, Вы повторно вызываете Application.Initialize? Это очень плохо.
По разному пробовал. Завтра попробую потоки, никогда раньше их не использовал. Возник ещё один вопрос. Исходники лазаруса требуется инициализировать в первую очередь и они такие вредные. Когда они подключены, то не только форма не пропадает после выключения, но и окно с графикой :D Если окно полноэкранное, то имеем чёрный экран на котором можно запустить форму. Есть ли в форме свойство чтобы она вылезала поверх остальных окон?
Сквозняк
энтузиаст
 
Сообщения: 1123
Зарегистрирован: 29.06.2006 22:08:32

Re: Выход из формы

Сообщение daesher » 04.03.2011 00:26:03

FormStyle может быть fsStayOnTop или fsSystemStayOnTop
daesher
постоялец
 
Сообщения: 221
Зарегистрирован: 09.03.2010 22:17:14


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru