D2009 TStringlist ansistring

时间:2009-07-13 14:50:40

标签: 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不兼容,但

5 个答案:

答案 0 :(得分:13)

JCL在JclAnsiStrings单元中实现了TAnsiStrings和TAnsiStringList。

答案 1 :(得分:9)

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

uses
  Generics.Collections;

type
  TStringMap<T: class> = TDictionary<ansiString, T>;

然后只需用正确对象类型的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}

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

答案 2 :(得分:9)

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

procedure LoadFromFile(const FileName: string; Encoding: TEncoding); overload; virtual;
procedure SaveToFile(const FileName: string; Encoding: TEncoding); overload; virtual;

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

答案 3 :(得分:3)

这些子系统是否需要保持ansistring,或者只是它们与外部世界(RS232,文本文件等)的通信方式?就像我使用C#一样,我将Delphi 2009中的字符串视为字符串,只有在其他人需要时才会担心转换。

这也有助于避免代码中的无意隐式转换以及调用Windows API方法时提高性能。

答案 4 :(得分:2)

您可以修改Delphi 2007(或更早版本)的TStrings和TStringList类,并将它们重命名为TAnsiStrings和TAnsiStringList。您应该发现这是一个非常简单的修改,它将为您提供所需的课程。