覆盖 TStringList.Delimiter
Override TStringList.Delimiter
TStringList.Delimiter 是一个 TChar。这使得 Delimitertext 成为可能
Test,Test,Test,Test
但我想用 ' and ' 作为结果的分隔符
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 中是私有的。所以我不能覆盖它们。想知道有没有办法实现我想要的?
编辑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;
缺点是没有引用个别条目。
TStringList.Delimiter 是一个 TChar。这使得 Delimitertext 成为可能
Test,Test,Test,Test
但我想用 ' and ' 作为结果的分隔符
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 中是私有的。所以我不能覆盖它们。想知道有没有办法实现我想要的?
编辑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;
缺点是没有引用个别条目。