【问题标题】:Tstringlist vs. Tstrings in a procedure call过程调用中的 Tstringlist 与 Tstrings
【发布时间】:2019-03-10 14:59:07
【问题描述】:

我想使用一个朋友的 Delphi 库,这个库包含几个过程,如下所示,带有 tstrings 类。

AStringsprocedure (param_lines : TStrings;  .....  others stuff) 
begin 
     ///  add some add lines eg. to a memo or ....
     param_lines.add ('some text'); 
     .....
end;

在参考代码中这些函数被称为类似

 AStringsprocedure (Outmemo.Lines, .... );

传递 vcl gui 组件。

我想使用这些函数,但我需要传递一个 TStringlist 类。 如何将此函数与 TStringlist、任何强制转换或...技巧一起使用?

【问题讨论】:

  • TStringList 是 TStrings 的后代,因此不需要强制转换。

标签: delphi


【解决方案1】:

在 Delphi 中,TStringList 是这样定义的:

TStringList = class(TStrings)

意思是TStringList 已经是TStrings。组件/控件公开诸如 TStrings 之类的属性,这是抽象的,内部没有实际实现。另一方面,TStringList 包含实际的实现。在内部,他们使用TStringList 来包含实际数据,但通过TStrings 使其可用。比如TStringsabstract方法中只描述签名...

procedure Insert(Index: Integer; const S: string); virtual; abstract;

然后TStringList 实际实现了它们...

procedure Insert(Index: Integer; const S: string); override;

长话短说,您不需要进行任何转换/转换 - 您可以按原样隐式传递您的 TStringList


奖金

有时,您可能会看到类似这样的内容...

var
  L: TStrings;
begin
  L:= TStringList.Create;
  ...
end;

TStringsTStringList 的基类,它只是您可能拥有的任何实现的占位符。但是当你真正创建它时,你告诉它使用什么实现。在大多数情况下,使用TStringList。但是时不时地,您可能会发现另一个继承自 TStrings 的类并实现它。如果您愿意,您甚至可以编写自己的实现,并根据需要覆盖抽象方法。

【讨论】:

  • FWIW,例如暴露的 TStrings VCL 组件被实现为构成 VCL 组件基础的 Windows 类的字符串存储的包装器。所以 TMemo 有一个内部 TMemoStrings (或类似的),它在多行模式下使用 Windows EDIT 控件,这是 TMemo 的底层控件,以操纵字符串。 FMX 通常不依赖此类 OS 定义的控件,因此通常直接使用 TStringList。
  • @Rudy 事实上,除了TStringList 之外的一个实现示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多