Error: "Undeclared identifier" using a form from another Unit - Delphi 2010

Error: "Undeclared identifier" using a form from another Unit - Delphi 2010

我正在尝试使用另一个单元的表单,但代码无法识别另一个单元。

示例:

     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.

    unit uBancoHoras;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, uniGUITypes, uniGUIAbstractClasses,
  uniGUIClasses, uniGUIForm, uniLabel, pngimage, uniImage, uniGUIBaseClasses,
  uniPanel, uniPageControl, uniButton, uniBitBtn, uniSpeedButton, uniCanvas,
  uniDateTimePicker, uniMemo, uniMultiItem, uniComboBox, uniEdit, uniBasicGrid,
  uniDBGrid, uniDBMemo, uniRadioButton, uniDBText, uniRadioGroup, frxClass,
  frxDBSet;

type
  TfBH = class(TUniForm)
    iTeste : TUniImage;
  private
    { Private declarations }
  public
    { Public declarations }

  end;

var
  url: string;

function fBH: TfBH;

implementation

{$R *.dfm}

uses
  MainModule, Main, uImpressao;

function fBH: TfBH;
begin
  Result := TfBH(MM.GetFormInstance(TfBH));
end;

procedure TfBH.iTesteClick(Sender: TObject);
begin
    fImpressao.ShowModal;
end;

当我尝试在 uBancohoras 单元中使用 uImpressao 单元时,returns 出现错误 "Undeclared identifier 'fImpressao'"。 在 uImpressao 单元中使用 uBancoHoras 单元,效果很好。

我不明白为什么这个错误发生在一台设备上,而另一台设备上却没有。

希望你能帮帮我!

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

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

在声明中重新添加(通过在 class 声明末尾和 implementation 关键字之间添加 var fBH: TfBH;),或者在单元 B 当你需要使用它并从那里通过局部变量访问它时。

(无论你往哪个方向走,你永远不会使用表单方法中的变量来处理表单;而是使用 Self。不要使用 fBH.ShowModal;使用 Self.ShowModalShowModal。)

uBancoHoras中你定义了

function fBH: TfBH;

...
implementation
...

function fBH: TfBH;
begin
  Result := TfBH(MM.GetFormInstance(TfBH));
end;

所以你已经定义了一个名为 fBH 的全局函数,它 returns TfBH 形式的一个实例 class,似乎是通过某种工厂方法(可能定义在 MainModule?)。

uImpressao 中没有名称为 fImpressao 的相应方法或变量,但是 - fImpressao 是一个 未声明的标识符[= 的编译器错误34=]。

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

function fImpressao: TfImpressao;

...
implementation
...

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

但是,我们看不到 MM.GetFormInstance 的实施细节,因此不能保证它会起作用 - 它仅遵循 fBH 设置的模式。同意 Ken 的观点,您或许应该考虑一种更好的方式来管理您的表单。求助于跨单元的全局变量或全局方法来挖掘 class 实例感觉就像等待发生的头痛......