Gecko SDK for Delphi の使い方 文字列編

| コメント(0) | トラックバック(0)

Gecko SDK では引数として const char * などの文字ポインタと、 nsAString などの文字列クラスの両方を使う。 文字ポインタは Delphi では AnsiStringWideString と互換性があるためここでは特にふれず、 クラス型の扱いについて説明する。

Windows 版の Mozilla はインターフェース型のメソッドこそ stdcall 規約を使っているが、文字列クラスには thiscall 規約を使っている。 この thiscall 規約を Delphi で扱おうとすると非常にコードが醜くなるため、ラッパーインターフェースを作成した。 Delphi のインターフェース型の利点は解放について気にする必要が無くなることである。 スコープから抜けると自動的に解放される (実際にはもっと早い段階で解放される事もある) し、明示的な解放をしたければ nil を代入すればいい。 欠点は例外が発生しても確実に解放するためにインターフェース型のローカル変数を扱う全ての関数に例外処理のためのコードが自動的に追加される事だが、これは Delphi の文字列型を使うときにも行われるし、 Gecko との橋渡しのためにインターフェースを使う事を考えると無視してもかまわないだろう。

ラッパーは IInterfacedStringIInterfacedCString を用意した。 これらはそれぞれ nsAStringnsACString のラッパーである。 前者は UTF-16 の Unicode 文字列を扱い、後者は ASCII 文字セットを含む文字列 (UTF-8 や Shift JIS など) を扱う。 これからは特に明示しない限り IInterfacedString および nsAString について記述する。 ラッパー・インターフェースは nsGeckoStrings.pas に次のように宣言されている。

IInterfacedString = interface
  function Length: Longword;
  procedure Cut(cutStart, cutLength: Longword);
  procedure Assign(Source: IInterfacedString); overload;
  procedure Assign(const Source: nsAString); overload;
  procedure Assign(Source: WideString); overload;
  procedure Append(Source: IInterfacedString); overload;
  procedure Append(const Source: nsAString); overload;
  procedure Append(Source: WideString); overload;
  procedure Insert(Source: IInterfacedString; aPosition: Longword); overload;
  procedure Insert(const Source: nsAString; aPosition: Longword); overload;
  procedure Insert(Source: WideString; aPosition: Longword); overload;
  procedure Replace(aPosition, aLength: Longword; const Source: nsAString); overload;
  procedure Replace(aPosition, aLength: Longword; Source: IInterfacedString); overload;
  function AString: nsAString;
  function ToString: WideString;
end;

Length メソッドは文字列の長さを返す。 ここでいう文字列の長さは、単純に文字列が占有するメモリの大きさとなる。 ASCII 文字のみの場合やサロゲート・ペアを使わない UTF-16 ならば文字数に等しいが、 Shift JIS などのマルチバイト文字では文字数と Length の戻り値は必ずしも一致しない。 Gecko SDK では文字列の編集での位置や長さの指定では文字コードを考えないバイト列として扱っているので注意が必要だ。

Cut メソッドを使うと文字列の一部を切り取ることができる。 文字のインデックスは Delphi とは異なり0から始まる。 そのほかのメソッドでも同様である。

Assign メソッドは他の文字列の内容をコピーする。

Append メソッドは文字列の末尾に他の文字列の内容を追加する。

Insert メソッドは文字列の指定された場所に他の文字列を追加する。

Replace メソッドは文字列の指定された部分を他の文字列に置き換える。 Cut メソッドと Insert メソッドを組み合わせた動作をする。

AString メソッドはラッパーに関連づけられた nsAString クラスのインスタンスを返す。 Gecko SDK にはこの値を引数として渡す。

ToString メソッドは Delphi の文字列型を返す。 返された文字列を編集してもインターフェースには反映されない。

ラッパーの作成には NewString 関数、比較には Compare 関数を用いる。 また、何らかの方法で nsAString 型の変数を取得した場合のために、 RelateString 関数を用意した。 この関数を使うと nsAString 型の文字列を新たにインターフェースに関連づけて管理できる。 own パラメータを設定するとインターフェースの解放時に nsAString も同時に解放する。

ラッパーの使い方の説明は以上だ。 このラッパーを使わなくても Gecko SDK で文字列を扱う事はできるのだが、バージョン1.7以降とそれ以前で文字列の扱い方が違う事と、文字列を使うたびに try/finally を記述するのが煩わしいためこのラッパーを作成したのだがいかがだろうか。

トラックバック(0)

トラックバックURL: http://nesitive.net/mt/tbping/7

コメントする

このブログ記事について

このページは、がOctober 28, 2004 11:00 PMに書いたブログ記事です。

ひとつ前のブログ記事は「Firefox 1.0 Release Candidate 1」です。

次のブログ記事は「最小の Gecko Web ブラウザ」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。