powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Странности с MDI формами
6 сообщений из 6, страница 1 из 1
Странности с MDI формами
    #39995717
client6aac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Создал главную форму (fsMDIForm)
Код: pascal
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.
48.
49.
unit Main;

interface

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

type
  TfrmMain = class(TForm)
    StatusBar: TStatusBar;
    MainMenu: TMainMenu;
    mmiForm1: TMenuItem;
    mmiForm2: TMenuItem;
    mmiForm3: TMenuItem;
    procedure mmiForm1Click(Sender: TObject);
    procedure mmiForm2Click(Sender: TObject);
    procedure mmiForm3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

uses Form1, Form2, Form3;

procedure TfrmMain.mmiForm1Click(Sender: TObject);
begin
  Form1Show;
end;

procedure TfrmMain.mmiForm2Click(Sender: TObject);
begin
  Form2Show;
end;

procedure TfrmMain.mmiForm3Click(Sender: TObject);
begin
  Form3Show;
end;

end.


2. Создал базовую дочернюю форму (fsMDIChild)
Код: pascal
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.
unit CustomMdiFrm;

interface

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

type
  TfrmCustomMDI = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
  public
  end;

function CheckMDIChild(Sender: TForm): Boolean;

implementation

{$R *.dfm}

function CheckMDIChild(Sender: TForm): Boolean;
var
  i: Integer;
begin
  Result := False;

  for i := 0 to (Application.MainForm.MDIChildCount - 1) do
  begin
    if Application.MainForm.MDIChildren[i] = Sender then
    begin
      if Sender.WindowState = wsMinimized
        then Sender.WindowState := wsNormal;
      Sender.BringToFront;
      Result := True;
      exit;
    end;
  end;
end;

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

end.


3. От базовой отнаследовал три дочерних формы
Код: pascal
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.
unit Form1;

interface

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

type
  TfrmForm1 = class(TfrmCustomMDI)
    Label1: TLabel;
  private
  public
  end;

var
  frmForm1: TfrmForm1;

procedure Form1Show;

implementation

{$R *.dfm}

procedure Form1Show;
begin
  if CheckMDIChild(frmForm1) then
  begin
    if frmForm1.WindowState = wsMinimized
      then frmForm1.WindowState := wsNormal;
    frmForm1.BringToFront;
  end
  else
  begin
    frmForm1 := TfrmForm1.Create(Application);
  end;
end;

end.


Все три дочерние формы идентичны, отличаются только названием переменных для самих форм (Form1? Form2? Form3), ну и названиями методов для их создания/отображения.

Через какое-то время после запуска приложения, одна из форм перестает выводится на экран. Например, создаю Форму1, потом Форму2, потм Форму3, закрываю Форму1, закрываю Форму2, пытаюсь создать заново Форму1 или Форму2, и одна из них перестает отображаться. В отладчике выяснилось, что каким-то образом, Form1, например, хотя и уничтожена, ссылается на существующую Форму3. Как это получается - ума не приложу.

Прошу помощи зала в решении этой загадки:)

p.s.: может сумбурно и непонятно описал проблему... на всякий случай прикладываю тестовый проект
...
Рейтинг: 0 / 0
Странности с MDI формами
    #39995721
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
04.09.2020 16:30, client6aac пишет:
> procedure TfrmCustomMDI.FormClose(Sender: TObject; var Action: TCloseAction);
> begin
> Action := caFree;
> end;

этого недостаточно.
нужно ещё и указатель выставить в nil.
сам собой он не обнулится.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Странности с MDI формами
    #39995774
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
client6aac
Все три дочерние формы идентичны, отличаются только названием переменных для самих форм

Удалите эти переменные и привыкните бить себя по рукам за каждую попытку их использовать. Это плохой стиль вообще, а для MDI-приложений так и вовсе перманентный источник проблем. В том числе той мелочи, на которую Вы напоролись.

client6aac
В отладчике выяснилось, что каким-то образом, Form1, например, хотя и уничтожена, ссылается на существующую Форму3. Как это получается - ума не приложу.

Как-как... Вы заполняете указатель при создании формы, а кто будет его чистить при уничтожении?
...
Рейтинг: 0 / 0
Странности с MDI формами
    #39996412
client6aac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мимопроходящий,
softwarer

да, затупил.
хотя все равно не понятно как один указатель становится равным другому:)
...
Рейтинг: 0 / 0
Странности с MDI формами
    #39996442
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
client6aac
хотя все равно не понятно как один указатель становится равным другому:)

Случайно...
...
Рейтинг: 0 / 0
Странности с MDI формами
    #39996464
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
client6aac
хотя все равно не понятно как один указатель становится равным другому:)

Повторное использование освобожденной ранее памяти?
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Странности с MDI формами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]