Delphi の文字列型(Delphi 初心者向け)
画像ソース RF/Cadalpe/Getty Images
どのプログラミング言語でもそうですが、 デルファイ 、変数は値を格納するために使用されるプレースホルダーです。名前とデータ型があります。変数のデータ型によって、それらの値を表すビットがコンピュータのメモリに格納される方法が決まります。
文字の配列を含む変数がある場合、それを型として宣言できます 弦 .
Delphi は、文字列演算子、関数、およびプロシージャの健全な品揃えを提供します。 String データ型を変数に割り当てる前に、Delphi の 4 つの文字列型を完全に理解する必要があります。
ショートストリング
簡単に言えば、 ショートストリング (ANSII) 文字のカウントされた配列で、文字列は最大 255 文字です。この配列の最初のバイトには、文字列の長さが格納されます。これは Delphi 1 (16 ビット Delphi) の主要な文字列型であったため、Short String を使用する唯一の理由は下位互換性のためです。
ShortString 型の変数を作成するには、次を使用します。
の s variable は、最大 256 文字を保持できる短い文字列変数で、そのメモリは静的に割り当てられた 256 バイトです。これは通常無駄が多いため (短い文字列が最大長に広がる可能性は低いため)、ShortString を使用する 2 番目の方法は、ShortString のサブタイプを使用することです。その最大長は 0 から 255 です。
|_+_|
これにより、と呼ばれる変数が作成されます。 小さい 最大長は 50 文字です。
注: 短い文字列変数に値を代入すると、型の最大長を超える文字列は切り捨てられます。 Delphi の文字列操作ルーチンに短い文字列を渡すと、長い文字列との間で変換されます。
ストリング / ロング / アンシ
Object Pascal に導入された Delphi 2 ロングストリング タイプ。長い文字列(Delphi のヘルプ AnsiString 内)は、動的に割り当てられた文字列を表し、その最大長は使用可能なメモリによってのみ制限されます。すべての 32 ビット Delphi バージョンは、デフォルトで長い文字列を使用します。可能な限り長い文字列を使用することをお勧めします。
|_+_|の s variable は、ゼロから任意の実用的な文字数まで保持できます。新しいデータを割り当てると、文字列は拡大または縮小します。
任意の文字列変数を文字の配列として使用できます。 s インデックスは 2 です。次のコード
|_+_|割り当てる T 2 番目の文字に s 変数。今、最初の数人のキャラクター s のように見える: TTeのスト... .
誤解しないでください。s[0] を使用して文字列の長さを確認することはできません。 s は ShortString ではありません。
参照カウント、コピーオンライト
メモリ割り当ては Delphi によって行われるため、ガベージ コレクションについて心配する必要はありません。長い(Ansi)文字列を扱う場合、Delphi は参照カウントを使用します。このように、文字列のコピーは、実際には短い文字列よりも長い文字列の方が高速です。
例による参照カウント:
文字列を作成するとき s1 変数に値を代入すると、Delphi は文字列に十分なメモリを割り当てます。コピーするとき s1 に s2 の場合、Delphi は文字列値をメモリにコピーせず、参照カウントを増やして値を変更するだけです。 s2 と同じメモリ位置を指す s1 .
文字列をルーチンに渡す際のコピーを最小限に抑えるために、Delphi ではコピー オン ライト手法を使用しています。の値を変更するとします。 s2 文字列変数; Delphi は最初の文字列を新しいメモリ ロケーションにコピーします。これは、変更が s1 ではなく s2 にのみ影響し、両方が同じメモリ ロケーションを指しているためです。
ワイドストリング
ワイド文字列も動的に割り当てられて管理されますが、参照カウントやコピー オン ライト セマンティクスは使用されません。ワイド文字列は、16 ビットの Unicode 文字で構成されます。
Unicode 文字セットについて
Windows で使用される ANSI 文字セットは、1 バイト文字セットです。 Unicode は、文字セットの各文字を 1 バイトではなく 2 バイトで格納します。一部の各国語では表意文字を使用しており、ANSI でサポートされている 256 文字を超える文字が必要です。 16 ビット表記では、65,536 の異なる文字を表すことができます。マルチバイト文字列のインデックス作成は信頼できません。 s[i] の i 番目のバイト (必ずしも i 番目の文字であるとは限りません) を表します s .
ワイド文字を使用する必要がある場合は、文字列変数を WideString 型に宣言し、文字変数を WideChar 型に宣言する必要があります。一度に 1 文字ずつワイド文字列を調べたい場合は、必ずマルチバイト文字をテストしてください。 Delphi は、Ansi 文字列型とワイド文字列型の間の自動型変換をサポートしていません。
|_+_|ヌル終了
null またはゼロで終了する文字列は、ゼロから始まる整数でインデックス付けされた文字の配列です。配列には長さインジケータがないため、Delphi は ASCII 0(NULL; #0)文字を使用して文字列の境界をマークします。
これは、null で終わる文字列と、文字列の末尾が #0 でマークされている Char 型の配列 [0..NumberOfChars] との間に本質的な違いがないことを意味します。
Delphi では、Windows API 関数を呼び出すときに null で終わる文字列を使用します。 Object Pascal を使用すると、PChar 型を使用して null で終わる文字列を処理するときに、0 から始まる配列へのポインターをいじるのを避けることができます。 PChar は、null で終わる文字列またはそれを表す配列へのポインターであると考えてください。ポインターの詳細については、次を確認してください。 Delphi のポインタ .
たとえば、 GetDriveType API 関数は、ディスク ドライブがリムーバブル、固定、CD-ROM、RAM ディスク、またはネットワーク ドライブのいずれであるかを判別します。次の手順では、ユーザーのコンピューター上のすべてのドライブとその種類を一覧表示します。フォームに 1 つの Button コンポーネントと 1 つの Memo コンポーネントを配置し、Button の OnClick ハンドラを割り当てます。
|_+_|Delphi の文字列のミキシング
4 種類の文字列すべてを自由に組み合わせることができます。Delphi は、私たちがやろうとしていることを理解するのに最適です。代入 s:=p (s は文字列変数、p は PChar 式) は、ヌル終了文字列を長い文字列にコピーします。
文字の種類
4 つの文字列データ型に加えて、Delphi には 3 つの文字型があります。 シャア 、 AnsiChar 、および WideChar . 'T' などの長さ 1 の文字列定数は、文字値を表すことができます。一般的な文字タイプは、AnsiChar と同等の Char です。 WideChar 値は、Unicode 文字セットに従って並べ替えられた 16 ビット文字です。最初の 256 の Unicode 文字は ANSI 文字に対応します。