C++Builder Open Source [ back ]
INDEX    Maniac さんのHPも参考にして下さい。

  ● 引数 と ドラッグ&ドロップ
 

 ●NCデータ中の特定アドレス文字列をファイル出力。
     sample02.exe 299KB
                                   

 ●Win32API と C による通信ソーステキスト 
     comm.lzh 6.87KB    2003/04/25
                                   
 
● 引数 と ドラッグ&ドロップ

//===========================================================================

// 引数 と ドラッグ&ドロップ
// 引数や、ドラッグ&ドロップで渡されたファイル名を、リストに保存する例。


//===========================================================================
// ヘッダーファイル
// mainH
//---------------------------------------------------------------------------

#ifndef mainH
#define mainH
//---------------------------------------------------------------------------

// Windows API を呼び出すためのヘッダーファイルをインクルードする
// ドラッグ&ドロップを実装するのに必要なヘッダーファイル

#include <shellapi.h>


//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE 管理のコンポーネント
  void __fastcall FormCreate(TObject *Sender);
  void __fastcall FormClose(TObject *Sender, TCloseAction &Action);

private: // ユーザー宣言
  // WMDropFiles(TWMDropFiles &message)の宣言
  virtual void __fastcall WMDropFiles(TWMDropFiles &message);

  // ショートファイル名をロングファイル名にする宣言
  AnsiString __fastcall SFileToLFile(AnsiString s);


  // ファイルリスト OPEN/CLOSE 宣言
  void __fastcall file_list_open(void);
  void __fastcall file_list_close(void);


  // 引数ファイル名とドラッグ&ドロップファイル名、両方で使用
  // するためにここで宣言しています。

  AnsiString In_File;


  // ファイルリスト(ファイル名を保存するリスト)
  TStringList* FileList;
  // ファイルリストが OPEN されているか、いないか
  bool file_list_on;


public: // ユーザー宣言
  // メッセージマップ

  BEGIN_MESSAGE_MAP
  // MESSAGE_HANDLERマクロ定義
  // 引数(メッセージ番号、メッセージ構造体の型、メッセージハンドラ)
  // WM_DROPFILESメッセージを受信した時、TWMDropFilesをパラメータとして
  // WMDropFilesメソッドを呼び出します。

  MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WMDropFiles)
  END_MESSAGE_MAP(TForm);

};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
//===========================================================================



//===========================================================================
// メインファイル
// MainForm.cpp

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "main.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
  // ファイルリストOPEN
  file_list_open();
}
//---------------------------------------------------------------------------
// Form1Create

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  // ドラッグ & ドロップ
  // WM_DROPFILESメッセージを処理することができるようにする。
  // フォーム生成時にドロップの受け入れを開始するのでOnCreateに記述します。

  DragAcceptFiles(Handle, true);

  // 引数があるとき
  if (ParamCount() > 0)
  {
   for (int i=0; i<ParamCount(); i++)
   {

    // ショートファイル名をロングファイル名にする
    // この処理は、ショートカットなどにファイルをドロップしたときに
    // 省略形でファイル名が表示されないようにしています。

    In_File=SFileToLFile(ParamStr(i + 1));

    // ParamStr(i + 1)としているのは、ParamStr(0) は実行プログラム(自身)
    // のパスとファイル名なので、ParamStr(0) をとらないようにしています。

    // ファイルリストへファイル名を書き込む

    FileList->Add(In_File);
   }
  }
}
//---------------------------------------------------------------------------
// ドラッグ & ドロップ WMDropFiles メンバ関数コード

void __fastcall TForm1::WMDropFiles(TWMDropFiles &message)
{
  // ドロップされるファイルの数を得る
  // ファイルインデックスに 0xFFFFFFFF を渡すと
  // 以下2つの引数は意味をもたず、ファイルの総数を返します。

  UINT filecount = DragQueryFile((HDROP)message.Drop, 0xFFFFFFFF, NULL, 0);

  for (UINT i = 0; i < filecount; i++)
  {
   // 1つのファイルのパスを得る
   In_File.SetLength (MAX_PATH);
   int length = DragQueryFile((HDROP) message.Drop,
        i, In_File.c_str(), In_File.Length());
   In_File.SetLength(length);

   // ファイルリストへファイル名を書き込む
   FileList->Add(In_File);

  }


  // ドラッグ & ドロップ
  //Windowsが割り当てたメモリを開放します。

  DragFinish((HDROP)message.Drop);
}
//---------------------------------------------------------------------------
// FormClose

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  // ファイルリストCLOSE
  file_list_close();
}
//---------------------------------------------------------------------------
// ショートファイル名をロングファイル名にする

AnsiString __fastcall TForm1::SFileToLFile(AnsiString s)
{  // この部分は、K.Nakazawaさんの C++Builder Mini-technic から
  // 流用させていただきました。

  AnsiString L;
  WIN32_FIND_DATA fd;
  HANDLE h;
  //パスも全てロングにする
  while((h=FindFirstFile(s.c_str(),&fd))!=INVALID_HANDLE_VALUE)
  {
  FindClose(h);
  L.Insert(AnsiString('\\')+fd.cFileName,1);
  s = s.SubString(1,s.LastDelimiter('\\')-1);
  }
  L.Insert(s,1);
  return L;
}
//---------------------------------------------------------------------------
// FileList オープン

void __fastcall TForm1::file_list_open(void)
{
  if(!file_list_on)
  {
   FileList = new TStringList();
   file_list_on = true;
  }
}
//---------------------------------------------------------------------------
// FileList クローズ

void __fastcall TForm1::file_list_close(void)
{
  if(file_list_on)
  {
   delete FileList;
   file_list_on = false;
  }
}
//===========================================================================

[ もどる ]  [ WebMaster ]