加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – D2009 TStringlist ansistring

发布时间:2020-12-15 10:13:36 所属栏目:大数据 来源:网络整理
导读:夏天的商业平静已经开始,所以我拿起了D2009的迁移。我大致确定了程序的每个子系统,如果它们应该保持ascii,或者可以是unicode,并开始移植。 它是非常好的,所有的组件都在D2009版本(有些,像VSTView,稍微不兼容,但是我现在遇到了一个问题,在某些部分必
夏天的商业平静已经开始,所以我拿起了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)时间内进行查找的真正散列表。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读