夏天的商业平静开始了,所以我开始迁移到D2009。我大致确定了程序的每个子系统是否应该保留ascii或可以是unicode,然后开始移植。

一切正常,所有组件都在D2009版本中(某些组件,例如VSTView,虽然有些不兼容),但是我现在遇到了一个问题,在某些方面必须保持ansistring,我广泛使用TStringList,主要用作基本映射。

是否已经有一些容易替换的东西,或者我是否应该仅基于旧的Delphi或FPC来源添加一个缩减的ansistring tstringlist?

我无法想象我是第一个遇到这种情况的人吗?

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

编辑:我已经能够解决读写器类中的一些问题。这使梅森的解决方案比我最初想象的要容易。我会将加布里的建议牢记为后备。

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

最佳答案

如果用“映射”表示“哈希表”,则可以将其替换为通用TDictionary。尝试声明如下内容:

uses
  Generics.Collections;

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


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

(顺便说一句,如果您要使用TDictionary,请确保下载D2009 Update3。原始发行版在TDictionary中存在一些严重的错误,使其几乎无法使用。)

编辑:如果它仍然必须在D2006下进行编译,那么您将不得不稍作调整。尝试这样的事情:

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


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

关于delphi - D2009 TStringlist ansistring,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1119920/

10-09 01:56