AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
DelphiXE3 [FMX] 型、文字 2014/06/18
 
前回は、マウスの処理について、ざっと記述しました。
今回は、少し型について確認しておきます。昨今、64bit-OS、64bitアプリケーションが普及しはじめてきて、Delphi でも 64bitアプリケーションが作成出来るようになっています。実行プログラムの効果の方はさておき、64bitアプリといえば当然、64bitの変数が扱える、という所が気になる所です。
 
そして、FireMonkey(FMX)での文字型は、基本、Unicode であるって所です。これまでは、SHIFT-JISコードの AnsiString が主体、というケースも多かったですが、まぁ Delphi2010でも既に、Unicode対応となっているのですが、FireMonkey でのモバイルアプリケーション開発環境は AnsiString型の変数が使えない?という話も聞きます。
 
以下、ヘルプより。
単純型−順序型−整数型
・プラットフォーム依存
値の範囲形式エイリアス
NativeInt -2147483648
 〜2147483647
-2^63
 〜2^63-1
符号付き32ビット(32ビットプラットフォーム上)または
符号付き64ビット(64 ビットプラットフォーム上)
Integer
Int64
NativeUInt 0〜4294967295
0〜2^64-1
符号なし32ビット(32 ビットプラットフォーム上)または
符号なし64ビット(64 ビット プラットフォーム上)
Cardinal
UInt64
NativeInt のサイズは変わります
64ビットWindows プラットフォームでは、NativeInt のサイズは 8 バイトになりました。
32ビットWindows プラットフォームでは、NativeInt のサイズは 4 バイトのままです。
・プラットフォーム非依存
値の範囲形式エイリアス
ShortInt-128〜127符号付き8ビットInt8
SmallInt-32768〜32767符号付き16ビットInt16
LongInt -2147483648
〜2147483647
符号付き32ビットInt32
Integer -2147483648
 〜2147483647
符号付き32ビットInt32
Int64-2^63〜2^63-1符号付き64ビット 
Byte0〜255符号なし8ビットUInt8
Word0〜65535符号なし16ビットUInt16
LongWord0〜4294967295符号なし32ビットUInt32
Cardinal0〜4294967295符号なし32ビットUInt32
UInt640〜2^64-1符号なし64ビット 
 
順序型の値と型識別子を処理する定義済み関数
関数パラメータ戻り値 説明
Ord順序型の式式の値の順序値Int64 の引数をとらない
Pred順序型の式式の値の前の値
Succ順序型の式式の値の次の値
High順序型の型識別子または順序型の変数型の最大の値短い文字列型と配列型も処理できる
Low順序型の型識別子または順序型の変数型の最小の値短い文字列型と配列型も処理できる
単純型−順序型−文字型
文字型には、Char、AnsiChar、WideChar、UCS2Char、UCS4Char があります。
Char現在の実装では、デフォルトの文字列型が UnicodeStringであるため、Charは WideCharと同等です。Charの実装は今後のリリースで変更されることがあるため、サイズの異なる文字を処理しなければならない可能性のあるプログラムを作成するときは、定数をハードコードするのではなく、標準関数 SizeOf を使用した方がよいでしょう。
AnsiCharロケール文字セット(場合により、マルチバイト)に従って順序付けされたバイトサイズ(8 ビット)の文字
WideChar複数バイトを使用して、あらゆる文字を表します。現在の実装では、WideCharは、Unicode文字セットに従って順序付けされたワードサイズ(16 ビット)の文字です(今後の実装では、サイズがもっと大きくなる可能性があります)。Unicode の先頭から256文字がANSI文字に対応します。
UCS2CharWideChar のエイリアスです。
UCS4Char4バイトの Unicode文字を扱う場合に使用されます。
単純型−順序型−論理型
4つの定義済みの論理型として、Boolean、ByteBool、WordBool、および LongBool があります。Boolean が通常使用される型です。他の 3 つの型は、他の言語やオペレーティング システムのライブラリとの互換性を提供するために用意されています。
変数のサイズは、Boolean 変数と ByteBool 変数が 1バイト、WordBool 変数が 2バイト(1ワード)、LongBool 変数が 4バイト(2ワード)です。
単純型−順序型−列挙型
列挙型では、値を表す識別子を列挙して、順序付けされた値の集合を定義します。値そのものが意味を持つものではありません。列挙型を宣言するには、次の構文を使用します。
type typeName = (val1, ...,valn)
type Suit = (Club, Diamond, Heart, Spade);
これは、Suit という列挙型を定義しています。有効な値は、Club、Diamond、Heart<code>、および <code>Spade です。Ord(Club) は 0 を Ord(Diamond) は 1 を返します。
 
type Size = (Small = 5, Medium = 10, Large = Small + Medium);
これは、Size という型を定義します。有効な値は、Small、Medium、および Large です。Ord(Small) は 5、Ord(Medium) は 10、Ord(Large) は 15 を返します。
単純型−順序型−部分範囲型
部分範囲型は、別の順序型の値の部分集合を表します。部分集合の基となる順序型は基底型と呼ばれます。Low と High が同じ順序型の定数式であり、Low が High より小さい場合、Low..High という形式の構文は Low から High までのすべての値を含む部分範囲型を表します。たとえば、次の列挙型を宣言したとします。
type
TColors = (Red, Blue, Green, Yellow, Orange, Purple, White, Black);
この場合は、次のような部分範囲型を定義できます。
type
TMyColors = Green..White;
ここで、TMyColors の値は、Green、Yellow、Orange、Purple、および White です。
数値定数と文字(長さが 1 の文字列定数)を使って部分範囲型を定義することもできます。
type
SomeNumbers = -128..127;
Caps = 'A'..'Z';
単純型−実数型
正の値の範囲(概数) 有効桁数 サイズ
(バイト数)
Real482.9e-39 .. 1.7e+3811-126
Single1.5e-45 .. 3.4e+387-84
Double 5.0e-324 .. 1.7e+308 15-168
Real5.0e-324 .. 1.7e+30815-168
Extended 32ビットプラットフォーム
3.4e-4932 .. 1.1e+4932
10-2010
64ビットプラットフォーム
5.0e-324 .. 1.7e+308
15-168
Comp-2^63+1 .. 2^63-110-208
Currency -922337203685477.5808
.. 922337203685477.5807
10-208
文字列型
最大長 必要な
メモリ
用途
ShortString 255
文字
2〜256
バイト
下位互換性
AnsiString 〜2^31
文字
4バイト
〜2GB
8 ビット(ANSI)文字、DBCS ANSI、MBCS ANSI、Unicode 文字など
UnicodeString

メモ:RAD Studioでは、string は UnicodeString 型のエイリアスです。
〜2^30
文字
4バイト
〜2GB
Unicode 文字、8 ビット(ANSI)文字、マルチユーザー サーバーおよびマルチ言語アプリケーション
 
UnicodeString は、デフォルトの文字列型です。
WideString 〜2^30
文字
4バイト
〜2GB
Unicode文字、マルチユーザーサーバーおよびマルチ言語アプリケーション。COMアプリケーションを除いて、通常 UnicodeStringが WideStringに優先します。
この他にも型はありますがここでは除外します。
 
 
で、問題の文字列型についてですが、エンバカデロ社のオンラインヘルプ・DocWikiでは、
メモ: このトピックで説明されている文字列型はすべて、Delphi デスクトップ コンパイラ(DCC32、DCC64、DCCOSX)でサポートされています。
一方、Delphi モバイル コンパイラ(DCCIOS32 および DCCIOSARM)では、デフォルトの文字列型(UnicodeString)のみサポートしています。
また、Delphi モバイル コンパイラの場合、文字列は不変でインデックスが 0 から始まります。文字列を操作するには、TStringHelper の関数を使用します。詳細については、「デスクトップ アプリケーションからモバイル アプリケーションへの Delphi コードの移行」を参照してください。
とあります。
その「デスクトップ アプリケーションからモバイル アプリケーションへの Delphi コードの移行」のページでは、
サポートされていない以下の型のいずれかを使用しているコードは削除するか、代わりの型を使用するように書き換えなければなりません。
 WideString、AnsiString、ShortString、AnsiChar、
 PAnsiChar、PWideChar、Openstring
デスクトップアプリケーション
で使用する型
(1から始まるインデックス方式)
モバイルアプリケーション
で使用する型
(0から始まるインデックス方式)
System.WideStringSystem.String
System.AnsiString、
System.ShortString、
System.RawByteString、
System.UTF8String
使用をやめます。
"バイト配列" を使用することを検討します。
System.AnsiCharSystem.Char、System.Byte、System.UInt8
System.PAnsiChar、
System.PWideChar
System.SysUtils.TStringBuilder、System.String、System.MarshaledString
System.Openstring"バイト配列" を使用することを検討します。
(以下略)
等と記載されています。
 
新規にアプリケーション開発を行う場合には、最初から、Unicode利用を念頭において、通常通りに String型で作成していけば良いと思います。
 
また、モバイルアプリケーション開発の場合は、[0から始まるインデックス方式]であるため、Length関数、Pos関数、Copy関数などが使えないとの事。代わりに、Low()・High()、TStringHelper.IndexOf、TStringHelper.Substringなどを利用せよとの事です。
 
但し、DelphiXE3 のヘルプでは、
ヒント: XE3(およびそれ以前のリリース)の Delphi および C++Builder では、文字列のインデックスはデフォルトで 1 から始まります。
とあるため、DelphiXE3 では、Low(s)は、0 ではなく、1 となりますから、XE3、XE4〜 での共通プログラム化においては、Low・Highは、ちょっと使えないなぁという感じはします。
 
であればいっそ、

procedure TForm1.Button1Click(Sender: TObject);
var
   i : integer ;
   s,t : String ;
begin
   s := Edit1.Text ;
   t := '';
   for i := 0 to s.Length-1 do begin
      if (i > 0) then
         t := t + ',';
      t := t + s.Substring(i,1);
   end;
   Label1.Text := t ;
end;
という風にすれば

のように、DelphiXE3 でも、おそらくは XE4移行でも、同じプログラムコードで同じように実行出来るのではないかと思われます。
 
 
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Dehi入門編
>Delphi2010
>DelphiXE3
▲2014/06/11
 2014/06/18
▼2014/06/19
 
シェアウェア
Script!World
データベース
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015. By AFsoft All Rights Reserved.