D2009 TStringlist ansistring

Mar*_*ort 16 delphi string unicode delphi-2009

夏天的商业化平静已经开始,所以我选择了迁移到D2009.我粗略地确定了程序的每个子系统,如果它们应该保持ascii,或者可以是unicode,并开始移植.

它非常好,所有组件都在D2009版本中(有些像VSTView,虽然稍微不兼容)但我现在遇到了一个问题,在某些方面必须保持ansistring,我广泛使用TStringList,主要是作为基本地图.

是否已经有一些容易替换的东西,或者我应该简单地包含一个基于旧的Delphi或FPC源的减少的ansistring tstringlist?

我无法想象我是第一个碰到这个?

这些更改必须相对本地化,以便在我通过验证轨迹时代码仍可与BDS2006编译.这里有一些ifdef没有问题.当然string-> ansistring和char - > ansichar等在我的源代码中不算作修改,因为无论如何我必须这样做,而且完全向后兼容.

编辑:我已经能够解决读者/作家类中的一些问题.这使得Mason的解决方案比我原先想象的更容易.我会认为Gabr的建议是一个后备.

泛型是我买D2009的原因.可惜他们让FPC不兼容

gab*_*abr 13

JCL在JclAnsiStrings单元中实现TAnsiStrings和TAnsiStringList.


Mas*_*ler 9

如果"map"表示"哈希表",则可以将其替换为通用TDictionary.尝试声明这样的事情:

uses
  Generics.Collections;

type
  TStringMap<T: class> = TDictionary<ansiString, T>;
Run Code Online (Sandbox Code Playgroud)

然后只需用正确对象类型的TStringMaps替换StringLists.(更好的类型安全性是免费的.)此外,如果您希望字典拥有对象并在完成后释放它们,请将其更改为TObjectDictionary,并在调用构造函数时,将[doOwnsValues]传递给适当的参数.

(顺便说一下,如果您要使用TDictionary,请确保下载D2009 Update 3.原始版本在TDictionary中有一些严重的错误,使其几乎无法使用.)

编辑:如果它仍然需要在D2006下编译,那么你将不得不稍微调整一下.尝试这样的事情:

type
  TStringMap =
{$IFDEF UNICODE}
    class TDictionary<ansiString, TObject>
    (Add some basic wrapper functions here.)
    end;
{$ELSE}
    TStringList;
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)

如果你首先将它用作地图,那么包装器不应该做太多的工作.您失去了额外的类型安全性以换取向后兼容性,但是您获得了一个真正的哈希表,该表在O(1)时间内进行查找.


Nic*_*ges 9

TStringList.LoadFromFile/SaveToFile还采用TEncoding类型的可选参数,它允许您使用TStringList存储所需的任何类型的字符串.

procedure LoadFromFile(const FileName: string; Encoding: TEncoding); overload; virtual;
procedure SaveToFile(const FileName: string; Encoding: TEncoding); overload; virtual;
Run Code Online (Sandbox Code Playgroud)

另请注意,默认情况下,TStringList使用ANSI作为代码页,以便所有现有代码都可以正常工作.