Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 1
Регистрация: 10.12.2021
Сообщений: 375

Проблема двух одинаковых модальных форм

25.11.2022, 08:57. Показов 2090. Ответов 48
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Запускаю одну модальную форму так:
Delphi
1
2
3
4
5
6
7
8
9
f_Form1 := Tf_Form1.Create(Self);
with f_Form1 do
  begin
    ActionMode = A;
    if ShowModal = mrOk then
      begin
      ...
      end;
  end;
Потом на f_Form1 открывается модальная форма f_FormM.
А на f_FormM по кнопке создаётся ещё один экземпляр f_Form1 только с ActionMode = B.

В итоге у меня две модальные формы, которые лежат друг на друге. И когда я закрываю самый верхний f_Form1 только с ActionMode = B, то изменения касаются и f_Form1 только с ActionMode = A.

Я пробовал делать у одного из них вот так:
Delphi
1
f_Form1_1 := Tf_Form1.Create(Self);
, но на f_Form1_1 ругается. Мне нужно чтобы каждый из Tf_Form1 работал отдельно, не влияя на другой Tf_Form1.

Как это реализовать?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.11.2022, 08:57
Ответы с готовыми решениями:

Создание модальных форм
Как создать в Access 2007 форму в оконном режиме. Причем нужно не модальное окно, а обычная форма, только в окне, а не на всю страницу....

Сравнение наличия одинаковых (по имени) форм в двух разных базах
Дали внести правки в базу с большим числом объектов (2-3 значные числа), база разделенная, т.е. табличный файл отдельно, с ним все ок. Я...

Как реализовать общую кнопку для двух одинаковых форм
На странице имеются две формы и у каждой кнопка, пишешь название комплектующего из базы данных и при нажатии на кнопку страница...

48
0 / 0 / 1
Регистрация: 10.12.2021
Сообщений: 375
28.11.2022, 09:47  [ТС]
Студворк — интернет-сервис помощи студентам
Как уничтожать только нужную форму?
При создании: f_Form1: Tf_Form1.Create(Self);
При уничтожении: f_Form1 := nil;
После уничтожения одной, я так понимаю, частично разрушаются другие.
0
Модератор
4156 / 2365 / 814
Регистрация: 15.11.2015
Сообщений: 9,503
28.11.2022, 10:07
Цитата Сообщение от MaximLyalin2002 Посмотреть сообщение
При уничтожении: f_Form1 := nil;
После уничтожения одной, я так понимаю, частично разрушаются другие.
Нет, частичного разрушения нет. Просто создавая новую форму так
Delphi
1
f_Form1 := Tf_Form1.Create(Self);
ты теряешь ссылку на ранее созданную форму.

Добавлено через 1 минуту
Можно сделать список форм (TList), и обращаться к ним через этот список.
1
0 / 0 / 1
Регистрация: 10.12.2021
Сообщений: 375
28.11.2022, 10:21  [ТС]
Я примерно понял как сделать.

При добавлении:
P: Pointer;
P:=Pointer(f_Form1);
TList1.Add(P);

А теперь главное, как использовать этот список для устранения моей проблемы
Цитата Сообщение от AzAtom Посмотреть сообщение
ты теряешь ссылку на ранее созданную форму
0
Модератор
4156 / 2365 / 814
Регистрация: 15.11.2015
Сообщений: 9,503
28.11.2022, 10:44
Цитата Сообщение от MaximLyalin2002 Посмотреть сообщение
как использовать этот список для устранения моей проблемы
Для начала поясни, зачем тебе ссылка на форму? Если тебе надо всего лишь получить результат, то вот так подойдёт:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure ModalFormClose(Sender: TObject; var Action: TCloseAction);
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
uses Unit2;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  r: integer;
begin
  with TForm2.Create(Self) do begin // Создать новую форму
    OnClose := ModalFormClose; // Прицепить обработчик события
    r := ShowModal; // Получить результат в переменную, если вдруг нужно использовать его в нескольких местах
    if r = mrOk then Label1.Caption := 'OK' else Label1.Caption := 'Cancel';
  end;
end;
 
procedure TForm1.ModalFormClose(Sender: TObject; var Action: TCloseAction);
begin
  // Установить действие при закрытии формы caFree для уничтожения формы
  Action := caFree;
end;
 
end.
А в модуле формы в этом примере нет никакого кода, только кнопкам назначен ModalResult и всё.

Добавлено через 1 минуту
Даже если хочешь забирать результат из формы, то Sender в событии OnClose содержит ссылку на саму форму, забирай оттуда что хочешь, и никакие списки и отдельные ссылки на форму не нужны.
0
0 / 0 / 1
Регистрация: 10.12.2021
Сообщений: 375
28.11.2022, 11:18  [ТС]
Теперь ещё более непонятно. То одно
Цитата Сообщение от AzAtom Посмотреть сообщение
ты теряешь ссылку на ранее созданную форму
а потом другое
Цитата Сообщение от AzAtom Посмотреть сообщение
Для начала поясни, зачем тебе ссылка на форму?
Хорошо... объясню по-подробнее. Вызывается модальная форма Form1 (к ней создаётся дополнительная маленькая форма Form_Dop, которая бегает за Form1 и закрывается вместе с ней)*
потом вызывается ещё одна модальная второстепенная форма. И из неё уже вызывается ещё раз модальная форма Form1 (к ней создаётся дополнительная маленькая форма Form_Dop)*.
При закрытии срабатывает OnDestroy и... Form1 := nil . Итог всего этого: у первой Form1 отвязывается Form_Dop. И при закрытии Form1, Form_Dop остаётся.


*Всё, что так отмечено, не спрашивайте... это так надо
0
Злостный нарушитель
 Аватар для Verevkin
10908 / 5836 / 1289
Регистрация: 12.03.2015
Сообщений: 26,936
28.11.2022, 11:25
Цитата Сообщение от MaximLyalin2002 Посмотреть сообщение
Как уничтожать только нужную форму?
При создании: f_Form1: Tf_Form1.Create(Self);
При уничтожении: f_Form1 := nil;
После уничтожения одной, я так понимаю, частично разрушаются другие.
Не вздумай использовать глобальную переменную. Я ж тебе исходник свой дал, ну посмотри, как там создаются и удаляются модальные формы-то, ёмаё.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
function ShowModalDlg(var AActionMode: int32): TModalResult;
begin
  var dlg:= TModalDlg.Create(Application);
  try
    dlg.ActionMode:= AActionMode;
    result:= dlg.ShowModal();
 
    if result <> mrCancel
      then AActionMode:= dlg.ActionMode; // пример возвращённой из диалога информации
  finally
    dlg.Free();
  end;
end;
0
Модератор
4156 / 2365 / 814
Регистрация: 15.11.2015
Сообщений: 9,503
28.11.2022, 11:31
MaximLyalin2002, как работает примерно понятно. Но по прежнему не понятно, зачем нужна ссылка на эту форму? Лучше давай проект, а то так не понятно, что хочешь изобразить.
0
0 / 0 / 1
Регистрация: 10.12.2021
Сообщений: 375
29.11.2022, 10:14  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
function ShowModalDlg(var AActionMode: int32): TModalResult;
begin
  var dlg:= TModalDlg.Create(Application);
  try
    dlg.ActionMode:= AActionMode;
    result:= dlg.ShowModal();
if result <> mrCancel
      then AActionMode:= dlg.ActionMode; // пример возвращённой из диалога информации
  finally
    dlg.Free();
  end;
end;
Во-первых, жалуется на "var". Во-вторых, форма не отображается когда создаю по вашему методу. Нажимаю, кнопку и модальная форма создаётся. Но её не видно. А дальше продолжать работу невозможно, так как надо выйти из модальной формы. )
0
Злостный нарушитель
 Аватар для Verevkin
10908 / 5836 / 1289
Регистрация: 12.03.2015
Сообщений: 26,936
29.11.2022, 10:18
Цитата Сообщение от MaximLyalin2002 Посмотреть сообщение
Во-первых, жалуется на "var". Во-вторых, форма не отображается когда создаю по вашему методу.
Это взаимоисключающие вещи.
Показывай код.
0
Модератор
4156 / 2365 / 814
Регистрация: 15.11.2015
Сообщений: 9,503
29.11.2022, 10:28
Цитата Сообщение от MaximLyalin2002 Посмотреть сообщение
жалуется на "var"
Надо писать версию своей Delphi.
0
Злостный нарушитель
 Аватар для Verevkin
10908 / 5836 / 1289
Регистрация: 12.03.2015
Сообщений: 26,936
29.11.2022, 10:31
Цитата Сообщение от AzAtom Посмотреть сообщение
Надо писать версию своей Delphi.
Надо обновлять свой софт вовремя. А то отстанешь от прогресса.
0
Модератор
4156 / 2365 / 814
Регистрация: 15.11.2015
Сообщений: 9,503
29.11.2022, 10:33
Verevkin, тем не менее, это имеет место быть.
0
Злостный нарушитель
 Аватар для Verevkin
10908 / 5836 / 1289
Регистрация: 12.03.2015
Сообщений: 26,936
29.11.2022, 10:36
Цитата Сообщение от AzAtom Посмотреть сообщение
тем не менее, это имеет место быть.
Согласен.
0
0 / 0 / 1
Регистрация: 10.12.2021
Сообщений: 375
29.11.2022, 11:28  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Надо писать версию своей Delphi.
Delphi XE4
0
0 / 0 / 1
Регистрация: 10.12.2021
Сообщений: 375
02.12.2022, 00:26  [ТС]
Сделал список.
Delphi
1
List1 : TList;
Добавляю так:
Delphi
1
List1.Add(TForm1.Create(Application));
Потом прописываю:
Delphi
1
if TForm1(List1.Last).ShowModal = mrOk then
...
Но у меня ошибок нету, и формы не видно вообще.
Что за фигня?! Можете помочь?
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,750
Записей в блоге: 7
02.12.2022, 00:52
Можем.
Вложения
Тип файла: zip record_000027.zip (582.3 Кб, 5 просмотров)
0
Модератор
4156 / 2365 / 814
Регистрация: 15.11.2015
Сообщений: 9,503
02.12.2022, 09:08
Цитата Сообщение от MaximLyalin2002 Посмотреть сообщение
Добавляю так:
Delphi
1
List1.Add(TForm1.Create(Application));
Где добавляешь? Когда научитесь показывать код модуля?

Добавлено через 2 минуты
Если добавляешь в OnCreate самой же Form1, то каждая созданная форма в свою очередь создаёт ещё одну форму, и так до вылета программы с ошибкой.
0
Злостный нарушитель
 Аватар для Verevkin
10908 / 5836 / 1289
Регистрация: 12.03.2015
Сообщений: 26,936
02.12.2022, 09:12
Нахрена это всё? Чем тебя мой пример-то не устроил? Нахрен этот левый список ваще?
0
0 / 0 / 1
Регистрация: 10.12.2021
Сообщений: 375
02.12.2022, 10:40  [ТС]
Verevkin, тут такое дело, что модально создаётся Form1, а потом к ней создаётся Form2. И когда перемещаю Form2, то с ней двигается и Form1.
Схема работы на скрине.
Миниатюры
Проблема двух одинаковых модальных форм  
0
0 / 0 / 1
Регистрация: 10.12.2021
Сообщений: 375
02.12.2022, 10:48  [ТС]
Как видно на скрине Form1 и Form2 создаются по 2 раза.
Только вот Form2 уничтожается вместе со своей Form1. Но, когда последнюю Form1 (самая нижняя на скрине) закрываю, то Form2 (самый нижний) уничтожается, а Form1 := nil. В итоге остаются Dop_form, Form2 и недоразрушенная Form1, которую задело уничтожение последней Form1 (самая нижняя на скрине).

*Из-за того, что управлять Form1 надо с помощью Form2, то Form1 создаю глобально Form1 := TForm1.Create(Self).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.12.2022, 10:48

Проблема с отсылкой данных из двух форм
На странице имеются 2 формы! На первой форме имеются много различных кнопок в частности &quot;Удалить Выделенные Темы&quot;. На второй...

Тема: Создание многооконного интерактивного справочника Цель: Выработать навыки разработки приложений с использованием модальных и немодальных форм
1. Создать информационную программу из пяти окон, с возможностью последовательного перехода из одного окна в другое - вперед и...

Аналог "модальных" форм
Гуру, помогите спланировать схему блока! И скажите вообще возможно ли такое. Или хотя-бы видели ли Вы подобное в других программах. ...

Связывание двух форм по расположению на мониторе(Синхронизация форм)
Такая проблема, представим если 2 формы, на первой форме есть клавиша &quot;На вторую форму&quot;, которая будет иметь код: ...

Подпрограммы: сколько одинаковых букв находятся на одинаковых местах в двух строках?
Запишите строку А в обратном порядке в строку Б. Посчитайте сколько одинаковых букв находятся на одинаковых местах в этих строках....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru