【问题标题】:Button opens Form按钮打开表格
【发布时间】:2021-04-24 13:36:15
【问题描述】:

我的问题是我想用过程 Button1Click(Sender: TObject); 创建新的表单和按钮。我遇到的问题是我不知道如何使用过程 TForm2.myClick(Sender: TObject); 打开新创建的表单。我希望通过不同的按钮创建不同的表单。

unit Unit1;

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)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  procedure myClick(Sender: TObject);
  end;

var
  Form2: TForm2;
var
  i:Integer = 1;
var
  a:Integer = 1;


implementation

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);
begin
  with TButton.Create(self) do begin
    Left := 80;
    Top := 50 + i * 60;
    Width := 300;
    Height := 50;
    Name := 'Liste' + IntToStr(i);
    Self.Caption := ClassName+' '+ IntToStr(i);
    OnClick := MyClick;
    Parent :=Form2;
  end;
  i:= i + 1;
  begin
          with TForm.Create(Self) do begin
                 Left := 0;
                 Top := 0;
                 Width := 1000;
                 Height := 700;
                 Name := 'Erinnerung' + IntToStr(a);
                 Caption := 'Erinnerung' + IntToStr(a);
                 Parent := self;
                 OnClick:= MyClick;
                 Visible:=false;
          end;
             a:= a + 1;
      end;
end;

procedure TForm2.myClick(Sender: TObject);
begin

end;




end.

【问题讨论】:

  • 我认为你需要在开始编码之前做一些规划。很明显,您希望您的Form2 有一个按钮,单击该按钮会创建其他按钮。这些按钮应在单击时创建并显示其他类型的表单。这些表单是设计时设计表单的实例,还是您想“在代码中设计它们”,如您的示例所示?所有这些次要表单都是同一类型,还是Form2 上的不同按钮会创建不同的表单?你考虑过MDI吗? 但最重要的是,要清楚这一点,您的问题到底是什么?
  • 创建表单时没有保留引用,这意味着无法从按钮单击事件轻松访问它。 (您可以遍历Screen.Forms 来尝试找到它,但您必须提前确切知道您要寻找哪种形式。您的设计似乎很差,但很难准确理解您的内容。重新尝试完成以提出更好的做事方式。

标签: forms delphi button


【解决方案1】:

您的问题中有一些未指定的项目。无论如何,我做了一个简单的例子来说明可以做什么。您将开始并修改此代码以满足您的需要。

此代码有一个带有单个按钮的表单 (TForm1)。每次用户单击按钮时,都会创建一个新按钮和一个新表单。创建的按钮显示在 TForm1 的列中,就像您所做的那样。表单已创建,但不像您所做的那样可见。列表保留对创建的按钮和表单的引用。

创建的按钮和表单的 Tag 属性设置为列表中的索引。按钮的 OnClick 事件处理程序使用此索引从列表中检索相应的表单并使其可见。

表单是使用 nil Parent 创建的,因此它是一个飞行窗口。如果您使用 Self 而不是 nil,则创建的表单将在 TForm1 中,很像 MDI 应用程序。

代码如下:

unit DynFormDemoMain;

interface

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

type
    TFormItem = record
        AForm   : TForm;
        AButton : TButton;
    end;
    TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
    private
        FList : TList<TFormItem>;
        procedure MyClick(Sender : TObject);
    public
        constructor Create(AOwner : TComponent); override;
        destructor Destroy; override;
    end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
    Item    : TFormItem;
    AButton : TButton;
    AForm   : TForm;
begin
    AButton         := TButton.Create(Self);
    AButton.Tag     := FList.Count;
    AButton.Left    := 80;
    AButton.Top     := 50 + AButton.Tag * 60;
    AButton.Width   := 300;
    AButton.Height  := 50;
    AButton.Name    := 'Liste' + IntToStr(AButton.Tag);
    AButton.Caption := ClassName + ' ' + IntToStr(AButton.Tag);
    AButton.OnClick := MyClick;
    AButton.Parent  := Self;

    AForm           := TForm.Create(Self);
    AForm.Tag       := AButton.Tag;
    AForm.Left      := AButton.Tag * 20;
    AForm.Top       := AButton.Tag * 20;
    AForm.Width     := 200;
    AForm.Height    := 100;
    AForm.Name      := 'Erinnerung' + IntToStr(AButton.Tag);
    AForm.Caption   := 'Erinnerung' + IntToStr(AButton.Tag);
    AForm.Parent    := nil;
    AForm.Visible   := FALSE;

    Item.AForm   := AForm;
    Item.AButton := AButton;
    FList.Add(Item);
end;

constructor TForm1.Create(AOwner: TComponent);
begin
    inherited;
    FList := TList<TFormItem>.Create;
end;

destructor TForm1.Destroy;
begin
    FreeAndNil(FList);
    inherited;
end;

procedure TForm1.MyClick(Sender: TObject);
var
    Item : TFormItem;
begin
    Item := FList[(Sender as TButton).Tag];
    if Assigned(Item.AForm) then
        Item.AForm.Show;
end;

end.

【讨论】:

  • 感谢您的所有回答。它真的帮助了我。
猜你喜欢
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
相关资源
最近更新 更多