我試圖將一些代碼從D2007移植到DXE2。 這個簡化的代碼在D2007中編譯得很好。在DXE2中,它顯示此錯誤:如何使用包含Unicode?
[DCC Warning] Unit1.pas(10): W1050 WideChar reduced to byte char in set expressions. Consider using 'CharInSet' function in 'SysUtils' unit.
[DCC Error] Unit1.pas(37): E2010 Incompatible types: 'AnsiChar' and 'Char'
這是一個unicode問題。 有人可以告訴我爲什麼會發生這種情況,我應該如何糾正它?
問候
代碼:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TSetOfChar = Set of Char; // Line 10
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
FCharacterSet: TSetOfChar;
public
property CharacterSet: TSetOfChar read FCharacterSet write FCharacterSet;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
CharacterSet: TSetOfChar;
j: Integer;
s: String;
begin
CharacterSet := [];
s := 'I''m just testing åäö';
for j := 1 to Length(s) do
Include(CharacterSet, s[j]); // <- Line 37
end;
end.
編輯:請注意,我用Delphi 2007中沒有仿製藥。我想要的代碼在D2007中仍然有效,因爲有很多代碼需要移植到Unicode。這是一個緩慢的過程。 當一切都移植,驗證它適用於XE2,那麼我們可以使用XE2的東西,如泛型。同時我們照常維護D2007,並且我們希望避免在版本控制系統中建立XE2分支。
我認爲一個字典類型可能會提供一個類似於Delphi集合類型的「if x in set」操作的運行時速度,請考慮使用字典。包含將成爲「如果不是字典的一部分,然後添加此密鑰」操作的字典與Widechar鍵。 –