Class 在Delphi中,如何使类型只能在类的函数/方法之间通过

Class 在Delphi中,如何使类型只能在类的函数/方法之间通过,class,delphi,types,private,Class,Delphi,Types,Private,我目前有以下代码 interface {...} type TMyRecord = record List : TShellList; Tree : TShellTree; Image : TImage; end; TSDIAppForm = class(TForm) { Published declarations } private f

我目前有以下代码

   interface

   {...}   

   type
      TMyRecord = record
        List : TShellList;
        Tree : TShellTree;
        Image : TImage;
      end;

      TSDIAppForm = class(TForm)
        { Published declarations }
      private
        function GetChildren(Sheet : TTabSheet) : TMyRecord;
      public
        { Public declarations }
      end;

据我所知,这意味着TMyRecord是一种对整个程序可见的全局类型。该类型只需要在类中可见,尽管该类型的对象确实需要作为参数在类的“私有”函数/过程之间传递和返回。我该怎么做?我不能在类接口的“private”部分下声明该类型,如果我在实现中声明它,那么我不认为它可以在接口函数原型中使用。此外,我认为实现/接口与单元内的可见性的关系比类更大。我是否需要以其他方式声明getChildren()函数

根据Uwe,只需在私人部分声明。在XE8中测试。以下作品

  TSDIAppForm = class(TForm)
  private
  type
    TMyRecord = record
      List : TShellList;
      Tree : TShellTree;
      Image : TImage;
    end;

    function GetChildren(Sheet : TTabSheet) : TMyRecord;
  public
    { Public declarations }
  end;

如其他答案中所述,在支持嵌套类型的Delphi版本中,您只需在所需的范围和可见性内声明类型即可

对于旧版本的Delphi,您可以通过使用非类型化的var参数来实现类似的结果,以避免必须在单元的界面中引用“私有类型”:

TSDIAppForm = class(TForm)
  ..
  procedure GetChildren(Sheet : TTabSheet; var aRecord);
  ..
end;
为方便起见,在实现该方法时,可以使用
absolute
声明创建局部变量作为非类型化参数的占位符:

procedure TSDIAppForm.GetChildren(    Sheet : TTabSheet; 
                                  var aRecord);
var
  result: TMyRecord absolute aRecord;
begin
  result.List := ...;
  // etc
end;
在这种情况下,由于函数没有直接返回值,并且以直接分析的方式使用var参数,因此您可以选择使用name
result
,如图所示。当然,您也可以为您喜欢的局部变量使用任何其他名称

在使用中,您只需在
var
param中使用适当的变量将此方法正常调用:

var
  myRec: TMyRecord;
begin
  ..
  sdiForm.GetChildren(someSheet, myRec);
  ..
end;
通过这种方式,您可以将实现细节的类型真正限制在单元的实现部分

注意:如果类型化的var参数可能会导致编译器抱怨“形式化的var参数类型不匹配”,那么这种技术也很有用

你当然应该仔细考虑他们是否是正确的方法。不仅如此,因为无论何时使用非类型化参数,您都要为确保代码中的类型安全承担更大的责任。滥用的可能性应该是显而易见的,但它们有时也会带来好处(在本例中,从接口部分中完全删除一个类型,而这个类型可以说是最合适的,完全局限于实现部分)


如果您创建的代码可能希望提供给旧版本的Delphi用户,而这些版本中没有私有类型等,那么它们也可以是一个有用的工具。为什么不能在私有部分声明类型?你用的是哪种德尔福版本?哦,天啊,我想我可以。我得到了一个错误,但现在它的工作。我无法在谷歌上搜索到任何类似的例子。谢谢。结束这个问题是不合适的。关闭的原因取决于Delphi语言的功能,而这些功能并非在所有版本中都存在,因此问题和各种答案可能对许多人都有用(在这种情况下,与OP使用的特定版本无关)。更合适的做法是删除对嵌套类型机制的错误引用,将问题留给如何实现特定结果的请求,而不是解决特定的实现错误。为什么首先需要隐藏记录类型?这对你的程序有什么好处?在我看来,创建一个不能使用的公共记录类型比使用一个非类型化的参数要好。是的,当然,通过解释其他可能性,那些不知道的人有机会形成意见。在这种情况下,已经表达了一种偏好——不仅仅是在问题本身中——不具有“公共但禁止的”类型,我只是演示了如何避免这种偏好,即使使用不支持公共-私有“禁止的”类型的Delphi版本(这是imho不关闭问题的一个坚实理由——不是每个人都使用“德尔福”可以访问这些)。这个问题是由一个无法再复制的问题或一个简单的印刷错误引起的。这是不可否认的事实。