16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"RE^2:プログラムを起動するときの引数を生"
この発言は #01158 KENCH さんのRE:プログラムを起動するときの引数を生成 に対するコメントです
KENCH さん、こんにちは。
> 最初考えたんですが、Formatに変な文字渡すと何が起るか分からなかったので、
> 力技にしてしまいました(^_^;(第一引数は人間が指定することが多いので)
形式文字列で置換されるのは %から d,f,s,... などの間だけなので、すべて
の %*を %sに置き換えは大丈夫です。
> して、ArgListに対象が無いと、例外発生してしまいますね。
はい(^^; ではエラーチェックを入れたやつを
function FArgGen(const Target: string; ArgList: TStrings): string;
// Formatを利用した引数マクロ展開。
// 例えば、
// Target = '-d"%1" -Y%L';
// ArgList[0] = '1C:\Program Files';
// ArgList[1] = 'L20';
// なら
// Result := Format('-d"%s" -Y%s', ['C:\Program Files', '20']);
// に変形して処理するような感じ。
type
PVarList = ^TVarList;
TVarList = array[0..0] of TVarRec;
resourcestring
ErrorFmt = '''%%%s''の置換文字列が設定されていません';
var
ArgIndex: array[Char] of Integer; // 置換文字列のインデックス。
c: Integer; // Targetに含まれる'%'の数(≧置換文字の数)。
s: string; // Formatに渡す形式文字列。
p: PChar; // sの読み書き用のポインタ。
VarList: PVarList; // Formatに渡す引数の配列。
i, j: Integer;
begin
// 置換文字列のインデックスを生成。
FillChar(ArgIndex, SizeOf(ArgIndex), $FF); // -1で初期化。
for i := 0 to ArgList.Count - 1 do
ArgIndex[ArgList[i][1]] := i;
// Targetに含まれる'%'の数(≧置換文字の数)を求める。
c := 0;
for i := 1 to Length(Target) do
if Target[i] = '%' then Inc(c);
GetMem(VarList, SizeOf(TVarRec) * c);
try
s := Target;
UniqueString(s); // sは書き変えるので uniqueにする。
i := 0;
// 置換文字の探索・処理を行なうループ。
p := PChar(s);
p := AnsiStrScan(p, '%');
while p <> nil do begin
Inc(p);
if p^ <> '%' then begin // '%%'には何もしない。
// オープン配列パラメータとして Formatに渡す配列の要素を設定。
VarList[i].VType := vtPChar;
j := ArgIndex[p^];
if j >= 0 then // 対応する置換文字列があるか。
VarList[i].VPChar := @(ArgList[j][2])
else
VarList[i].VPChar := PChar('');
// あるいは
//raise EConvertError.CreateFmt(ErrorFmt, [p^]);
// '%'の次の文字を's'に置換(ex. '%1' -> '%s')。
p^ := 's';
Inc(i);
end;
Inc(p);
p := AnsiStrScan(p, '%');
end;
// ループを出たとき、iは置換文字の数になっている。
// あとは Formatにおまかせ。
Result := Format(s, Slice(VarList^, i));
finally
FreeMem(VarList);
end;
end;
ぜえた (QZC05100)
- FDELPHI MES(16):玉石混淆みんなで作るSample蔵【見本蓄積】 00/09/14 -
Original document by ぜえた 氏 ID:(QZC05100)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|