ãã®èšäºã®å 容ïŒ
å€ãã®ããã°ã©ã ã§ã¯ããŠãŒã¶ãŒããšã¯ã¹ãããŒã©ãŒããã¢ããªã±ãŒã·ã§ã³ãŠã£ã³ããŠã«ãã¡ã€ã«ããã©ãã°ããŠéãããšãã§ããŸãã ååãšããŠãããã¯æšæºã®ãªãŒããã³ã°ã¢ãã«ãšã¯å¯Ÿç §çã«ãã¡ãã¥ãŒããã¡ã€ã«->éãããéžæããããããŒã«ããŒã®å¯Ÿå¿ãããã¿ã³ãã¯ãªãã¯ããããšã«ããããŠãŒã¶ãŒã«ãšã£ãŠãã䟿å©ã§ãããã®å ŽåããŠãŒã¶ãŒã¯ãã€ã¢ãã°ããã¯ã¹ã®æäœæé ãã¹ãããããããã§ãã
ãã®æ©èœãã¢ããªã±ãŒã·ã§ã³ã«è¿œå ãããšãããããããã§ãã·ã§ãã«ãã«ãªããŸãã
ä»çµã¿ïŒ
ãã®æ©èœãWindowsã¢ããªã±ãŒã·ã§ã³ã«è¿œå ããã«ã¯ãäž»ã«2ã€ã®æ¹æ³ããããŸãã
æåã®æ¹æ³ã¯ãæšæºã®Windowsãã©ãã°ã¢ã³ãããããAPIé¢æ°ã䜿çšããŠãä»éãããŠã£ã³ããŠã¡ãã»ãŒãžãåŠçããããšã§ãã
2çªç®ã®æ¹æ³ã¯ãã¢ããªã±ãŒã·ã§ã³éã§ããŒã¿ã転éããããã®é«åºŠãªæ¹æ³ãæäŸããOLEïŒCOMïŒãã¯ãããžãŒã®äœ¿çšã§ãã
ãã®èšäºã§ã¯ãæåã®æãç°¡åãªæ¹æ³ãæ€èšããŸãã
çãã¬ãã¥ãŒïŒ
ããã©ã«ãã§ã¯ãWindowsã¢ããªã±ãŒã·ã§ã³ã®ãã¡ã€ã«ã®ãã©ãã°ã¢ã³ããããããµããŒãã¯ç¡å¹ã«ãªã£ãŠããŸãã
ãã®æ©èœãæå¹ã«ããã«ã¯ããã©ãã°ã¢ã³ãããããéç¥ãåä¿¡ããããšãWindowsã«éç¥ããéç¥ããŒã¿ã®åŠçãæ åœãããŠã£ã³ããŠãæå®ããå¿ èŠããããŸãã
ãã®ãŠã£ã³ããŠã¯ããŠãŒã¶ãŒããã©ãã°ã¢ã³ãããããæäœãå®äºãããšãã«å°çããWM_DROPFILESã¡ãã»ãŒãžãåŠçã§ããå¿ èŠããããŸãã
ãã®ã¡ãã»ãŒãžã¯Dropã€ãã³ããã³ãã©ãŒãå®è£ ããæ©äŒãæäŸããŸããDropã€ãã³ããã³ãã©ãŒãããããŸããŸãªAPIé¢æ°ãåŒã³åºããŠã転éããããã®ã«é¢ããæ å ±ãååŸã§ããŸãã
ãã®ã¡ãã»ãŒãžã®åŠçãå®äºãããããã®æäœãåŠçããããšãéç¥ããããã«é¢ããéç¥ãåãåããããªãããšãWindowsã«éç¥ããããšããå§ãããŸãã
Windows VistaïŒããã³ãã以éïŒã®ã»ãã¥ãªãã£åé¡
ã»ãã¥ãªãã£äžã®çç±ãããWindows Vistaã¯ç°ãªãã»ãã¥ãªãã£èšå®ãæã€ãŠã£ã³ããŠéã§ãã©ãã°ã¢ã³ãããããã§ããªãå ŽåããããŸãã
ãã®çµæãã¢ããªã±ãŒã·ã§ã³ã«ããWM_DROPFILESã¡ãã»ãŒãžã®åä¿¡ããããã¯ãããå ŽåããããŸãã
ãã©ãã°ã¢ã³ãããããã«ãããã¡ã€ã«åä¿¡ãå®è£ ããããã«ãDelphiã¢ããªã±ãŒã·ã§ã³ã§å®è¡ããå¿ èŠã®ããæé ãã¹ãããããšã«èããŠã¿ãŸãããã
1.å¿ èŠãªAPIé¢æ°ã«ã¢ã¯ã»ã¹ããã«ã¯ãShellAPIã¢ãžã¥ãŒã«ãæ¥ç¶ããå¿ èŠããããŸãã
uses ShellAPI;
2. DragAcceptFilesé¢æ°ãåŒã³åºããæåã®ãã©ã¡ãŒã¿ãŒãWM_DROPFILESã¡ãã»ãŒãžã®åŠçãæ åœãããŠã£ã³ããŠã®ãã³ãã«ã«æž¡ãã2çªç®ã®ãã©ã¡ãŒã¿ãŒããã®ãŠã£ã³ããŠãéç¥ãåãåãæºåãã§ããŠããããšã瀺ãTrueã«æž¡ããŸãã
ããšãã°ããã®ãŠã£ã³ããŠã¯ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ãã©ãŒã ã«ãªããŸãã
DragAcceptFiles(Form1.Handle, True);
3. WM_DROPFILESã¡ãã»ãŒãžãåŠçããŸãã Delphiã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³ãã©ãŒã ã®ã¯ã©ã¹ã§ã¡ãã»ãŒãžãã³ãã©ã宣èšã§ããŸãã
procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
4. WM_DROPFILESã¡ãã»ãŒãžãåä¿¡ããããDragQueryXXXé¢æ°ã䜿çšããŠã転éããããã¡ã€ã«ã«é¢ããæ å ±ãååŸããŸãã以äžã®èª¬æãåç §ããŠãã ããã
5.ãã®ã¡ãã»ãŒãžã®åŠçãå®äºããããšãWindowsã«éç¥ããŸãã
ããã¯ãWM_DROPFILESã¡ãã»ãŒãžã®åŠçæã«åä¿¡ããHDROPèšè¿°åããã©ã¡ãŒã¿ãŒãšããŠæž¡ãããDragFinishé¢æ°ãåŒã³åºãããšã§å®è¡ãããŸãã
ãã®é¢æ°ãåŒã³åºããšããã©ãã°ã¢ã³ãããããæäœã«é¢ããããŒã¿ã®ä¿åã«äœ¿çšããããªãœãŒã¹ã解æŸãããŸãã
DragFinish(DropH);
6.ã¢ããªã±ãŒã·ã§ã³ãçµäºããããDragAcceptFilesé¢æ°ãå床åŒã³åºãå¿ èŠããããŸãããä»åã¯ãŠã£ã³ããŠãWM_DROPFILESã¡ãã»ãŒãžãåŠçããªããªã£ãããšãWindowsã«éç¥ãã2çªç®ã®ãã©ã¡ãŒã¿ãŒãšããŠFalseãæž¡ããŸãã
DragAcceptFiles(Form1.Handle, False);
移è¡ããããã¡ã€ã«ã«é¢ããæ å ±ãååŸããŸãã
移è¡ããããã¡ã€ã«ã«é¢ããæ å ±ãååŸããããã«ã2ã€ã®é¢æ°DragQueryFileãšDragQueryPointã䜿çšããŸãã
ãããã®é¢æ°ã¯äž¡æ¹ãšããWM_DROPFILESã¡ãã»ãŒãžã®åŠçæã«åä¿¡ãããHDROPèšè¿°åãã©ã¡ãŒã¿ãŒãå¿ èŠãšããŸãã
ããããããã¹ãŠã®ååŒ-DragQueryFileã
Windows APIã®ã»ãšãã©ã®æ©èœãšåæ§ã«ãDragQueryFileã¯ãæž¡ããããã©ã¡ãŒã¿ãŒã«å¿ããŠãããã€ãã®åäœãå®è£ ã§ããŸãã
ãã®ãããªåäœã¯ãããã°ã©ãããã®é¢æ°ã®æ£ãã䜿çšæ³ãèŠããã®ãé£ãããšããäºå®ã«ã€ãªããããšããããŸãã
ãã®ãã©ã¡ãŒã¿ãŒãèŠãŠã¿ãŸãããïŒDelphiã®æ§æãèæ ®ã«å ¥ããŠïŒïŒ
- DropHandleïŒHDROP-WM_DROPFILESã¡ãã»ãŒãžã«ãã£ãŠéä¿¡ãããæäœèšè¿°åã
- ã€ã³ããã¯ã¹ïŒæŽæ°-転éããããã¡ã€ã«ã®ãªã¹ããç §äŒãããšãã®ãã¡ã€ã«ã€ã³ããã¯ã¹ã
- FileNameïŒPChar-ãã¡ã€ã«åã®è»¢éå ã®ãããã¡ãŒãžã®ãã€ã³ã¿ãŒã
- BufSizeïŒæŽæ°-FileNameãããã¡ãŒã®ãµã€ãºã
ãã®é¢æ°ãåŒã³åºããšã次ã®ããŒã¿ãååŸã§ããŸãã
- 転éããããã¡ã€ã«ã®æ°ãååŸããŸãã ãã®æ å ±ãååŸããã«ã¯ãIndexãã©ã¡ãŒã¿ãŒã«$ FFFFFFFFãŸãã¯DWORDïŒ-1ïŒãæž¡ããŸããFileNameãã©ã¡ãŒã¿ãŒã¯ãnilãã§ãªããã°ãªãããFileNameãããã¡ãŒã®ãµã€ãºãå¶åŸ¡ããBufSizeãã©ã¡ãŒã¿ãŒã¯ãŒãã§ãªããã°ãªããŸããã é¢æ°ã«ãã£ãŠè¿ãããå€ã¯ã転éããããã¡ã€ã«ã®æ°ã«çãããªããŸãã æããã«ååã§ãã
- Indexãã©ã¡ãŒã¿ãŒã«åºã¥ããŠãã¡ã€ã«åãä¿åããããã«å¿ èŠãªã¡ã¢ãªé åã®ãµã€ãºãååŸããŸãïŒã«ãŠã³ãã¯ãŒãããå§ãŸããŸããã€ãŸãããªã¹ãå ã®æåã®ãã¡ã€ã«ã¯ãŒãã§ã€ã³ããã¯ã¹ä»ããããŸãïŒã ãããè¡ãã«ã¯ãIndexãã©ã¡ãŒã¿ãŒã䜿çšããŠãªã¹ãã«å¿ èŠãªãã¡ã€ã«ãæå®ããFileNameãã©ã¡ãŒã¿ãŒãšBufSizeãã©ã¡ãŒã¿ãŒãåã®æ®µèœãšåããŸãŸã«ããå¿ èŠããããŸãã ãã®çµæãé¢æ°ã¯ãã¡ã€ã«åãä¿åããã®ã«å¿ èŠãªãã€ãæ°ãè¿ããŸãã
- æž¡ãããã€ã³ããã¯ã¹ã«åºã¥ããŠãã¡ã€ã«åãååŸããŸãã ãããè¡ãã«ã¯ãIndexãã©ã¡ãŒã¿ãŒã䜿çšããŠãã¡ã€ã«ã€ã³ããã¯ã¹ãæå®ããããšã«å ããŠããã¡ã€ã«ãã¹ã«é¢ããããŒã¿ãšçµç«¯ã®ãŒããåä¿¡ã§ãããããã¡ãŒïŒå¿ èŠãªãµã€ãºãããããã«å€§ããïŒãæºåããŸãã
ãããŸã§ã®ãšãããããã¯ãã¹ãŠäžæ確ã«èŠããŸãããèšäºã®æåŸã§ããããã®ãã¹ãŠã®æ®µéããã¯ã©ã¹ã®åœ¢åŒã§å®è£ ãããç¬ç«ããã³ãŒãã®åœ¢åŒã§æ€èšããŸãã
ãã©ãã°ã¯ãšãªãã€ã³ã
ãã®é¢æ°ã¯ãååãšããŠã代æ¿ã®DragQueryFileã§ãããåŒã³åºãããšã§ããã©ãã°ã¢ã³ããããããã¡ã€ã«ãçµäºãã座æšãèŠã€ããããšãã§ããŸãã
ãã®ãã©ã¡ãŒã¿ãŒãèæ ®ããŠãã ããã
- DropHandleïŒHDROP-WM_DROPFILESã¡ãã»ãŒãžã«ãã£ãŠéä¿¡ãããæäœèšè¿°åã
- var PointïŒTPoint-ãã©ãã°ã¢ã³ãããããæäœã®å®äºç¹ã«é¢ããããŒã¿ãè¿ãããTPointæ§é äœã ãŠã£ã³ããŠã®ã¯ã©ã€ã¢ã³ãé åã§æäœãå®äºããå ŽåããŒã以å€ã®å€ãè¿ããŸãããã以å€ã®å Žåãé¢æ°ã¯ãŒããè¿ããŸãã
ãã¹ãŠãå®å šã«æ€èšããŸãããã
æ°ãããããžã§ã¯ããäœæããŸãã
ãéãã®Delphiã¢ããªã±ãŒã·ã§ã³ããããããã«ãã©ãã°ã¢ã³ãããããã§è»¢éããããã¡ã€ã«ã«é¢ããæ å ±ãåä¿¡ããæ©èœãè¿œå ããå¿ èŠããããŸãã
ãã®ãã©ãŒã ã§ã¯ãé¢å¿ã®ããã€ãã³ãã®ãã³ãã©ãŒãç»é²ããŸãã
procedure TForm1.FormCreate(Sender: TObject); begin // ... DragAcceptFiles(Self.Handle, True); // ... end;
ãã®ã³ãŒãã䜿çšããŠãWM_DROPFILESã¡ãã»ãŒãžãåä¿¡ããããã«ãµã€ã³ã¢ããããŸããã
ããã¯ãã¡ãã»ãŒãžãã³ãã©ãŒã®å€èŠ³ã§ãã
procedure TForm1.WMDropFiles(var Msg: TWMDropFiles); var DropH: HDROP; // DroppedFileCount: Integer; // FileNameLength: Integer; // FileName: string; // , I: Integer; // DropPoint: TPoint; // Drop begin inherited; // DropH := Msg.Drop; try // DroppedFileCount := DragQueryFile(DropH, $FFFFFFFF, nil, 0); // for I := 0 to Pred(DroppedFileCount) do begin // FileNameLength := DragQueryFile(DropH, I, nil, 0); // , // (Delphi ) SetLength(FileName, FileNameLength); // DragQueryFile(DropH, I, PChar(FileName), FileNameLength + 1); // - ( ) // ... end; // : , Drop DragQueryPoint(DropH, DropPoint); // ... - finally // - // DropH ... DragFinish(DropH); end; // , Msg.Result := 0; end;
æåã«ãããŒã«ã«å€æ°ã§ã®Dropæäœã®ãã³ãã«ãèŠããŠããŸãã
ããã¯äŸ¿å®äžã®ã¿è¡ãããŸããå°æ¥ããã®å€ãDragQueryFileé¢æ°ã®åŒã³åºãïŒããã³DragXXXã®æ®ãã®éšåïŒã«äœ¿çšããæåã®åŒã³åºãã§ãªã¹ãå ã®ãã¡ã€ã«æ°ãååŸããŸãã
次ã®ã¹ãããã¯ãã«ãŒãå ã®åãã¡ã€ã«ã®ååãã€ã³ããã¯ã¹ã§ååŸããããšã§ãïŒãªã¹ãå ã®ãã¡ã€ã«ã¯ãŒãããã€ã³ããã¯ã¹ä»ããããŸã-ãããå¿ããªãã§ãã ããïŒã
åãã¡ã€ã«ã«ã€ããŠãå ã«èª¬æããDragQueryFileã䜿çšãã2çªç®ã®æ¹æ³ã䜿çšããŠååŸã§ãããããã¡ãŒã®ãµã€ãºãæåã«èŠã€ããŠããããã¡ã€ã«ãžã®ãã¹ãæ ŒçŽããè¡ã«ã¡ã¢ãªãå²ãåœãŠãå¿ èŠããããŸãã
çµè«ãšããŠã3çªç®ã®æ¹æ³ã§DragQueryFileãåŒã³åºããŠãå²ãåœãŠããããããã¡ãžã®ãã¡ã€ã«ãã¹ãèªã¿åãå¿ èŠããããŸãã
ãã¡ã€ã«åã«é¢ãããã¹ãŠã®æ å ±ãèªã¿åã£ãåŸããŠãŒã¶ãŒããã¡ã€ã«ããã©ãã°ãããã€ã³ãã®åº§æšãååŸã§ããŸãã
ãã¹ãŠã®æäœãå®äºããããDragFinishé¢æ°ãåŒã³åºããŠãã³ãã«ã解æŸããŸãã
äŸå€ãçºçããå Žåã§ãããšã«ãããã®ã¢ã¯ã·ã§ã³ãå®è¡ããå¿ èŠãããããšã«æ³šæããŠãã ããã
æåŸã«ãMsg.Resultæ§é äœã«å€0ãèšå®ããŠããã®ã¡ãã»ãŒãžã®åŠçã«æåããããšã瀺ãããšã«ãããã¡ãã»ãŒãžã®åŠççµæã瀺ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®å®äºæã«ãã¡ã€ã³ãŠã£ã³ããŠãšWM_DROPFILESã¡ãã»ãŒãžã®åä¿¡ãåæããŸãã
procedure TForm1.FormDestroy(Sender: TObject); begin // ... DragAcceptFiles(Self.Handle, False); // ... end;
ãããã¯ã©ã¹ãšããŠå®è£ ããŸãïŒDelphiã®æ¹æ³ïŒ
ããŒã¹ã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒãã§çŽæ¥APIã䜿çšãããšãå€å°ã®æ··ä¹±ãçããããšã«åæããå Žåããã®æ©èœãè£å©ã¯ã©ã¹ã®åœ¢åŒã§å®çŸããæ¹ãã¯ããã«äŸ¿å©ã§ããããšã«åæãããšæããŸãã
äŸãšããŠãWM_DROPFILESã¡ãã»ãŒãžãåŠçã§ããå°ããªã¯ã©ã¹ã次ã«ç€ºããŸãã
ããèªäœã«ã¯å€ãã®ã³ãŒããé ãããŠããã®ã§ã䜿çšããã«ç¬ç«ããŠå®è£ ããå¿ èŠããããŸãã
確ãã«ã埮åŠãªéãããããŸã-WM_DROPFILESã¡ãã»ãŒãžãåŠçãããŠã£ã³ããŠã®ååšãWindowsã«éç¥ããå¿ èŠããããŸãã
ãã®ã¯ã©ã¹ã®å®£èšã¯æ¬¡ã®ããã«ãªããŸãã
type TFileCatcher = class(TObject) private fDropHandle: HDROP; function GetFile(Idx: Integer): string; function GetFileCount: Integer; function GetPoint: TPoint; public constructor Create(DropHandle: HDROP); destructor Destroy; override; property FileCount: Integer read GetFileCount; property Files[Idx: Integer]: string read GetFile; property DropPoint: TPoint read GetPoint; end;
...ãŸãããã®å®è£ ïŒ
constructor TFileCatcher.Create(DropHandle: HDROP); begin inherited Create; fDropHandle := DropHandle; end; destructor TFileCatcher.Destroy; begin DragFinish(fDropHandle); inherited; end; function TFileCatcher.GetFile(Idx: Integer): string; var FileNameLength: Integer; begin FileNameLength := DragQueryFile(fDropHandle, Idx, nil, 0); SetLength(Result, FileNameLength); DragQueryFile(fDropHandle, Idx, PChar(Result), FileNameLength + 1); end; function TFileCatcher.GetFileCount: Integer; begin Result := DragQueryFile(fDropHandle, $FFFFFFFF, nil, 0); end; function TFileCatcher.GetPoint: TPoint; begin DragQueryPoint(fDropHandle, Result); end;
ååãšããŠããããŸã§ã«è¿°ã¹ãããŠããªãããšã¯äœããããŸããã ãã§ã«ãã¹ãŠã®ã³ãŒããèŠãŠããŸããã
ã³ã³ã¹ãã©ã¯ã¿ã¯HDROPèšè¿°åãåãå ¥ãããã¹ãã©ã¯ã¿ã¯DragFinishã®åŒã³åºãã§ããã確å®ããŸãã
ãã¡ã€ã«ã®ãªã¹ããšãã®çªå·ã¯ãã¯ã©ã¹ããããã£ã«ãã£ãŠè¡šãããŸãã
ãã¹ãŠã®ã¯ã©ã¹ã¡ãœããã¯ãåºæ¬çã«DragQueryFileããã³DragQueryPoint APIã®ã©ãããŒã§ãã
TFileCatcherã®äœ¿çšãèæ ®ããŠãWM_DROPFILESã¡ãã»ãŒãžãã³ãã©ãæžãæããŸãããã
procedure TForm1.WMDropFiles(var Msg: TWMDropFiles); var I: Integer; // DropPoint: TPoint; // Drop Catcher: TFileCatcher; // TFileCatcher begin inherited; Catcher := TFileCatcher.Create(Msg.Drop); try for I := 0 to Pred(Catcher.FileCount) do begin // ... end; DropPoint := Catcher.DropPoint; // ... - finally Catcher.Free; end; Msg.Result := 0; end;
ä»åŸã®èšç»
TFileCatcherã¯ã©ã¹ãæ¡åŒµããŠããã©ãã°ã¢ã³ãããããæäœã§äœ¿çšããããã¹ãŠã®APIãé衚瀺ã«ããããšãã§ããŸãã 確ãã«ãããã«ã¯WM_DROPFILESã¡ãã»ãŒãžãååããããã«ãã©ãŒã ãŠã£ã³ããŠãžã®ã¢ã¯ã»ã¹ãå¿ èŠã§ãã
ãã®å®è£ ã®1ã€ã®ãªãã·ã§ã³ã¯ããã©ãŒã ãŠã£ã³ããŠããµãã¯ã©ã¹åããããšã§ãã 確ãã«ãããã¯ãã®èšäºã®ç¯å²å€ã§ãã ãã ããããã«æ å ±ãå¿ èŠãªå Žåã¯ãDrop Filesã³ã³ããŒãã³ãã®ã»ãããã芧ãã ããã
ãã¢ã¢ããª
ãã¢ã¢ããªã±ãŒã·ã§ã³ã®ãœãŒã¹ã³ãŒãã¯ããã®èšäºã§å ¬éãããŠããã³ãŒãã«åºã¥ããŠããŸãã ã³ãŒãã¯ãDelphiã®ããŒãžã§ã³4ã7ã§ãã¹ããããŸããã
ãã®ãœãŒã¹ã³ãŒãã¯æŠå¿µã®èšŒæã«éããããã®èšäºã®èª¬æã®ã¿ãç®çãšããŠããŸãã å®æããã¢ããªã±ãŒã·ã§ã³ã§çŸåšã®åœ¢åŒã§äœ¿çšããããã«èšèšãããŠããŸããã ã³ãŒãã¯ãæ瀺ãŸãã¯é»ç€ºãåããããããªãçš®é¡ã®ä¿èšŒããªãã«ããçŸç¶ã®ãŸãŸãã§æäŸãããŸãã ã³ãŒãã¯ãä»äººã®äœåãšããŠè²©å£²ãŸãã¯åœè£ ãããªãéãããããªãæ¹æ³ã§ã䜿çšã§ããŸãã ããããã¹ãŠã«åæããå Žåã¯ã次ã®ãªã³ã¯ã䜿çšããŠã³ãŒããããŠã³ããŒãããŠãã ããã
ãã¢ãããŠã³ããŒã