Delphi: Как встроить форму VCL в панель - PullRequest
0 голосов
/ 11 июня 2019

Форма «Form1» содержит панель.

На этой панели мы хотим встроить вторую форму "Form2".

Но должны быть встроены не только компоненты, но и функциональность.

Я использую форму VCL.

Я уже пробовал этот урок на этой странице.

Как разместить форму на панели

unit parent;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, child;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form2 := TForm2.Create(Panel1);
  with Form2 do
    Name := 'MyForm';
    Parent := Panel1;
    Width := 500;
    Height := 500;
    Top := 10;
    Left := 10;
    Show;
end;

end.

unit child;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm2 = class(TForm)
    btnCalc: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    procedure btnCalcClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.btnCalcClick(Sender: TObject);
begin
  edit3.Text:=edit1.Text+edit2.Text;
end;

end.

Форма не отображается при запуске, а Форма 2 не встроена в Форму 1.

1 Ответ

1 голос
/ 12 июня 2019

Для дальнейшего использования, когда вы отправите вопрос о коде, скопируйте и вставьте фактический код и сообщите возможные отображаемые ошибки .

В первой редакции вашего вопроса ваш код воссоздал Form1 в конструкторе той же формы. Через некоторое время программа завершается с ошибкой нехватки ресурсов.

Во втором издании, где вы исправили ошибочные ссылки от Form1 до Form2, в вашем коде все еще отсутствует пара begin .. end вокруг свойств, которые вы хотите установить после with Form2 do. Эта ошибка приводит к переполнению стека, поскольку вы устанавливаете Form1 parent в Panel1, который является потомком Form1, то есть дилемма куриное яйцо.

Поскольку вы не упомянули ни одну из этих ошибок, можно только сделать вывод, что ваш код отличается от того, что вы опубликовали, или вы считаете, что сообщения об ошибках не важны. НЕПРАВИЛЬНО! Поэтому, пожалуйста, возьмите урок и обратите внимание на отправьте фактический код и сообщите о любых сообщениях об ошибках .

Также, если ваш вопрос касается появления формы, опубликуйте содержимое файла .dfm.


Со следующим кодом Form2 показано встроенным в Panel1 из Form1 (я удалил настройки ширины и высоты, чтобы уменьшить изображение):

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form2 := TForm2.Create(Panel1);
  with Form2 do
  begin
    Name := 'MyForm';
    Parent := Panel1;
    Top := 10;
    Left := 10;
    Show;
  end;
end;

enter image description here

Свойства Top и Left выглядят не так, как ожидалось. Это связано с тем, что по умолчанию для свойства TForm.Position установлено значение poDefaultPosOnly, что означает, что форма обходит настройки Top и Left и оставляет ее на усмотрение ОС для определения местоположения. Тем не менее, так как форма предоставлена ​​родителю, который также не применяется, и форма просто размещается в позиции 0,0. Добавьте строку, касающуюся свойства position ниже (или задайте ее в конструкторе Form2).

...
Parent := Panel1;
Position := poDesigned; // add this line
BorderStyle := bsNone;  // and this for a better embedded appearance
Top := 10;
...

Результат теперь:

enter image description here

...