お知らせ

電子会議

ライブラリ

FDelphi サイト全文検索

Delphi FAQ一覧

サンプル蔵



FDelphi FAQ
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編纂委員会