3

3のサイズの文字列を簡単に定義できます(古いDelphiコードで)

st:string[3];

ここで、コードをansiに移動します

st:ansiString[3];

動作しません!

および拡張されたOEMタイプの場合

st:oemString[3]; 

同じ問題、どこで

type
  OemString = Type AnsiString(CP_OEMCP);

固定長のANSI文字列と新しいOEMタイプをどのように宣言できますか?

更新:固定長の文字列が作成されることはわかっています。これは、間違いから保護するためのソフトウェアの設計の一部であり、プログラムに不可欠です。

4

5 に答える 5

5

AnsiStringのサイズを定義する必要はありません。

表記

string[3] 

Pascal(およびDelphi 1)で使用される短い文字列用であり、ほとんどの場合、レガシー目的で保持されます。

短い文字列の長さは1〜255バイトです。最初の(「非表示」)バイトには長さが含まれます。

AnsiStringは、文字バッファへのポインタです(0で終了)。参照カウントのような内部魔法があります。また、コンパイラがすべての厄介な詳細を処理するため、既存の文字列に安全に文字を追加できます。

UnicodeStringsはAnsiStringsに似ていますが、ユニコード文字(この場合は2バイト)を使用します。現在のデフォルトの文字列(Delphi 2009)はUnicodeStringにマップされます。

タイプAnsiStringには、コードページ(127より上の文字を定義するために使用)を追加するための構造があります。したがって、CP_OEMCPは次のよ​​うになります。

OemString = Type AnsiString(CP_OEMCP);
于 2011-05-30T13:18:13.373 に答える
4

「ShortStrings」は「Ansi」文字列です。これは、Delphi以前のコードの下位互換性のためにのみ使用できるためです。

       st: string[3];

Delphi 2009以降、常に現在のAnsiコードページ/文字セットを使用して固定長の「短い文字列」を作成します。

しかし、そのような短い文字列は、いわゆると同じではありませんAnsiString。短い文字列のコードページはありません。短い文字列の参照カウントがないため。

コードページAnsiStringは、固定長ではなく可変長であり、参照カウントされる型に対してのみ存在するため、で定義される短い文字列よりも完全に多様な型ですstring[...]

設計上、宣言を単に混合Short Stringして 型指定することはできません。AnsiStringどちらも「文字列」と呼ばれますが、さまざまなタイプがあります。

これがのマッピングですShort String

  st[0] = length(st)
  st[1] = 1st char (if any) in st
  st[2] = 2nd char (if any) in st
  st[3] = 3rd (if any) in st

AnsiStringまたはUnicodeStringタイプのメモリマッピングは次のとおりです。

  st = nil   if st=''
  st = PAnsiChar if st<>''

PSt: PAnsiCharレイアウトは次のとおりです。

  PWord(PSt-12)^ = code page
  PWord(PSt-10)^ = reference count
  PInteger(PSt-8)^  = reference count
  PInteger(PSt-4)^  = length(st) in AnsiChar or UnicodeChar count
  PAnsiChar(PSt) / PWideChar(PSt) = Ansi or Unicode text stored in st, finished by a #0 char (AnsiChar or UnicodeChar)

したがって、AnsiStringUnicodeStringタイプの間にいくつかの類似点がある場合、short stringタイプは完全に多様であり、希望どおりに混合することはできません。

于 2011-05-30T13:44:35.210 に答える
2

これは、DelphiのUnicodeバージョンのString[3]がデフォルトで3WideCharsである場合にのみ役立ちます。それは私を驚かせるでしょうが、そうである場合は、以下を使用してください:

st: array[1..3] of AnsiChar;
于 2011-05-30T13:20:32.657 に答える
1

ansistringとunicodestringのサイズは動的に大きくなります。コンパイラとランタイムコードは、これらすべてを処理します。
参照:http ://delphi.about.com/od/beginners/l/aa071800a.htm

より詳細な説明については、http://www.codexterity.com/delphistrings.htmを参照してください。

長さは1文字から2GBまでの任意の長さにすることができます。

于 2011-05-30T13:41:05.627 に答える
1

ただし、古いShortStringタイプ、Delphiの新しい文字列タイプは動的です。それらは必要に応じて拡大および縮小します。SetLength()を呼び出して、文字列を特定の長さに事前に割り当てることができます。これは、最終的な長さがわかっている文字列にデータを1つずつ追加する必要がある場合に、メモリの再割り当てを回避するのに役立ちます。データが追加または削除されると縮小します。静的文字列が必要な場合は、サイズが動的に変更されないcharのarray[0..n]を使用できます。

于 2011-05-30T14:48:18.370 に答える