16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"RE:プログラムを起動するときの引数を生成"
この発言は #01156 KENCH さんのプログラムを起動するときの引数を生成する に対するコメントです
この発言に対し以下のコメントが寄せられています
#01158 KENCH さん RE:プログラムを起動するときの引数を生成
KENCH さん、こんにちは。
Formatを利用すれば、簡単になるかなぁと思ったのですが、そんなでもなかっ
たです(^^;
Format、オープン配列パラメータ、array of const、TVarRec、Sliceなどを
知らない人は、それぞれ Helpを見てください。
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;
var
s: string; // Formatに渡す形式文字列。
p: PChar; // sの読み書き用のポインタ。
c: Integer; // Targetに含まれる '%'の数(≧置換文字の数)。
ArgIndex: array[Char] of Integer; // 置換文字列のインデックス。
VarList: PVarList; // Formatに渡す引数の配列。
i: Integer;
begin
s := Target;
UniqueString(s); // sは書き変えるので uniqueにする。
// 置換文字列のインデックスを生成。
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
// 置換文字の探索・処理を行なうループ。
i := 0;
p := PChar(s);
p := AnsiStrScan(p, '%');
while p <> nil do begin
Inc(p);
if p^ <> '%' then begin // '%%'には何もしない。
// オープン配列パラメータとして Formatに渡す配列の要素を設定。
VarList[i].VType := vtPChar;
VarList[i].VPChar := @(ArgList[ArgIndex[p^]][2]);
// '%'の次の文字を'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)
Original document by ぜえた 氏 ID:(QZC05100)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|