Delphi D2009 TStringlist ansistring

Delphi D2009 TStringlist ansistring,delphi,string,unicode,delphi-2009,Delphi,String,Unicode,Delphi 2009,夏季商业上的平静已经开始,所以我开始迁移到D2009。我粗略地确定了程序的每个子系统应该保持ascii,还是可以是unicode,然后开始移植 一切都很顺利,所有的组件都在D2009版本中(有些,比如VSTView,虽然有点不兼容),但我现在遇到了一个问题,在某些部分必须保持解析,我广泛使用TStringList,主要是作为一个基本映射 是否已经有一些容易替换的东西,或者我应该简单地包含一个基于旧的Delphi或FPC源代码的精简版tstringlist 我无法想象我是第一个遇到这种情况的人 更

夏季商业上的平静已经开始,所以我开始迁移到D2009。我粗略地确定了程序的每个子系统应该保持ascii,还是可以是unicode,然后开始移植

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

是否已经有一些容易替换的东西,或者我应该简单地包含一个基于旧的Delphi或FPC源代码的精简版tstringlist

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

更改必须相对本地化,以便在我完成验证过程中,代码仍然可以使用BDS2006进行编译。这里有一些假设,没有问题。 当然,string->ansistring和char->ansichar等在我的源代码中不算是修改,因为我必须这样做,而且它是完全向后兼容的

编辑:我已经能够在读者/作者课程中完成一些内容。这使得梅森的解决方案比我原先想象的要容易。我将把加布的建议作为一种退路牢记在心


仿制药几乎就是我买D2009的原因。遗憾的是,他们使其与FPC不兼容,尽管这些子系统是否需要保持通信,或者只是如何与外部世界通信(RS232、文本文件等)?就像我使用C#一样,我在Delphi 2009中将字符串视为字符串,只在其他人需要时才担心转换

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

如果“映射”指的是“哈希表”,则可以用通用TDictionary替换它。尝试声明如下内容:

uses
  Generics.Collections;

type
  TStringMap<T: class> = TDictionary<ansiString, T>;
type
  TStringMap =
{$IFDEF UNICODE}
    class TDictionary<ansiString, TObject>
    (Add some basic wrapper functions here.)
    end;
{$ELSE}
    TStringList;
{$ENDIF}
使用
仿制药。收藏;
类型
TStringMap=t词典;
然后用正确对象类型的tstringmap替换您的stringlist。(更好的类型安全性可以免费抛出。)此外,如果希望字典拥有对象并在完成后释放它们,请将其更改为TObjectDictionary,当您调用构造函数时,将[DoownSValue]传递给适当的参数

(顺便说一句,如果您打算使用TDictionary,请确保下载D2009更新3。最初的版本中TDictionary存在一些严重的错误,使其几乎无法使用。)

编辑:如果它仍然必须在D2006下编译,那么您必须稍微调整一下。试着这样做:

uses
  Generics.Collections;

type
  TStringMap<T: class> = TDictionary<ansiString, T>;
type
  TStringMap =
{$IFDEF UNICODE}
    class TDictionary<ansiString, TObject>
    (Add some basic wrapper functions here.)
    end;
{$ELSE}
    TStringList;
{$ENDIF}
类型
TStringMap=
{$IFDEF UNICODE}
类词典
(在此处添加一些基本包装函数。)
结束;
{$ELSE}
TStringList;
{$ENDIF}

如果您首先将包装器用作一个映射,那么它不应该占用太多的工作。为了向后兼容,您失去了额外的类型安全性,但是您得到了一个真正的哈希表,它可以在O(1)时间内进行查找。

您可以修改Delphi 2007(或更早版本)的TStrings和TStringList类,并将它们重命名为tansistring和TAnsiStringList。您应该会发现这是一个非常简单的修改,它将为您提供所需的类。

在jclanstrings单元中实现TAnsiStrings和TAnsiStringList。

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

您是否进行了大量计算,包括字符串的字节计数和字符串长度?因为这是我唯一真正需要的降级。一个是,版本向后兼容的二进制版本。另一个(我还没有开始)是定制的Sax和DOM实现。但主要原因是,我不想向客户解释如何使用记事本和excel打开unicode文本文件等,让它变得老掉牙,老掉牙。再次,我对用户的行为感到困惑。五位用户对这个问题给出了深思熟虑的答案,到目前为止,71位观众至少投了14票,但没有一位用户对这个问题投了赞成票。没有一个问题是完美的,但是我发现阅读我的Q和As-so+1很有帮助。IMHO,支持Delphi包括支持关于主题的信息性讨论。text文件、RS232就在现场。然而,持久性不仅仅是stringlist.savetostream之类的东西,而是用严格的版本向后兼容要求手工编码的。我在顶层的建议大致相同,但我更愿意保留输入/输出ansistring的子系统,并在内部大量使用它们,ansistring以避免麻烦。稍后,在迁移之后,我将所选的更新为ansistring。您应该编辑您的问题,以提及与以前的Delphi版本的兼容性。。。。显然是在破坏。顺便说一句,大约一半的文件类型是二进制的。代码必须使用D2006进行编译。。。但也许一个小包装就可以了,我有最新的更新,因为它是一个月前的电子软件交付版本。(除了我手动安装的帮助更新3)同时播放了更多,但TDictionary似乎不支持重复。我在AnsiStrings.pas或搜索源目录中都没有看到。AnsiStrings似乎不包括tansistringlist。整个src/dir不在上面吗?这正是我所希望的。对不起,对不起,对不起。我错了。这是一个修改,没有包括在德尔福2009年,但很容易做到。我会更新我的答案。(这一行有些滞后)正如前面所说的,我使用tstringlist作为基本映射,所以我没有通过这些方法进行流式处理,因为所有的行都有关联的对象[]