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.ShowModal
或 ShowModal
。)
在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 实例感觉就像等待发生的头痛......
我正在尝试使用另一个单元的表单,但代码无法识别另一个单元。
示例:
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.ShowModal
或 ShowModal
。)
在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 实例感觉就像等待发生的头痛......