【问题标题】:How to avoid writing a component in the form definition in .pas file如何避免在 .pas 文件中的表单定义中编写组件
【发布时间】:2019-06-07 11:07:29
【问题描述】:

这是对这个问题的跟进: Moving controls between Delphi components

在设计时,我将元素放入自定义 TPanel,但当我将它们写入 DFM 时,我更改了它们的名称

procedure TPanelDialogo.VolcarFrameEnLista( );
var
  i: integer;
  Componente: TControl;
begin
  // recorrer el frame y rescatar sus componentes
  if FDesignPanel = nil then
    exit;
  for i := FDesignPanel.ControlCount - 1 downto 0 do
  begin
    Componente := FDesignPanel.Controls[i];
    if Pos( self.Name + '_', Componente.Name ) = 0 then
    begin
      Componente.Name := self.Name + '_' + Componente.Name;
    end;
    if FListaComponentes.IndexOf(Componente) < 0 then
    begin
      FListaComponentes.Add( Componente );
    end;
  end;
end;

procedure TPanelDialogo.GetChildren(Proc: TGetChildProc; Root: TComponent);
var
  i: integer;
  OwnedComponent: TComponent;
begin
  if FDesignPanel <> nil then
    VolcarFrameEnLista();

  for i := 0 to self.FListaComponentes.Count - 1 do
  begin
    OwnedComponent := FListaComponentes.Items[i];
    Proc(OwnedComponent);
  end;
end;

在设计时,当我将标签放入自定义 TPanel 时,此标签会添加到 .pas 文件中的表单中:

在写入 DFM 文件时,我重命名了标签,如前所述,因此 .pas 文件中的声明不再有效。

这是 .pas 文件

type
  TForm1 = class(TForm)
    CRTTESTPANEL: TGENPant;
    PanelDialogo1: TPanelDialogo;
    Label1: TLabel;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

这就是 DFM

object Form1: TForm1
  ...
  object CRTTESTPANEL: TGENPant
    ...
  end
  object PanelDialogo1: TPanelDialogo
    ...
    object PanelDialogo1_Label1: TLabel
      ...
    end
  end
end

所以我收到此错误消息:

点击“是”后,这些是 DFM 和 pas 文件:

  TForm1 = class(TForm)
    CRTTESTPANEL: TGENPant;
    PanelDialogo1: TPanelDialogo;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
object Form1: TForm1
  ...
  object CRTTESTPANEL: TGENPant
  end
  object PanelDialogo1: TPanelDialogo
    ...
    object PanelDialogo1_Label1: TLabel
      ...
    end
  end
end

我想避免将标签声明写入 .pas 文件。我见过this question,但它与写入 DFM 文件有关,而不是文件。

有没有办法做我想做的事?

【问题讨论】:

  • "当我将它们写入 DFM 时,我会更改它们的名称" - 为什么?你根本不应该这样做。 “我想避免将标签声明写入 .pas” - 你不能。用户在设计时删除了一个组件,它由表单拥有,而不是您的组件。您的组件是父组件,而不是所有者
  • 在过去(Delphi 3)你可以清除组件的名称属性。这将导致组件在 pas 文件中没有变量声明,但在 dfm 文件中仍然可用。但是它有一些副作用:如果表单上没有任何该类型的组件,有时会出现运行时错误,因为流代码没有添加到表单中。不知道这是否仍然可行或完全解决您的问题。

标签: delphi delphi-7 dfm


【解决方案1】:

当您在设计时创建Label1 时,Delphi 会自动将其添加到tForm 接口中。但是没有理由你必须把它留在那里。你可以删除它。它只是为了方便起见,因此您可以从代码中引用它。如果您的代码没有引用标识符Label1,您可以将其从.PAS 文件中的接口中删除。

【讨论】:

  • 你觉得这有用吗?
猜你喜欢
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
  • 2012-01-30
  • 2021-06-09
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多