代码之家  ›  专栏  ›  技术社区  ›  Marco van de Voort

D2009 t发送列表

  •  15
  • Marco van de Voort  · 技术社区  · 15 年前

    夏天的商业平静已经开始了,所以我选择了迁移到2009年。我大致确定了程序的每个子系统,它们是否应该保持ASCII,或者可以是Unicode,然后开始移植。

    一切都很顺利,所有的组件都在D2009版本中(有些,比如vstview,虽然有点不兼容),但是我现在遇到了一个问题,在一些必须保持不变的部分,我广泛地使用tstringlist,主要是作为一个基本的映射。

    是否已经有了一些很容易替换的东西,或者我应该简单地包括一个基于旧Delphi或FPC源的精简的ansistringList?

    我无法想象我是第一个碰到这个的人?

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

    编辑:我已经能够在读写类中去掉一些东西。这使得梅森的解决方案比我原先想象的要容易。我认为加布的建议是退步。

    我买D2009的原因就在于仿制药。但遗憾的是,他们让它与FPC不兼容

    5 回复  |  直到 15 年前
        1
  •  9
  •   Mason Wheeler    15 年前

    如果“map”的意思是“hash table”,则可以用通用的TDictionary替换它。尝试声明如下内容:

    uses
      Generics.Collections;
    
    type
      TStringMap<T: class> = TDictionary<ansiString, T>;
    

    然后用正确对象类型的tstringmaps替换字符串列表。(更好的类型安全性是免费提供的。)另外,如果希望字典拥有对象并在完成后释放它们,请将其更改为TobjectDictionary,当调用构造函数时,请将[downsValues]传递给相应的参数。

    (顺便说一句,如果要使用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
  •  13
  •   gabr    15 年前

    JCL 在jcranstrings单元中实现tansistrings和tansistringlist。

        3
  •  9
  •   Nick Hodges    15 年前

    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作为代码页,以便所有现有代码都能正常工作。

        4
  •  3
  •   Bruce McGee    15 年前

    这些子系统是否需要保持应答,或者只是它们如何与外部世界(RS232、文本文件等)通信?就像我处理C一样,我将Delphi2009中的字符串视为字符串,并且只在其他人需要时才担心转换。

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

        5
  •  2
  •   lkessler    15 年前

    您可以修改Delphi2007(或更早版本)的tstring和tstringlist类,并将它们重命名为tansiStrings和tansiStringList。您应该发现这是一个非常简单的修改,这将为您提供所需的类。