Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在delphi中定义类内部的类?_Delphi_Delphi 2009 - Fatal编程技术网

如何在delphi中定义类内部的类?

如何在delphi中定义类内部的类?,delphi,delphi-2009,Delphi,Delphi 2009,我正在尝试学习一些新技巧,以便更好地在Delphi中组织单元中的一些源代码。 我注意到我访问的一些函数或方法似乎是类中的类,但我还没有成功地在类中创建一个工作类,尽管它编译得很好,但在执行代码时仍然会收到错误消息 我想做的是创建一个树,其中包含函数、过程和值,以进行设置或获取。如果有人能帮我举个例子,我将不胜感激。 我今天有一些类型的课程。 然后,我将类型分配给一个变量: 某物 然后,为了发生什么事,我写了“一些事,行动” 我的目标是更进一步,定义子功能或/和子程序。 假设我有三四节课。TSni

我正在尝试学习一些新技巧,以便更好地在Delphi中组织单元中的一些源代码。 我注意到我访问的一些函数或方法似乎是类中的类,但我还没有成功地在类中创建一个工作类,尽管它编译得很好,但在执行代码时仍然会收到错误消息

我想做的是创建一个树,其中包含函数、过程和值,以进行设置或获取。如果有人能帮我举个例子,我将不胜感激。 我今天有一些类型的课程。 然后,我将类型分配给一个变量: 某物 然后,为了发生什么事,我写了“一些事,行动”

我的目标是更进一步,定义子功能或/和子程序。 假设我有三四节课。TSnippet、战术1、战术2、战术1等。 我希望使用这些变量或将其分配给单个变量,并像以下那样使用它们:

Snippet.Action1.SubAction1.Organize(param1,param2);
Snippet.Action2.SubAction2.Returns='SomeString';
Snippet.Action1.SubAction1.SomeProcedure;
有谁能帮我举一个有用的例子,比如如何为这种方法编写代码? 而且。。anybydy知道这样的代码实现将如何影响执行代码所需的CPY循环,而不是让数千个过程具有所有不同的名称,但更直接的访问(感觉更直接的访问)的旧式方法吗

我的第一篇文章可能有点不清楚,如下所示。 我想利用编辑器提供的程序/函数的自动建议来简化编程。 我开始为此制作课程,效果非常好。 考虑一个类名“数据”。我们可以用数据做什么?我们可以编辑、添加、删除、保存和加载。 好啊这是我的第一节课

然后考虑另一个类:“加密”。我们可以做DES,DES3,HASH,BITSHUFFLE。 我可以继续上第三节课:“压缩”。我们可以做LZW,ZIP,RAR,MP3,MPG,MP4等

我不想将它们作为3个不同的类来使用,而是想将它们组合在一个类中,同时保持它们的独立性。 我想为其他类制作一种自己的类。我们可以称之为“MyStuff”

每当我在编辑器中键入“MyStuff.”时,我都会得到一个“数据、加密、压缩”列表。此外,当我选择“Compress”时,该类的过程和函数的下一个列表将列出

这些类可能有一些局部变量,但主要功能将面向全局数组

也许还有其他方法可以实现这一点。我不知道。 我的基本目标是能够对属于同一类的例程进行分类和组合。 这已经以单位完成,但这对编辑器中的自动列表没有帮助。 先谢谢你。
莫顿。

编辑后,我想我明白你在问什么了

您所称的“类中的类”称为
属性
方法
;它们是在其包含类中声明的其他类、变量或过程/函数。您正在谈论的“列表”称为
codeinsight
,它向您显示了此时代码中引用的类的可用属性和方法

这应该像您描述的那样,并让您了解如何在自己的代码中实现它:

unit MyStuffUnit;

interface

uses
  SysUtils;

type

  TEncryptionType = (etDES, etDES3, etHASH, etBITSHUFFLE);

  TMyStuffEncryption = class(TObject)
  private
    FEncryptType: TEncryptionType;
  public
    constructor Create;
  published
    property EncryptionType: TEncryptionType read FEncryptType
      write FEncryptType;
  end;

  TCompressionType = (ctLZW, ctZIP, ctRAR, ctMP3, ctMPG, ctMP4);

  TMyStuffCompression = class(TObject)
  private
    FCompressionType: TCompressionType;
  public
    constructor Create;
  published
    property CompressionType: TCompressionType read FCompressionType
      write FCompressionType;
  end;

  TMyStuff = class(TObject)
  private
    FCompression: TMyStuffCompression;
    FEncryption: TMyStuffEncryption;
  public
    constructor Create;
    destructor Destroy; override;
  published
    property Compression: TMyStuffCompression read FCompression
      write FCompression;
    property Encryption: TMyStuffEncryption read FEncryption
      write FEncryption;
  end;

implementation

constructor TMyStuffEncryption.Create;
begin
  inherited;
  FEncryptType := etDES;
end;

constructor TMyStuffCompression.Create;
begin
  inherited;
  FCompressionType := ctLZW;
end;

constructor TMyStuff.Create;
begin
  inherited;
  FCompression := TMyStuffCompression.Create;
  FEncryption := TMyStuffEncryption.Create;
end;

destructor TMyStuff.Destroy;
begin
  FCompression.Free;
  FEncryption.Free;
  inherited;
end;

end.
如果在代码中创建
TMyStuff
的实例,您应该能够键入
MyStuff.
并获得选择
Compression
Encryption
的选项。选择
Compression
应允许您设置
CompressionType
属性


这应该足以让您继续。:-)请记住,Delphi几乎在所有版本中都包含VCL和RTL的源代码,因此您总是需要查看这些代码以获取示例。(它们并不总是最好的例子,但它们应该给你一些如何做事的想法。)

你的问题很不清楚。你能给出一个实际函数或方法的例子,它似乎是你提到的类中的类吗?你意识到在实现部分声明的任何东西都是该单元固有的私有,即使它没有在其他东西中声明?@mortenbrendfur:回应Ken的评论,你的问题很模糊。您的问题的一些清晰的代码示例将有助于我们为您提供正确的答案。”“类型类”没有意义:所有类都是类型,必须在类型部分声明它们。“一个类中的一个类”是可以完成的,但在面向对象的20年中,我从来没有必要做这样的事情。只需使用对象组合和委托:一个类引用或生成一个单独类的实例。类对其他人的可见性取决于uses子句、访问修饰符、单元中的位置等@mortenbrendfur:就性能考虑而言,除非您使用的是某种非常有限的嵌入式设备,以及现代硬件,性能上的差异将是如此之小,以至于不值得考虑,除非您处于某种非常紧密、非常长的循环中——这从一开始就是糟糕的代码。通常情况下,一个好的OOP设计即使不是更好,也会和过程方法一样有效。@Mikey谢谢。我意识到我现在有几个月的时间来将我的旧源代码转换成这种“新”的工作和编写源代码的方式。有了简单的例子,一切都变得简单多了,我相信过一段时间我就能把它变得非常复杂:)最棒的是,我看到了这种设计源代码的“新”方法的明显优势。非常感谢您提供了这个例子。我会来回测试一下。如果可以的话,我还有一个问题。创造和自由。我想他们只是在需要时将函数“加载”到内存中,然后释放内存?如何在初始化PAR中创建