Gecko SDK では引数として const char *
などの文字ポインタと、 nsAString
などの文字列クラスの両方を使う。
文字ポインタは Delphi では AnsiString
や WideString
と互換性があるためここでは特にふれず、 クラス型の扱いについて説明する。
Windows 版の Mozilla はインターフェース型のメソッドこそ stdcall
規約を使っているが、文字列クラスには thiscall
規約を使っている。
この thiscall
規約を Delphi で扱おうとすると非常にコードが醜くなるため、ラッパーインターフェースを作成した。
Delphi のインターフェース型の利点は解放について気にする必要が無くなることである。
スコープから抜けると自動的に解放される (実際にはもっと早い段階で解放される事もある) し、明示的な解放をしたければ nil
を代入すればいい。
欠点は例外が発生しても確実に解放するためにインターフェース型のローカル変数を扱う全ての関数に例外処理のためのコードが自動的に追加される事だが、これは Delphi の文字列型を使うときにも行われるし、 Gecko との橋渡しのためにインターフェースを使う事を考えると無視してもかまわないだろう。
ラッパーは IInterfacedString
と IInterfacedCString
を用意した。
これらはそれぞれ nsAString
と nsACString
のラッパーである。
前者は 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
を記述するのが煩わしいためこのラッパーを作成したのだがいかがだろうか。
コメントする