Перейти к содержанию
Fire Monkey от А до Я
  • 0

Я не понимаю, как динамически создавать объекты.


Виктор

Вопрос

Хочу спросить вот что:

Может взгляд совсем замылился, но создаю форму (в автосоздании убрано все кроме главной и data модуля), после создания пытаюсь обратиться к созданной форме из её же unit-а, и вылетает с ошибкой. Переменная пуста.

FFOrder:=TFFOrder.Create(Form1);

FFOrder.Parent:=Form1;
FFOrder.Name:='FFOrder';
FFOrder.ShowModal;
FFOrder.Free;

// в модуле Order обращаемся в форме и ошибка

FForder.Width:=DataM.Formwidth;

Костыль от этого я придумал, но совсем уж какой-то костыльный (FForder:=Panel1.Parent as TFForder )
Далее. Пытаюсь выставить размеры созданной формы в oncreate. Если в настройках формы отключить borderIcons то в модуле FMX.forms мы попадем в процедуру Recreate  которая перерисует форму и выставит начальные размеры указанные в дизайнере. Как этого избежать?

 

Projects.zip

Изменено пользователем Brovin Yaroslav
Добавлен файл проекта
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Сомневаюсь что у вас будет время и желания копать тысячи строк рабочего проекта. Для демонстрации создал новый проект и прикрепил.

И так что мы имеем по кнопке создается новая форма, если убрать строку: 

Form5:=Button1.Parent as TForm5;

Из модуля второй формы то вылетит с ошибкой. Почему так?

Кроме этого если у второй формы убрать системные иконки, то задать ей размеры при создании не получится, она будет создана с размерами заданными в дизайнере, и не центруется по центру объекта родителя. Если задать parent в ручную при создании, то форма отцентруется, но опять же заданные в oncreate размеры не применяться. Как это побороть?

Projects.zip

Ссылка на комментарий
  • 0
  • Администраторы

Глядя на ваш проект, я могу уверенно сказать, что вы не знаете основ объектно-ориентированного языка Delphi. А раз так, то я вам порекомендовал бы вначале изучить основы, а потом уже писать код. После прочтения, хотя бы Программирование на языке Delphi. Учебное пособие. у вас у самого отпадут многие вопросы и думаю вы по другому взгляните на свой код.
 
P.S. Пара мыслей на счет вашего кода:

  • Ваша ошибка: Попытка обратиться изнутри класса формы к полям формы, через внешнюю глобальную переменную, которая просто не создана.
    Например, здесь вы создаете форму и сохраняете ее в локальной переменной AForm
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Aform:TForm5;
    begin 
      Aform := TForm5.Create(Application);
      Aform.Parent := Form1;
      Aform.Width := Form1.Width;
      Aform.Height := Form1.Height;
      Aform.Left := Form1.Left;
      Aform.Top := Form1.Top;
      Aform.ShowModal;
      Aform.Destroy;
    end;
    
    А тут, почему-то считаете, что в Form5 содержит вашу форму, что и в AForm (Не верно, никакой связи между этими переменными нету).
    procedure TForm5.FormCreate(Sender: TObject);
    begin
      Form5 := Button1.Parent as TForm5;
      Form5.Height:=300;
      Form5.Width:=400;
    end;
    
  • Неправильно, Обращаться к форме внутри формы, через глобальную переменную по многим причинам.
    var
      Form5: TForm5;
    
    procedure TForm5.FormCreate(Sender: TObject);
    begin
      Form5 := Button1.Parent as TForm5;
      Form5.Height := 300;
      Form5.Width := 400;
    end;
    Отсюда при обращении к Form5.Height (где Form5 = nil в вашем случае) вы получите Aсcess Voiolation
  • Правильно: напрямую обращаться внутри класса к полям формы:
    var
      Form5: TForm5;
    
    procedure TForm5.FormCreate(Sender: TObject);
    begin
      Height := 300;
      Width := 400;
    end;
    
Изменено пользователем Brovin Yaroslav
Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...