Delphi 发送了 TObjectList like var 参数
Delphi Sent TObjectList like var parameter
我有class
TFolder = class
NODE_INDEX: Integer;
FIRST_INDEX : Integer;
CODE_NAME: AnsiString;
NAME: AnsiString;
constructor Create(NewNODE_INDEX, NewFIRST_INDEX: Integer; NewCODE_NAME, NewNAME: AnsiString);
destructor Destroy; override;
end;
我有类型
type
TFolderList = class (TObjectList<TFolder>)
end;
那我试试用这个
TAccount = class
...
FOLDERS: TFolderList;
public
constructor Create(...);
destructor Destroy; override;
procedure LoadFoldersFromDisk(var _objectList: TFolderList);
end;
当我尝试像参数一样发送我的 TObject 列表时
procedure TForm1.FormCreate(Sender: TObject);
begin
olLOCALFolders := TObjectList<TFolder>.Create();
Account.LoadFoldersFromDisk(olLOCALFolders);
end;
我收到错误 "Types of actual and formal var parameters must be identical"。我做错了什么?
只需将 TObjectList<TFolder>
替换为您定义的 TFolderList
:
procedure TForm1.FormCreate(Sender: TObject);
begin
olLOCALFolders := TFolderList.Create();
Account.LoadFoldersFromDisk(olLOCALFolders);
end;
但是,您可能不需要在此处使用 var 参数 - 方法名称 LoadFoldersFromDisk
建议该方法将使用项目填充作为参数发送的列表,为此您可以按值发送列表.如果该方法会提醒列表对象的内存位置(而不是它的内容),即当 LoadFoldersFromDisk
可以释放原始列表并创建新列表时,您只需要使用 var 参数。
错误是因为您的子class 是一种新类型,与TObjectList<TFolder>
不同,因此出现错误。
像这样导出子class可能是错误的:
type
TFolderList = class (TObjectList<TFolder>)
end;
这样做会迫使所有各方都使用该类型,并剥夺您利用通用类型兼容性的机会。如果您有一个在 TObjectList<T>
上运行的通用方法,那么您的新类型将不兼容。
而是声明一个别名:
type
TFolderList = TObjectList<TFolder>;
关于别名的要点是,它是同一类型的不同名称,而不是您的代码声明的新类型。
或者直接在任何地方使用 TObjectList<TFolder>
而无需声明 TFolderList
。
更广泛地说,您的 TFolder
类型似乎更适合作为值类型。我认为它作为记录可能比 class 更好。
此外,var 参数显示不正确。如果函数要修改引用,您将使用 var 参数。但它将填充调用者传入的列表。您应该从参数列表中删除 var。
我有class
TFolder = class
NODE_INDEX: Integer;
FIRST_INDEX : Integer;
CODE_NAME: AnsiString;
NAME: AnsiString;
constructor Create(NewNODE_INDEX, NewFIRST_INDEX: Integer; NewCODE_NAME, NewNAME: AnsiString);
destructor Destroy; override;
end;
我有类型
type
TFolderList = class (TObjectList<TFolder>)
end;
那我试试用这个
TAccount = class
...
FOLDERS: TFolderList;
public
constructor Create(...);
destructor Destroy; override;
procedure LoadFoldersFromDisk(var _objectList: TFolderList);
end;
当我尝试像参数一样发送我的 TObject 列表时
procedure TForm1.FormCreate(Sender: TObject);
begin
olLOCALFolders := TObjectList<TFolder>.Create();
Account.LoadFoldersFromDisk(olLOCALFolders);
end;
我收到错误 "Types of actual and formal var parameters must be identical"。我做错了什么?
只需将 TObjectList<TFolder>
替换为您定义的 TFolderList
:
procedure TForm1.FormCreate(Sender: TObject);
begin
olLOCALFolders := TFolderList.Create();
Account.LoadFoldersFromDisk(olLOCALFolders);
end;
但是,您可能不需要在此处使用 var 参数 - 方法名称 LoadFoldersFromDisk
建议该方法将使用项目填充作为参数发送的列表,为此您可以按值发送列表.如果该方法会提醒列表对象的内存位置(而不是它的内容),即当 LoadFoldersFromDisk
可以释放原始列表并创建新列表时,您只需要使用 var 参数。
错误是因为您的子class 是一种新类型,与TObjectList<TFolder>
不同,因此出现错误。
像这样导出子class可能是错误的:
type
TFolderList = class (TObjectList<TFolder>)
end;
这样做会迫使所有各方都使用该类型,并剥夺您利用通用类型兼容性的机会。如果您有一个在 TObjectList<T>
上运行的通用方法,那么您的新类型将不兼容。
而是声明一个别名:
type
TFolderList = TObjectList<TFolder>;
关于别名的要点是,它是同一类型的不同名称,而不是您的代码声明的新类型。
或者直接在任何地方使用 TObjectList<TFolder>
而无需声明 TFolderList
。
更广泛地说,您的 TFolder
类型似乎更适合作为值类型。我认为它作为记录可能比 class 更好。
此外,var 参数显示不正确。如果函数要修改引用,您将使用 var 参数。但它将填充调用者传入的列表。您应该从参数列表中删除 var。