delphi - 覆盖 TStringList.Delimiter

标签 delphi delphi-2007

TStringList.Delimiter 是一个 TChar。这使得 Delimitertext 成为可能

Test,Test,Test,Test

但我想用 ' 和 ' 作为结果的分隔符

Test and Test and Test and Test

当然可以这样解决

s := List[0];
for i := 1 to List.Count - 1 do
  s := s + ' and ' + List[i];

但是这样做会更优雅

List.Delimiter := ' and ';
s := List.DelimiterText;

所以我尝试使用此代码来覆盖 TStringList;

unit Unit5;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, cxContainer, cxEdit, Menus, StdCtrls, cxButtons, cxTextEdit,
  cxMemo;

type
  TForm5 = class(TForm)
    cxMemo1: TcxMemo;
    cxButton1: TcxButton;
    procedure cxButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TAttracsStringList = class(TStringList)
  private
    FDelimiter: String;
    procedure SetDelimiter(const Value: String);
    function GetDelimiter: String;
  public
    property Delimiter: String read GetDelimiter write SetDelimiter;
  end;

var
  Form5: TForm5;

implementation

{$R *.dfm}

function TAttracsStringList.GetDelimiter: String;
begin
  Result := FDelimiter;
end;

procedure TAttracsStringList.SetDelimiter(const Value: String);
begin
  FDelimiter := Value;
end;

procedure TForm5.cxButton1Click(Sender: TObject);
var
  vList: TAttracsStringList;
  i: Integer;
begin
  vList := TAttracsStringList.Create;
  try
    vList.Delimiter := ' and ';
    for i := 0 to 3 do
      vList.Add('Test');

    cxMemo1.Text := vList.DelimitedText;
  finally
    vList.Free;
  end;
end;

end.

这不起作用。备忘录得到结果

Test,Test,Test,Test

我该如何解决这个问题?

编辑 我现在看到 GetDelimiter 和 SetDelimiter 在 TStringList 中是私有(private)的。所以我不能覆盖它们。想知道是否有办法实现我想要的?

编辑2 我通过添加解决了它

property DelimitedText: String read GetDelimitedText;

使用方法

function TAttracsStringList.GetDelimitedText: String;
var
  i: Integer;
begin
  if Count > 0 then
  begin
    Result := Strings[0];

    for i := 1 to Count - 1 do
      Result := Result + Delimiter + Strings[i];
  end
  else
    Result := '';
end;

因此,如果有人没有更聪明的方法,我认为这个问题已经解决了。

最佳答案

确实还有另一种解决方案:

  lst := TStringList.Create;
  try
    for I := 1 to 4 do
      lst.Add('Test');
    lst.LineBreak := ' and ';
    Writeln(lst.Text);
  finally
    lst.Free;
  end;

作为一个缺点,各个条目没有被引用。

关于delphi - 覆盖 TStringList.Delimiter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35055429/

相关文章:

delphi - 在 Delphi 中检查值是否为日期/数字的正确方法是什么

delphi - 使用 Delphi 检索 ADO 错误

Delphi - TStringList 保存/加载到流编码

德尔福2006-2010错误: "Cannot create file C:\Users\Admin\AppData\Local\Temp\EditorLineEnds.ttr"

delphi - 如何访问 TCRDBGrid 组件中的搜索文本?

delphi - WinInet HttpQueryInfo 可以返回原始字节吗? (带有 unicode 字符的 HTTP header )

delphi - 在 Windows 7 上运行 Delphi 2007 和 Delphi 2010 IDE 是否存在问题?

Delphi Now() 函数返回错误值

delphi - 如何清除“运行”->“参数”菜单中的“参数”字段?

c++ - 如何在 C++ 中表达 Delphi 运算符 "<>"?