首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >覆盖TStringList.Delimiter

覆盖TStringList.Delimiter
EN

Stack Overflow用户
提问于 2016-01-28 07:39:07
回答 1查看 753关注 0票数 1

TStringList.Delimiter是TChar。这样就有可能将Delimitertext作为

代码语言:javascript
复制
Test,Test,Test,Test

但我希望有‘和’作为划界者的结果

代码语言:javascript
复制
Test and Test and Test and Test

我当然可以这样解决

代码语言:javascript
复制
s := List[0];
for i := 1 to List.Count - 1 do
  s := s + ' and ' + List[i];

但这样做会更优雅

代码语言:javascript
复制
List.Delimiter := ' and ';
s := List.DelimiterText;

所以我试着用这个代码来覆盖TStringList;

代码语言:javascript
复制
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.

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

代码语言:javascript
复制
Test,Test,Test,Test

我怎么才能解决这个问题?

编辑我现在看到GetDelimiter和SetDelimiter在TStringList中是私有的。所以我不能推翻他们。想知道是否有办法实现我想要的?

Edit2我通过添加解决了它

代码语言:javascript
复制
property DelimitedText: String read GetDelimitedText;

用方法

代码语言:javascript
复制
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;

因此,如果没有更聪明的方法,我认为这是解决了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-28 10:51:46

确实有另一种解决办法:

代码语言:javascript
复制
  lst := TStringList.Create;
  try
    for I := 1 to 4 do
      lst.Add('Test');
    lst.LineBreak := ' and ';
    Writeln(lst.Text);
  finally
    lst.Free;
  end;

作为一个缺点,个别条目不被引用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35055429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档