Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2017, 16:50   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,898
Вопрос Манипуляции с динамически создаваемой формой

Есть проект состоящий из двух форм. Form1 создаётся автоматически, Form2 вручную. Форму создаю вручную, так как она за всё время работы программы может быть ни разу не задействована. Динамическое создание конечно хорошо, но это способ начинает плодить форму множество раз, что не нужно.

Наброски, но кажутся кривыми

Form1
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  procedure SwitchToThisWindow(AWindow: HWND; ARestore: BOOL); stdcall; external user32 Name 'SwitchToThisWindow';

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    Form2.Show
  except
    Form2 := nil;
  end;
  if not Assigned(Form2) then
  begin
    Form2 := TForm2.Create(Form1);
    Form2.Show;
  end
  else
  begin
    Form2.WindowState := wsNormal;
    SwitchToThisWindow(Form2.Handle, True);
  end;
end;

end.
Form2
Код:
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type
  TForm2 = class(TForm)
    Button1: TButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    I: Integer;
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

end.
Изображения
Тип файла: png Безымянный.png (19.0 Кб, 48 просмотров)

Последний раз редактировалось Shouldercannon; 30.10.2017 в 17:38.
Shouldercannon вне форума Ответить с цитированием
Старый 30.10.2017, 16:55   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
проект состоящий из двух форм. Form18


Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
начинает плодить форму множество раз, что не нужно.
так не плодите. Сохраняйте в не локальную переменную и проверяйте.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 30.10.2017, 17:26   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Твой Action := caFree; память освободит, но не очистит и Form2 в nil не сбросит. И не факт, что Form2.Show в этом случае обязательно подымет исключение как тебе хочется. Можно при закрытии какую-то глобальную переменную устанавливать и её анализировать перед Show. Можно в Screen.Forms поискать еще без всяких глобальных переменных
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 30.10.2017 в 17:41.
Аватар вне форума Ответить с цитированием
Старый 30.10.2017, 18:08   #4
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
Форму создаю вручную, так как она за всё время работы программы может быть ни разу не задействована.
Экономия на спичках ИМХО. Там что, какой-то тяжёлый запрос к базе при создании? Или 100500 локальных переменных? Ради чего городить огород?
Black Fregat вне форума Ответить с цитированием
Старый 30.10.2017, 19:45   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А чего на спичках? В одном из проектов даже не знаю сколько форм, наверно не меньше пары сотен. Только главная и пара датамодулей в dpr, остальные только динамически. В чем проблемы динамического создания и корректного контроля?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.10.2017, 20:54   #6
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,898
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А чего на спичках? В одном из проектов даже не знаю сколько форм, наверно не меньше пары сотен. Только главная и пара датамодулей в dpr, остальные только динамически. В чем проблемы динамического создания и корректного контроля?
Проблема в организации корректного контроля
Shouldercannon вне форума Ответить с цитированием
Старый 30.10.2017, 20:58   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Экономия на спичках ИМХО. Там что, какой-то тяжёлый запрос к базе при создании? Или 100500 локальных переменных? Ради чего городить огород?
Вообще Дельфи единственный известный мне GUI фреймворк, где все формы по умолчанию создаются при запуске )
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 30.10.2017, 21:15   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Проблема в организации корректного контроля
Так например для не модальных и что-бы не более одного экземпляра TForm2 могло существовать. Action:=caFree при закрытии Form2
Код:
  Exists:=False;
  for i:=0 to Screen.FormCount-1 do if Screen.Forms[i]=Form2 then begin Exists:=True; Break; end;
  if not Exists then Form2:=TForm2.Create(Application);
  Form2.Show;
Для модальных Free после ShowModal. caFree не нужно, там ModalResult для выхода
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 30.10.2017 в 21:21.
Аватар вне форума Ответить с цитированием
Старый 31.10.2017, 01:31   #9
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,926
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Для модальных Free после ShowModal. caFree не нужно
Разве? Закрытие модальной формы память ей выделенную не освобождает.
А для динамически создаваемых модальных форм есть стандартный шаблон кода
Код:
with TMyModalDynamicForm.Create() do try
...
finally
  Free;
end;
Готов бросить камень и даже кучу камней в того, который скажет что такие формы надо создавать и уничтожать иначе.
northener вне форума Ответить с цитированием
Старый 31.10.2017, 01:37   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Разве? Закрытие модальной формы память ей выделенную не освобождает.
А где утверждалоcь что освобождает? Предлагалось освобождать её по выходу из формы:
Цитата:
Для модальных Free после ShowModal
А уж "стандартным" шаблоном или по другому это вопрос 18-ый. Кстати with не использую принципиально, считаю его дополнительным источником ошибок и он мне только мешает и затрудняет отладку
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 31.10.2017 в 01:42.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DLL с формой и ее вызов динамически. Alexandr17 Общие вопросы Delphi 20 19.06.2014 07:59
Длина заголовка создаваемой таблицы в Firebird artemavd БД в Delphi 7 08.04.2012 18:37
Работа с динамически созданной формой Airou C++ Builder 1 12.07.2011 10:58
Манипуляции с формой Claster Помощь студентам 6 11.04.2011 11:49
Функция для Создаваемой программно кнопки Iscariot Компоненты Delphi 1 02.10.2009 10:16