|
15番会議室「FAQ編纂委員会」に寄せられた「よくある質問の答え」
[Q]
二重起動防止して、実行ファイルのショートカットアイコンなどに、たくさ
んのファイルをまとめてドロップして再起動する場合、それらのファイル名
を送受信文字列に出し入れする必要がありますが、例はありませんか?
[A]
>RE:[FAQ]二重起動防止でパラメータ送信(2A)
の例は、pcAtom1: PChar を、
第1文字列:
ParamStr(1)|Filename2|Filename3|...|Fil
|ここまで255文字
第2文字列:
enamex|Filenamey|Filenamez
というように、2つの文字列に指定しました。ファイルドロップではパス名は
同じですから、Filename2以降は8.3形式ファイル名だけにしています。
[例]
{=========================================================}
procedure ParamsToData(
aParamCount: integer; {=ParamCount}
var pcData: PChar); {収納変数}
var
i: integer;
begin
StrCopy(pcData,'');
for i:=1 to aParamCount do begin
if i=1 then
StrCat(pcData,PChar(ParamStr(i)))
else begin
StrCat(pcData,'|');
StrCat(pcData,PChar(ExtractFilename(ParamStr(i))));
end;
end;
end; {ParamsToData}
{=========================================================}
{受信文字列を'|'で分解して、ロングネームでStringList1に放り込み}
procedure TAtoms2F.DropedStrs(pcDat: PChar);
var
i: integer;
sLeft,
sRest: string;
begin
sRest:=StrPas(pcDat);
i:=1;
while (sRest<>'') do begin
sLeft:=GetFromString(sRest,'|');
if i=1 then begin
sLeft:=GetLongFullPathName(sLeft);
CurDir:=ExtractFilePath(sLeft);
end else
sLeft:=ExtractFilename(
GetLongFullPathName(CurDir+sLeft));
StringList1.Add(sLeft);
inc(i);
end;
end; {TAtoms2F.DropedStrs}
{=========================================================}
{StringList1のファイルを、重複しないようにListBox1にアペンド}
procedure TAtoms2F.DragedToListBox1;
var
bOK: boolean;
i,j,iCount,mCount
: integer;
sFile: array[0..MAX_PATH-1] of char;
begin
mCount:=ListBox1.Items.Count;
if (mCount>0) and
(AnsiCompareText(CurDir,fCurDir)<>0) then begin
if MessageDlg('ディレクトリーが違います。'#13+
'元のファイルと入れ替えますか?',
mtWarning,mbOkCancel,0)=mrCancel then
exit
else begin
ListBox1.Clear;
fCurDir:=CurDir;
end;
end;
iCount:=StringList1.Count;
mCount:=ListBox1.Items.Count;
for i:=0 to iCount-1 do begin
StrPLCopy(sFile,StringList1.Strings[i],MAX_PATH-1);
if i=0 then
StrPLCopy(sFile,ExtractFileName(StrPas(sFile)),MAX_PATH-1);
bOK:=true;
if mCount>0 then begin
for j:=0 to mCount-1 do begin
if AnsiCompareText(StrPas(sFile),
ListBox1.Items[j])=0 then begin
bOK:=false;
break;
end;
end;
end;
if bOK then
ListBox1.Items.Add(StrPas(sFile));
end;
end; {TAtoms2F.DragedToListBox1}
【補足】
(1) このままだと未定義になる変数は、外部で適当に定義して下さい。
const
AMAX_BUF=255;
sUniqueName='Atoms2Unique';
{ユニークな名前。送受信共通}
var
fCurDir, {初期化必要。
ListBox1に入れるファイルのディレクトリーです}
CurDir: TFilename;
StringList1: TStringList;
pcAtom1,pcAtom2: PChar;
StringList1、pcAtom1、pcAtom2は、FormCreateで確保、FormDestroyで破
棄。
pcAtom1:=StrAlloc(AMAX_BUF*2+1);
など。pcAtom2は領域確保不要。
(2) (*4)は、文字列左からある文字までを取り出し、その文字より先も var
で返す関数です。他の未定義関数は、他の[FAQ]中に見つかると思います。
{=========================================================}
function GetFromString(var vStr: string; ch: char): string;
{vStr を頭から見て、chで区切られたところまでを返す
vStr には残りが戻る}
var
PosC
: integer;
begin
PosC:=Pos(ch,vStr);
if PosC=0 then begin
Result:=vStr; vStr:='';
end else begin
Result:=Copy(vStr,1,PosC-1);
vStr:=Copy(vStr,PosC+1,System.Length(vStr)-PosC);
end;
end; {GetFromString}
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum FDELPHIに寄せられる質問の中から、よくある質問への回答を FDELPHIのメンバーがまとめたものです。 したがって、これらの回答はボーランド株式会社がサポートする公式のものではなく、掲示されている内容についての問い合わせは受けられない場合があります。
Copyright 1996-1998 Delphi Users' ForumFAQ編纂委員会
|