【问题标题】:Error: "Undeclared identifier" using a form from another Unit - Delphi 2010错误:“未声明的标识符”使用来自另一个单元的表单 - Delphi 2010
【发布时间】:2015-01-26 13:13:49
【问题描述】:

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

例子:

     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 单元时,返回错误“未声明的标识符 'fImpressao'”。 在 uImpressao 单元中使用 uBancoHoras 单元,效果很好。

我不明白为什么一个单元会发生此错误,而另一个单元不会发生此错误。

希望你能帮帮我!

【问题讨论】:

  • 您发布的代码也会生成E2029 Identifier expected but 'IMPLEMENTATION' found,因为您在没有定义变量的接口中定义了一个全局var 部分。 unit Aunit B 都是这种情况——您声称 unit B 有效意味着您发布的代码与您实际编译和使用的代码不同。要求我们帮助调试您从您正在测试的实际代码中故意修改的代码可能会使调试变得非常困难并且让每个人都感到困惑。您应该始终尝试发布您正在使用的确切代码。
  • 知道了,J。那么,我应该用代码编辑我的问题吗?我试图减少整个代码,但实际上我删除了一些重要部分。然后我会发布该部分代码的全部内容,对吗?感谢您的评论。
  • 不,事实上,我认为尝试制作一个最小示例的方法是最好的想法 - 这将问题减少到演示问题所需的最少代码量,并使每个人都更容易。但是,如果您正在制作一个最小的示例,则应始终确保首先对其进行测试,以确保包含正确、最少的代码来演示您的问题。这样做的另一个好处是,您通常会在此过程中解决自己的问题! stackoverflow.com/help/mcve
  • 好吧,我正在测试它。再次感谢。
  • 发布你能做的最小的代码来说明这个问题。发布假代码对任何人都没有帮助。这似乎仍然是个问题,因为 FB 在代码中没有出现。

标签: delphi delphi-2010


【解决方案1】:

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

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

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

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

【讨论】:

  • 肯,我做到了,但它仍然不起作用。我将使用有关代码的更多信息来编辑帖子。感谢您的回答,我希望当我发送新的部分代码时,我们可以解决问题。
【解决方案2】:

uBancoHoras你已经定义了

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 设置的模式。同意 Ken 的观点,您或许应该考虑一种更好的方式来管理您的表单。诉诸于跨单元的全局变量或全局方法来挖掘类实例感觉就像一个等待发生的头痛......

【讨论】:

    猜你喜欢
    • 2014-05-18
    • 1970-01-01
    • 2015-04-19
    • 2020-08-10
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多