to:beta
你的心得(ExecuteRoutine)让我见识不少,很是佩服阿,希望今后多看到你的心得出现:)
to:Adnil
不知道你的程序应用于什么环境,要求这么严格啊?
最好能够测试一下Stringlist是不是真的很慢,我觉得要求不严格的情形下creation-zy的
方法倒是可行的?
另外如果Objects要存储String类型,可能比较麻烦,我是这么使用的,
不知道大家有没有更好的方法?
//保存引用计数,返回指向该字符串的指针
function RefString(const S: string): Pointer;
var
Local: string;
begin
Local := S
// 增加引用计数
Result := Pointer(Local)
// 保存指针
Pointer(Local) := nil
// 悬空指针,离开生存期时Delphi不再减少引用计数
end;
//释放由RefString引用的字符串(其实是减少引用计数,当计数为0,Delphi会释放它)
procedure ReleaseString(P: Pointer);
var
Local: string;
begin
Pointer(Local) := P;
// 离开生存期时Delphi会减少Local指向的String的引用计数
end;
var
P: Pointer;
begin
...
P := RefString('测试字符,保存在Objects[]里');
Strings.AddObject('测试字符', P);
...
end;
//调出保存在Strings.Objects[]里面的字符串
StrPas(PChar(Strings.Objects))
//清空字符串列表以及的Objects[]引用的字符串
procedure Clears(var ss:TStrings);
var
i: Integer;
begin
Assert(Assigned(ss));
for i := ss.Count - 1 downto 0 do
begin
ReleaseString(ss.Objects);
ss.Delete(i);
end;
end;