夏天的商业平静已经开始,所以我拿起了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)时间内进行查找的真正散列表。