【问题标题】:public procedure not visible in Delphi XE8在 Delphi XE8 中不可见的公共程序
【发布时间】:2016-01-11 09:56:40
【问题描述】:

我有一个用于登录我的应用程序的辅助表单,为此我有一个程序AddLine

type
  TFormLog = class(TForm)
    Memo1: TMemo;
  private
    procedure AddLine(aString: String);
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormLog: TFormLog;

implementation

{$R *.dfm}

{ TFormLog }

procedure TFormLog.AddLine(aString: String);
begin
  Memo1.Lines.Add(aString);
end;

当我使用自动完成 (Ctrl-Shift_C) 时,Delphi 将 AddLine 过程添加到 private 部分,因此很明显,当我尝试时,该过程对主窗体是不可见的

FormLog.AddLine('some text');

将声明移至公共部分并没有帮助:

type
  TFormLog = class(TForm)
    Memo1: TMemo;
  private
    { Private declarations }
  public
    { Public declarations }
    procedure AddLine(aString: String);
  end;

我仍然收到 AddLine 过程未解决的编译器错误。我确实将日志单元添加到 uses 子句中,所以 Formlog 在主窗体中是已知的。
尝试直接访问 TMemo 具有相同的效果。

如何修复我的代码,以便我可以从我的主表单向日志表单添加文本?​​

【问题讨论】:

  • AddLine 移至公共部分并保存表单。将单元添加到您的项目中。如果这不起作用,编译器必须选择另一个具有相同名称的单元或使用较早编译的单元(以某种方式看不到源代码)。
  • 至于选择另一个单元,我会启动 procmon,开始编译,停止 procmon 并验证编译了哪些 .pas 文件。很可能,这不是您假设的那个。
  • 报告您的实际错误并显示实际有问题的代码,而不是有效的代码。正确的代码无关紧要。使用复制和粘贴来报告编译器错误,而不是“它不起作用”或“我收到编译器错误”。

标签: forms delphi delphi-xe8


【解决方案1】:

从其他单元的代码中可以看到公共成员。您的错误的可能解释包括:

  1. 方法不公开。
  2. 您的实例变量不是您认为的类型。
  3. 您没有编译您认为正在编译的代码,或者链接器正在查找您不希望它找到的代码。

你还说:

尝试直接访问TMemo也有同样的效果。

同样,由于它已发布可见性,因此从单元外部可见。显然,类似于上面第 2 或第 3 项的事情正在发生。

底线是可以从任何代码中看到公共(和已发布)成员。问题出在您的代码中(只有您可以看到),您应该尝试通过询问该代码的问题来解决这个问题,而不是担心编译器有缺陷。

在更广泛的层面上,问题中提供的代码将方法声明为private。显然,该成员在单位外部是不可见的。作为一般规则,您应该提供您请求帮助的代码。

此外,如果您询问编译器错误,请逐字报告错误。描述你对错误的理解是一个很容易混淆的来源。人们误解编译器错误是很常见的。如果他们随后描述了他们的误解,沟通就会中断。逐字报告编译器错误,误会范围为零。

【讨论】:

  • 谢谢大卫。我在哪里说过编译器有缺陷?无处,我应该说。此外,我展示的代码是 Delphi 制作的(将声明放在私有部分中)。我说我把它移到public
  • 最好显示您希望我们评论的代码。据我们所知,您没有成功将代码移至公共部分。在我看来,您认为您有一个不可见的公共成员。如果您认为是这种情况,那将是编译器缺陷。
【解决方案2】:

我相信 AddLine 在 VCL Delphi 的某个地方是私有的。

因此尝试更改过程/方法名称 例如一个名字和你的名字完全不同,呵呵,看到错误发生,测试对变量或对象的访问到你的过程/方法中

或创建一个新项目进行测试

注意:如果 ADDLINE 是 MEMO 的一种方法,那么编译器无法解析调用的内容(我相信就是这样)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-06
    • 2021-11-29
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多