Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Динамическое создание компонентов на модальной форме  [new]
aford
Member

Откуда:
Сообщений: 43
Всем привет.
Не пойму в чем проблема, создаю модальную форму, на ней в onCreate должны динамически создаваться компоненты, но они создаются только если владельцем является панель. В чем может быть дело?

Тут все прекрасно работает
procedure TForm1.FormCreate(Sender: TObject);
var
  Memo: TMemo;
begin
  Memo:= TMemo.Create(Form1);
  Memo.Parent:= Form1;
end;


А тут нет
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;
7 сен 18, 11:43    [21667932]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание компонентов на модальной форме  [new]
AJi
Member

Откуда: Москва
Сообщений: 71
aford,

Попробуйте использовать Self.
procedure TForm2.FormCreate(Sender: TObject);
var
  Memo: TMemo;
begin
  Memo:= TMemo.Create(Self);
  Memo.Parent:= Self;
end;
7 сен 18, 11:48    [21667943]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание компонентов на модальной форме  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6269
   Memo.Visible := true;
7 сен 18, 11:52    [21667945]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание компонентов на модальной форме  [new]
aford
Member

Откуда:
Сообщений: 43
AJi,

работает, спасибо! А почему так? Родитель получается сам, память выделена самим, а отображается на форме? Он потом корректно выгрузится из памяти?
7 сен 18, 11:52    [21667947]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание компонентов на модальной форме  [new]
aford
Member

Откуда:
Сообщений: 43
Кроик Семён, оно по умолчанию всегда true вроде)
7 сен 18, 11:53    [21667949]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание компонентов на модальной форме  [new]
goldmi45
Member

Откуда:
Сообщений: 1053
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
7 сен 18, 11:55    [21667951]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание компонентов на модальной форме  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6269
P.S.
Подсказка с "Self" правильная, а .Visible в true выставить хуже не сделает, но, думаю, он уже true по умолчанию.
7 сен 18, 11:56    [21667954]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание компонентов на модальной форме  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6269
var
  Form2: TForm2;
begin
  Form2:= TForm2.Create(Application);
  Form2.ShowModal;


так вот, локальная переменная Form2 хоть и зовется так же, как и в Unit2, но совершенно ей не равна. Они просто тёзки
7 сен 18, 11:58    [21667959]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание компонентов на модальной форме  [new]
AJi
Member

Откуда: Москва
Сообщений: 71
aford
AJi,

работает, спасибо! А почему так? Родитель получается сам, память выделена самим, а отображается на форме? Он потом корректно выгрузится из памяти?

Выше уже все ответили.
Не факт, что Form2 и есть ваша форма. А self, внутри самой формы однозначно определяет к какому объекту вы обращаетесь.
7 сен 18, 12:03    [21667970]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание компонентов на модальной форме  [new]
aford
Member

Откуда:
Сообщений: 43
Все равно не пойму
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
procedure TForm2.FormCreate(Sender: TObject);
var
  Panel: TPanel;
begin

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


Тоже не работает...
7 сен 18, 12:03    [21667971]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание компонентов на модальной форме  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6269
Дело в том ещё, сейчас подумал, что в момент отработки OnCreate в переменную Form2 ещё ничего не записано. Вроде бы.
7 сен 18, 12:08    [21667981]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание компонентов на модальной форме  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6269
И соответственно не ясно, как оно с Form1 отработать могло. Там же на этот момент ещё мусор записан.
7 сен 18, 12:10    [21667986]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание компонентов на модальной форме  [new]
aford
Member

Откуда:
Сообщений: 43
procedure TForm2.FormShow(Sender: TObject);
var
  Panel: TPanel;
begin
  Panel:= TPanel.Create(Application);
  Panel.Parent:= Unit1.Form2;
  Panel.ParentColor:= False;
  Panel.Color:= clBlue;
end;

Вот так работает, только цвет почему-то не меняется у панели
7 сен 18, 12:11    [21667990]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание компонентов на модальной форме  [new]
Кроик Семён
Member

Откуда: СПб --> Dortmund
Сообщений: 6269
Используйте Self. И багов будет меньше.
А переменные Form1 и Form2 (и далее по аналогии) лучше вообще забыть, что такие есть. И если из другой формы надо стучаться в какую-нибудь ещё, то лучше предварительно передать в неё ссылку на объект. Тогда и багов, связанных с тем, что инстанций какой-нибудь формы >1 не будет, и код будет более явный
7 сен 18, 12:17    [21668000]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание компонентов на модальной форме  [new]
aford
Member

Откуда:
Сообщений: 43
Все, разобрался. Спасибо за ответы!
а панель не окрашивалась, т.к. по умолчанию
Panel.ParentBackground:= True;

Поправил на True и все заработало как надо.
7 сен 18, 12:25    [21668014]     Ответить | Цитировать Сообщить модератору
 Re: Динамическое создание компонентов на модальной форме  [new]
alekcvp
Member

Откуда:
Сообщений: 1135
aford
procedure 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
7 сен 18, 13:51    [21668153]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить