お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"IEからURLのドロップを受け取る"







 Internet Explorerから、URLのドロップをフォームで受け取り、エディット
ボックスに表示するサンプルです。Netscape6.1でも動くのを確認しました。
 ブラウザからの直接のドロップだけを受け付けます。.urlファイルは受け取
れません。
 DragEnterやDragOverは手抜きなので、ドロップ禁止マークを出したいとき
は、ちゃんとIDataObject.EnumFormatEtc等で確認してください。まじめに実
装するのは結構面倒です(^^;
 汎用的にしたい場合は、フォームに直接実装するのではなく、他のユニット
にするなり、コンポーネントにするなりした方がいいでしょう。
 nifty:FDELPHI/MES/16/763のぜえたさんのサンプルなどを参考にさせて頂き
ました。


 フォームにTEditを一つ配置して、以下のようにコードを追加してください。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ActiveX, ComObj, StdCtrls;

type
    TForm1 = class(TForm, IDropTarget)
                          //BCBだとこれが出来ないのでちょっと悔しい(笑)
                          //他のユニットにしないとだめなの…。
    Edit1: TEdit;
    private
        { Private 宣言 }
    protected
        procedure CreateWnd; override;
        procedure DestroyWnd; override;
    public
        { Public 宣言 }
        function DragEnter(const dataObj: IDataObject; grfKeyState: Longint;
            pt: TPoint; var dwEffect: Longint): HResult; stdcall;

        //TControlの同名メソッドと衝突するのでメソッド名を変える
        function IDropTarget.DragOver = DTDragOver;
        function DTDragOver(grfKeyState: Longint; pt: TPoint;
            var dwEffect: Longint): HResult; stdcall;

        function DragLeave: HResult; stdcall;
        function Drop(const dataObj: IDataObject; grfKeyState: Longint;
            pt: TPoint; var dwEffect: Longint): HResult; stdcall;
    end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CreateWnd;
begin
    inherited;
    OleCheck(RegisterDragDrop(Handle, self as IDropTarget));
end;

procedure TForm1.DestroyWnd;
begin
    OleCheck(RevokeDragDrop(Handle));
    inherited;
end;

function TForm1.DragEnter(const dataObj: IDataObject; grfKeyState: 
Longint;
    pt: TPoint; var dwEffect: Longint): HResult; stdcall;
begin
    //手抜き(^^;
    dwEffect := DROPEFFECT_COPY;
    Result := S_OK;
end;

function TForm1.DTDragOver(grfKeyState: Longint; pt: TPoint;
    var dwEffect: Longint): HResult; stdcall;
begin
    //手抜き(^^;
    dwEffect := DROPEFFECT_COPY;
    Result := S_OK;
end;

function TForm1.DragLeave: HResult; stdcall;
begin
    //手抜き(^^;
    Result := S_OK;
end;

function TForm1.Drop(const dataObj: IDataObject; grfKeyState: Longint; 
    pt: TPoint; var dwEffect: Longint): HResult; stdcall;
const
     FormatEtc: TFormatEtc = (
        cfFormat: CF_TEXT;
        ptd: nil;
        dwAspect: DVASPECT_CONTENT;
        lindex: -1;
        tymed: TYMED_HGLOBAL;
     );

var
    Medium : TStgMedium;
begin
    Result := S_OK;
    if Failed(dataObj.GetData(FormatEtc, Medium)) then Exit;
    try
        Edit1.Text := PChar(GlobalLock(Medium.hGlobal));
        GlobalUnlock(Medium.hGlobal);
    finally
        ReleaseStgMedium(Medium);
        Result := S_OK;
    end;
end;

initialization
    //これを忘れると、RegisterDragDropに失敗します。
    OleInitialize(nil);
finalization
    OleUninitialize;

end.

                                               01/10/22(月) FUU
 



Original document by FUU          氏 ID:(QVD00134)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum