Как создать форму программно с парой компонентов в Делфи
Я работаю с 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;
Я понятия не имею, как добавить компоненты в программно созданную форму (не во время выполнения, а в исходный код). Можете ли вы помочь мне написать код, который добавляет кнопку 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;