powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Динамическое создание компонентов на модальной форме
16 сообщений из 16, страница 1 из 1
Динамическое создание компонентов на модальной форме
    #39699480
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Не пойму в чем проблема, создаю модальную форму, на ней в onCreate должны динамически создаваться компоненты, но они создаются только если владельцем является панель. В чем может быть дело?

Тут все прекрасно работает
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TForm1.FormCreate(Sender: TObject);
var
  Memo: TMemo;
begin
  Memo:= TMemo.Create(Form1);
  Memo.Parent:= Form1;
end;



А тут нет
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure TForm1.btn1Click(Sender: TObject);
var
  Form2: TForm2;
begin
  Form2:= TForm2.Create(Application);
  Form2.ShowModal;
end;

// unit2
procedure TForm2.FormCreate(Sender: TObject);
var
  Memo: TMemo;
begin
  Memo:= TMemo.Create(Form2);
  Memo.Parent:= Form2;
end;
...
Рейтинг: 0 / 0
Динамическое создание компонентов на модальной форме
    #39699489
AJi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AJi
Гость
aford,

Попробуйте использовать Self.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TForm2.FormCreate(Sender: TObject);
var
  Memo: TMemo;
begin
  Memo:= TMemo.Create(Self);
  Memo.Parent:= Self;
end;
...
Рейтинг: 0 / 0
Динамическое создание компонентов на модальной форме
    #39699491
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
   Memo.Visible := true;
...
Рейтинг: 0 / 0
Динамическое создание компонентов на модальной форме
    #39699492
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AJi,

работает, спасибо! А почему так? Родитель получается сам, память выделена самим, а отображается на форме? Он потом корректно выгрузится из памяти?
...
Рейтинг: 0 / 0
Динамическое создание компонентов на модальной форме
    #39699494
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кроик Семён, оно по умолчанию всегда true вроде)
...
Рейтинг: 0 / 0
Динамическое создание компонентов на модальной форме
    #39699496
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure TForm1.btn1Click(Sender: TObject);
var
  Form2: TForm2; // Локальная переменная в процедуре TForm1.btn1Click
begin
  Form2:= TForm2.Create(Application);
  Form2.ShowModal;
end;

// unit2
procedure TForm2.FormCreate(Sender: TObject);
var
  Memo: TMemo;
begin
  Memo:= TMemo.Create(Form2); // Проверьте, чему равна Form2. Скорее всего nil. Но точно не Form2 из процедуры TForm1.btn1Click
  Memo.Parent:= Form2;
end;


Вывод - лучше всего использовать Self
...
Рейтинг: 0 / 0
Динамическое создание компонентов на модальной форме
    #39699499
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S.
Подсказка с "Self" правильная, а .Visible в true выставить хуже не сделает, но, думаю, он уже true по умолчанию.
...
Рейтинг: 0 / 0
Динамическое создание компонентов на модальной форме
    #39699503
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
var
  Form2: TForm2;
begin
  Form2:= TForm2.Create(Application);
  Form2.ShowModal;



так вот, локальная переменная Form2 хоть и зовется так же, как и в Unit2, но совершенно ей не равна. Они просто тёзки
...
Рейтинг: 0 / 0
Динамическое создание компонентов на модальной форме
    #39699509
AJi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AJi
Гость
afordAJi,

работает, спасибо! А почему так? Родитель получается сам, память выделена самим, а отображается на форме? Он потом корректно выгрузится из памяти?
Выше уже все ответили.
Не факт, что Form2 и есть ваша форма. А self, внутри самой формы однозначно определяет к какому объекту вы обращаетесь.
...
Рейтинг: 0 / 0
Динамическое создание компонентов на модальной форме
    #39699510
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все равно не пойму
Код: 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.
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Unit2;

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

var
  Form1: TForm1;
  Form2: TForm2;

implementation



{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin
  Form2:= TForm2.Create(Application);
  Form2.ShowModal;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Memo: TMemo;
begin
  Memo:= TMemo.Create(Form1);
  Memo.Parent:= Form1;
end;

end.


Unit2
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure TForm2.FormCreate(Sender: TObject);
var
  Panel: TPanel;
begin

  Panel:= TPanel.Create(Application);
  Panel.Parent:= Unit1.Form2;
  Panel.ParentColor:= False;
  Panel.Color:= clBlue;
end;



Тоже не работает...
...
Рейтинг: 0 / 0
Динамическое создание компонентов на модальной форме
    #39699516
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в том ещё, сейчас подумал, что в момент отработки OnCreate в переменную Form2 ещё ничего не записано. Вроде бы.
...
Рейтинг: 0 / 0
Динамическое создание компонентов на модальной форме
    #39699519
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И соответственно не ясно, как оно с Form1 отработать могло. Там же на этот момент ещё мусор записан.
...
Рейтинг: 0 / 0
Динамическое создание компонентов на модальной форме
    #39699521
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure TForm2.FormShow(Sender: TObject);
var
  Panel: TPanel;
begin
  Panel:= TPanel.Create(Application);
  Panel.Parent:= Unit1.Form2;
  Panel.ParentColor:= False;
  Panel.Color:= clBlue;
end;


Вот так работает, только цвет почему-то не меняется у панели
...
Рейтинг: 0 / 0
Динамическое создание компонентов на модальной форме
    #39699528
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используйте Self. И багов будет меньше.
А переменные Form1 и Form2 (и далее по аналогии) лучше вообще забыть, что такие есть. И если из другой формы надо стучаться в какую-нибудь ещё, то лучше предварительно передать в неё ссылку на объект. Тогда и багов, связанных с тем, что инстанций какой-нибудь формы >1 не будет, и код будет более явный
...
Рейтинг: 0 / 0
Динамическое создание компонентов на модальной форме
    #39699536
aford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все, разобрался. Спасибо за ответы!
а панель не окрашивалась, т.к. по умолчанию
Код: pascal
1.
Panel.ParentBackground:= True;


Поправил на True и все заработало как надо.
...
Рейтинг: 0 / 0
Динамическое создание компонентов на модальной форме
    #39699620
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afordprocedure TForm2.FormShow(Sender: TObject);
var
Panel: TPanel;
begin
Panel:= TPanel.Create(Application);
Panel.Parent:= Unit1.Form2;
Panel.ParentColor:= False;
Panel.Color:= clBlue;
end;
Вот так работает, только цвет почему-то не меняется у панели
Вот прямо в тему:Я ужасно не люблю, когда я иду, иду себе спокойно, и тут вдруг – БАЦ! – грабли. То есть, конечно, грабли – это неприятно само по себе, но когда они вот такие внезапные – это очень огорчительно. Другой вопрос, что иногда на них наступить очень хочется.
И вот здесь-то вступает в действие мое правило «наступать на грабли очень аккуратно». Это значит:
- убедиться, что это именно грабли;
- выяснить, из чего эти грабли состоят и чем конкретно они плохи;
- посмотреть, как на них наступают другие;
- посмотреть на то, что им за это потом прилетает;
- прикинуть, как после этого жить дальше;
- хорошенько подумать, может, без грабель все-таки будет лучше…
И только потом, когда все взвешено, обдумано и спланировано, на них наступить.
(С) https://bash.im/quote/451826
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Динамическое создание компонентов на модальной форме
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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