Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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_Dynamic - Fatal编程技术网

delphi中的动态对象

delphi中的动态对象,delphi,dynamic,Delphi,Dynamic,我知道动态对象是在运行时创建的对象。我必须在项目中使用动态对象,但不太确定该做什么。除了定义之外,我不太确定动态对象实际上是什么,例如,单击按钮后会创建一个面板,但这并不是我想要的。它应该更加复杂和有意义 动态对象的其他示例是什么?何时或为什么使用它 在运行时在代码中创建的类的任何实例,并在不再需要它们时释放。对于非可视组件的类来说,这种情况经常发生,并且不能将其直接放到表单上 基本示例包括用于处理字符串或文本文件的TStringList、TFileStream或TResourceStream等

我知道动态对象是在运行时创建的对象。我必须在项目中使用动态对象,但不太确定该做什么。除了定义之外,我不太确定动态对象实际上是什么,例如,单击按钮后会创建一个面板,但这并不是我想要的。它应该更加复杂和有意义


动态对象的其他示例是什么?何时或为什么使用它

在运行时在代码中创建的类的任何实例,并在不再需要它们时释放。对于非可视组件的类来说,这种情况经常发生,并且不能将其直接放到表单上

基本示例包括用于处理字符串或文本文件的TStringList、TFileStream或TResourceStream等TStream子体、使用TThread的线程、TList等通用列表以及许多其他类

例如,要使用文本文件,动态创建的TStringList示例如下:

var
  SL: TStringList;
begin
  SL := TStringList.Create;
  try
    SL.LoadFromFile('C:\Temp\MyFile.txt');
    SL[0] := 'I changed this line.';
    SL.SaveToFile('C:\Temp\MyFile.txt');
  finally
    SL.Free;
  end;
end;

这听起来像是一个课堂项目,你似乎不理解其中的一些术语

简单概括一下,在Delphi中,您定义的任何类的实例都需要动态创建。这与记录不同,记录可以静态声明为变量,也可以动态分配

在这两种情况下,当动态创建实例时,类和记录的内存都是从堆中分配的,而不是从创建本地变量的堆栈中分配的。但每种情况下的语法都不同

在Delphi中,这与C++有很大的区别,因为C++类基本上是一些结构,比如Delphi记录,有一些修饰,这意味着你可以将C++中的类实例声明为成员变量,其中的内存以栈的形式分配,以同样的方式声明结构实例,以及Pascal中的记录。 但这在Delphi中不起作用,即使语法看起来相同。这是因为在Delphi中,引用类的变量实际上是指针,就像C++一样,但它们是自动去引用的,所以它们看起来像语法,就好像它们只是实例,而不是指向实例的指针。 在Delphi中,如果您使用的是类,则必须通过调用TMyObj.create…动态创建它。。。。因此,每个类都有一个与其关联的构造函数;如果不定义一个,则调用默认的TObject.Create构造函数。这又与C++中的不同,编译器将为编译器创建一个默认构造函数,用于任何需要定义的类,而不是定义。 我再重复一遍,这样你就明白了。在Delphi中定义的任何内容:

type
  Twhatever = class
相当于:

type
  Twhatever = class( TObject )
必须在代码中动态创建,如下所示:

var
  xyz : Twhatever; // xyz is really a pointer here! It's NOT an "instance"
begin
  xyz := Twhatever.Create(); // you need to create an instance using the Create() method
  try
    // do some stuff
  finally
    xyz.Free;
  end;

如果不先通过xyz的.Create方法创建它的实例,就不能使用xyz。

听起来你指的是组件和控件,而不是对象。这没有多大意义。让我们回到开头。你想达到什么目的?TArray不是一个物体,它实际上是一个动态的T数组。你是说T列表吗?@Rudy:是的,你说得对。正在修复。@Rudy::-出现评论通知时,正好在现场。