[delphi-users:4211] 「E2010 'AnsiChar' と 'Char' には互換性がありません」のエラー

806 views
Skip to first unread message

TAKA

unread,
Jul 17, 2015, 2:41:54 AM7/17/15
to delphi...@freeml.com
こんにちは、件名のエラーがでて修正方法がわからないのですが
どなたか対処方法をご存知の方がいらっしゃいましたらお教えください。

2007で作成したアプリケーションをXE8に移植する際に
Char型の集合体に文字を追加しようとしている
Includeの部分で次のようなエラーになってしまいます。
「E2010 'AnsiChar' と 'Char' には互換性がありません」
よろしくお願いいたします。


TChars = set of Char;
Private
FValidCh: TChars;
  .
.
Procedure Func(Value:String);
var
i:Integer;
begin
for I := 1 to Length(Value) do
begin
Include(FValidCh,Value[i]);
end;
end;




MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
         悩んでいいる方、将来が不安な方
  ☆ ☆  バイオテックならどなたでも気軽に体験できます  ☆ ☆
     ★☆ 満足度97.2%!発毛育毛専門サロン"バイオテック" ☆★ 
……・・………・・・無料体験のお申込はこちらから・・……・・・………
http://ad.freeml.com/cgi-bin/sa.cgi?id=ncebj
------------------------------------------------------[freeml byGMO]--

Fukushi

unread,
Jul 17, 2015, 3:36:15 AM7/17/15
to delphi...@freeml.com
TAKAさん、こんにちは。福士と申します。

> 2007で作成したアプリケーションをXE8に移植する際に
> Char型の集合体に文字を追加しようとしている
> Includeの部分で次のようなエラーになってしまいます。
> 「E2010 'AnsiChar' と 'Char' には互換性がありません」
> よろしくお願いいたします。

Delphi 2009のUnicode対応で、Char型はAnsiChar型(0..255)から
WideChar型(0..65535)にマッピングが変更されました。しかし集合型は
最大256要素までしか扱えないので、

| type
| TChars = set of Char;



| W1050 set 式で WideChar がバイト char に縮小されました。
| 'SysUtils' ユニットの 'CharInSet' 関数で使用することを
| 検討してください。

という警告メッセージとともに

| type
| TChars = set of AnsiChar;

に置き換えられています(ヒント、警告のメッセージを無視するのは
やめましょう)。

ですので、

| Include(FValidCh,Value[i]);

の第1パラメータはset of AnsiChar、第2パラメータはWideCharで
型が適合せずにエラーになっている、ということです。

修正方法はこのコードが何を意味しているかによって変わってきます。
もし対象になる(Valueに含まれる)文字がAnsiChar範囲だけなのであれば、

| Include(FValidCh,AnsiChar(Value[i]));

にするとか、そもそも

| Procedure Func(Value:AnsiString);

でよいと思います。一方でAnsiChar範囲に収まらない文字を含む文字列を
処理させるのであれば、65536ビット分のビット配列を用意して、文字に
よってそれぞれのビットをセットしていくようなコードを作る必要が
あります。

参考にしてください。

---
東洋テクニカルシステム株式会社 システム開発部 福士 光
Hikaru Fukushi (Toyo Technical System Inc.)
mailto:fuk...@tts-inc.co.jp


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
【無料で本格コーヒーマシンが使えます】
ご自宅用にもマシンが1台もらえます。
「ネスカフェアンバサダー」
少人数の職場でも大歓迎です。詳しくはWEBサイトをチェック!
http://ad.freeml.com/cgi-bin/sa.cgi?id=nceRa
------------------------------------------------------[freeml byGMO]--

DEKO

unread,
Jul 17, 2015, 3:46:10 AM7/17/15
to delphi...@freeml.com
こんにちは。

set of (集合型) の要素数は 256 までです。
なので、Unicode 版 Delphi において set of Char は使えません。
http://docwiki.embarcadero.com/RADStudio/ja/%E6%A7%8B%E9%80%A0%E5%8C%96%E5%9E%8B

含める文字列が ASCII の範囲で収まるのであれば、
set of AnsiChar;
とする必要があります。

TChars = set of AnsiChar;
Private
FValidCh: TChars;
  .
.

procedure TForm1.Func(Value: AnsiString);
var
i: Integer;
begin
for i := Low(Value) to High(Value) do
Include(FValidCh, Value[i]);
end;

これならばエラーにはならないでしょう。

# 直前に福士さんの投稿がありましたが、
# せっかく書いたので投稿しました (^^;A

--
by DEKO
-----------------------------
http://ht-deko.com/
de...@ht-deko.minim.ne.jp
-----------------------------


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
月額10,778円で全身脱毛が48ヶ所もできる
無料カウンセリングはこちら
http://ad.freeml.com/cgi-bin/sa.cgi?id=nceZd
------------------------------------------------------[freeml byGMO]--

TAKA

unread,
Jul 17, 2015, 4:24:41 AM7/17/15
to delphi...@freeml.com
福士さん、DEKOさん どうもありがとうございます。
データの範囲はASCIIの範囲で収まりますので、
教えていただいた形で修正してみます。

ありがとうございました。


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
あの家具欲しいんだけどなかなかタイミングが。。。
今がそのチャンスです☆家具・インテリア大セール開催
100%価格保証だから安心してお買い求め頂けます!!
人気の北欧家具・おしゃれなインテリアなど最大70%OFF
http://ad.freeml.com/cgi-bin/sa.cgi?id=ncfAq
------------------------------------------------------[freeml byGMO]--

Reply all
Reply to author
Forward
0 new messages