|
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ビット | |
Byte | 0〜255 | 符号なし8ビット | UInt8 |
Word | 0〜65535 | 符号なし16ビット | UInt16 |
LongWord | 0〜4294967295 | 符号なし32ビット | UInt32 |
Cardinal | 0〜4294967295 | 符号なし32ビット | UInt32 |
UInt64 | 0〜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文字に対応します。 |
UCS2Char | WideChar のエイリアスです。 |
UCS4Char | 4バイトの 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'; |
|
単純型−実数型 |
型 | 正の値の範囲(概数) | 有効桁数 |
サイズ
(バイト数) |
Real48 | 2.9e-39 .. 1.7e+38 | 11-12 | 6 |
Single | 1.5e-45 .. 3.4e+38 | 7-8 | 4 |
Double | 5.0e-324 .. 1.7e+308 | 15-16 | 8 |
Real | 5.0e-324 .. 1.7e+308 | 15-16 | 8 |
Extended |
32ビットプラットフォーム
3.4e-4932 .. 1.1e+4932 | 10-20 | 10 |
64ビットプラットフォーム
5.0e-324 .. 1.7e+308 | 15-16 | 8 |
Comp | -2^63+1 .. 2^63-1 | 10-20 | 8 |
Currency |
-922337203685477.5808
.. 922337203685477.5807 | 10-20 | 8 |
|
文字列型 |
型 | 最大長 |
必要な
メモリ | 用途 |
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.WideString | System.String |
System.AnsiString、
System.ShortString、
System.RawByteString、
System.UTF8String |
使用をやめます。
"バイト配列" を使用することを検討します。 |
System.AnsiChar | System.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
データベース
|