错误:";“未声明的标识符”;使用其他单位的表格-Delphi 2010

错误:";“未声明的标识符”;使用其他单位的表格-Delphi 2010,delphi,delphi-2010,Delphi,Delphi 2010,我试图使用另一个单元的表单,但代码无法识别另一个单元 例如: unit uImpressao; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, uniGUITypes, uniGUIAbstractClasses, uniGUIClasses, uniGUIForm, uniGUIB

我试图使用另一个单元的表单,但代码无法识别另一个单元

例如:

     unit uImpressao;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics,
      Controls, Forms, Dialogs, uniGUITypes, uniGUIAbstractClasses,
      uniGUIClasses, uniGUIForm, uniGUIBaseClasses, uniPanel, uniURLFrame;

    type
      TfImpressao = class(TUniForm)
        ufRelatorio: TUniURLFrame;
        UniImage1: TUniImage;
        procedure UniImage1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    implementation

    {$R *.dfm}

    uses
      MainModule, Main, uBancoHoras;

procedure TfImpressao.UniImage1Click(Sender: TObject);
begin
  fBh.iTeste.Visible := false;
end;

end.


当我尝试在ubanchoras单元中使用uImpressao单元时,返回错误“未声明的标识符‘fImpressao’”。 在uImpressao单元中使用ubanchoras单元,效果很好

我不明白为什么这个错误发生在一个装置上,而不是另一个装置上


我希望你能帮助我

注意:请注意,此答案基于问题中发布的原始代码,随后被完全替换为新的、截然不同的代码

fBH未在单位
A
中声明,因此
fBH.iTeste.Visible:=True不可能工作;没有这样的变量。您删除了IDE为您创建的全局变量
fBH
(但有趣的是,您将
var
语句放在
implementation
关键字的正上方)

在声明中添加回(通过在类声明末尾和
实现
关键字之间添加
var fBH:TfBH;
),或者在需要使用时在unit
B
中创建表单实例,并从那里通过局部变量访问它


(无论您选择哪个方向,您都不会使用表单方法中的变量来处理表单;请改用
Self
。不要使用
fBH.showmodel
;改用
Self.showmodel
showmodel

function fBH: TfBH;

...
implementation
...

function fBH: TfBH;
begin
  Result := TfBH(MM.GetFormInstance(TfBH));
end;
因此,您定义了一个名为
fBH
的全局函数,该函数返回
TfBH
表单类的实例,似乎是通过某种工厂方法(可能在
MainModule
中定义的)实现的

uImpressao
中没有名为
fImpressao
的对应方法或变量,但是-编译器错误是
fImpressao
是未声明的标识符

假设
MM.GetFormInstance
适合此任务,并且假设您希望保留此设计模式,则必须(在
uImpressao
中)定义如下内容:

function fImpressao: TfImpressao;

...
implementation
...

function fImpressao : TfImpressao;
begin
  Result := TfImpressao(MM.GetFormInstance(TfImpressao));
end;

但是,我们看不到
MM.GetFormInstance
的实现细节,因此不能保证这会起作用-它只遵循
fBH
设置的模式。同意肯,你也许应该考虑一个更好的方式来管理你的表格。求助于全局变量或跨单元访问的全局方法来挖掘类实例感觉像是等待发生的头痛事…

您发布的代码也会生成
E2029标识符,因为您在接口中定义了一个全局
var
节,没有定义变量。这对于
单元A
单元B
都是如此-您声称
单元B
有效意味着您发布的代码与您实际编译和使用的代码不同。要求我们帮助调试您故意从正在测试的实际代码中修改的代码可能会使调试变得非常困难,并且让每个人都感到困惑。你应该试着发布你正在使用的代码。明白了,J。我应该用代码编辑我的问题吗?我试图减少整个代码,但实际上我删除了一些重要的部分。那我就把那部分代码全部贴出来,对吗?谢谢你的评论。不,事实上,我认为尝试制作一个最小的示例的方法是最好的主意-这将问题减少到演示问题所需的最小代码量,并使每个人都更容易。但是,如果您正在制作一个最小的示例,那么您应该始终确保首先对其进行测试,以确保包含了演示问题所需的正确、最小数量的代码。这样做的另一个好处是,在这个过程中,您将经常解决自己的问题!好吧,我正在测试。再次感谢。发布你能制作的最小代码来说明这个问题。发布假代码对任何人都没有帮助。这似乎仍然是一个问题,因为FB在代码中没有出现。肯,我有,但它仍然不起作用。我会用更多关于代码的信息来编辑这篇文章。谢谢你的回答,我希望当我发送代码的新部分时,我们可以解决这个问题。
function fImpressao: TfImpressao;

...
implementation
...

function fImpressao : TfImpressao;
begin
  Result := TfImpressao(MM.GetFormInstance(TfImpressao));
end;