Как создать форму программно с парой компонентов в Делфи

Я работаю с Delphi 7 и я пытаюсь создать форму программно. Вот моя форма класс заглушка:

unit clsTStudentInfoForm;

interface

    uses Forms;

    type
        TStudentInfoForm = class (TForm)

        end;

implementation


end.

у меня также есть кнопка на моей основной форме (это просто обычная форма, которая должна создавать и показывать форму выше во время выполнения), и при нажатии она создает и показывает форму студента как модальное окно. Оно показывает форму, но на нем ничего нет. Единственное, что вы можете сделать, это нажать кнопку "Закрыть" в верхнем правом углу окна, чтобы закрыть он.

procedure TLibraryForm.btnShowStudentIfoFormClick(Sender: TObject);
var
    f : TStudentInfoForm;
begin
    f := TStudentInfoForm.CreateNew(Self);
    f.ShowModal;
    f.Free;
    f := nil;
end;

enter image description here

Я понятия не имею, как добавить компоненты в программно созданную форму (не во время выполнения, а в исходный код). Можете ли вы помочь мне написать код, который добавляет кнопку Okay в форму студента, а также устанавливает заголовок и высоту и ширину формы (код должен быть написан в файле формы студента)?

любые предложения и примеры будут высоко оценены. Спасибо.

2 ответов


по умолчанию (то есть: со всеми настройками конфигурации IDE по умолчанию) новые формы создаются автоматически. Будет показана только основная форма, а вторичные формы могут быть показаны с помощью:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show;
  Form3.ShowModal;
end;

это хорошая практика, чтобы отключить эту опцию создания авто. Перейдите в раздел: Инструменты > (Параметры среды) > (VCL) конструктор > параметры создания модуля и отключите / снимите флажок автоматическое создание форм и модулей данных.

создать (уже разработан) форма только тогда, когда это необходимо:
procedure TForm1.Button1Click(Sender: TObject);
var
  Form: TForm2;
begin
  Form := TForm2.Create(Self);
  Form.Show;
end;

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

type
  TForm2 = class(TForm)
  end;

//var
//  Form2: TForm2;  << Always delete these global variable

implementation

если вы не хотите настраивать такую вторичную форму с помощью конструктора форм, вам необходимо создать все элементы управления в коде во время выполнения. Следующим образом:

unit Unit2;

interface

uses
  Classes, Forms, StdCtrls;

type
  TForm2 = class(TForm)
  private
    FButton: TButton;
  public
    constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); override;
  end;

implementation

{ TForm2 }

constructor TForm2.CreateNew(AOwner: TComponent; Dummy: Integer = 0);
begin
  inherited CreateNew(AOwner);
  FButton := TButton.Create(Self);
  FButton.SetBounds(10, 10, 60, 24);
  FButton.Caption := 'OK';
  FButton.Parent := Self;
end;

end.

как вы видите, я использовал CreateNew конструктор. Это необходимые на T(Custom)Form производные:

использовать CreateNew вместо Create создать форму без использования связана .DFM-файл для его инициализации. Всегда используйте CreateNew если TCustomForm потомок-это не


создание модальных форм с элементами управления на лету-это просто:

procedure CreateGreetingForm;
var
  frm: TForm;
  lbl: TLabel;
  edt: TEdit;
  btn: TButton;
begin

  frm := TForm.Create(nil);
  try
    lbl := TLabel.Create(frm);
    edt := TEdit.Create(frm);
    btn := TButton.Create(frm);
    frm.BorderStyle := bsDialog;
    frm.Caption := 'Welcome';
    frm.Width := 300;
    frm.Position := poScreenCenter;

    lbl.Parent := frm;
    lbl.Top := 8;
    lbl.Left := 8;
    lbl.Caption := 'Please enter your name:';

    edt.Parent := frm;
    edt.Top := lbl.Top + lbl.Height + 8;
    edt.Left := 8;
    edt.Width := 200;

    btn.Parent := frm;
    btn.Caption := 'OK';
    btn.Default := true;
    btn.ModalResult := mrOk;
    btn.Top := edt.Top + edt.Height + 8;
    btn.Left := edt.Left + edt.Width - btn.Width;

    frm.ClientHeight := btn.Top + btn.Height + 8;
    frm.ClientWidth := edt.Left + edt.Width + 8;

    if frm.ShowModal = mrOk then
      ShowMessageFmt('Welcome, %s', [edt.Text]);

  finally
    frm.Free;
  end;

end;