delphi – D2009 TStringlist ansistring

前端之家收集整理的这篇文章主要介绍了delphi – D2009 TStringlist ansistring前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
夏天的商业平静已经开始,所以我拿起了D2009的迁移。我大致确定了程序的每个子系统,如果它们应该保持ascii,或者可以是unicode,并开始移植。

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

是否有一些容易替换的东西,或者应该简单地包含一个基于旧的Delphi或FPC源的剪切式的tstringlist?

我不能想象我是第一个碰到这个?

这些更改必须是相对本地化的,因此当我通过验证轨迹时,代码仍然可以用BDS2006编译。这里有几个ifdefs没有问题。
当然,string> ansistring和char – > ansichar等不会被视为我的源代码中的修改,因为我必须这样做,它是完全向后兼容的。

编辑:我已经能够解决读者/作家类中的一些问题。这使得Mason的解决方案比我原来想象的容易一些。我将把Gabr的建议记在头脑里,作为一个后援。

泛型几乎是我买D2009的原因。可惜他们使FPC不兼容

解决方法

如果用“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)时间内进行查找的真正散列表。

猜你在找的Delphi相关文章