zoukankan      html  css  js  c++  java
  • Delphi实现文件的拖放功能

    转自:http://blog.csdn.net/formiss/archive/2007/05/31/1633145.aspx

    unit uDropFile;

    {

    这个小程序实现的内容是比较简单的,更有难度一些的,可以在RichEdit内部, 实现对选定文字的拖放


    =========================如何在Delphi程序中支持文本拖放========================
    }
    //支持文件拖放关键在于两点 :
    //1 、使程序能接收WM_DROPFILES消息 ;
    //2 、在WM_DROPFILES消息的响应程序中取得被拖放的文件名,然后进行相应处理。
    // 使程序能接收WM_DROPFILES消息
    // 首先,需要调用WINAPI DragAcceptFiles(Handle, True);
    // 其中的Handle为要接收WM_DROPFILES消息的控件的Handle 。
    // 例如,我们要让RichEdit接收该消息,则调用形式为:
    // DragAcceptFiles(DropFileFrm.RichEdit.Handle, True);
    // 其次,要在收到 WM_DROPFILES 消息时做处理,需要用自己的代码替换该控件的WindowProc方法。
    // 在替换前,要保存原来的WindowProc方法以便处理其他消息。
    // 为此,我们定义一个全程变量OldWndProc: TWndMethod保存原来的WindowProc方法;
    // 再在窗体定义的Public段定义了一个方法:
    // procedure DragFileProc(var Message: TMessage);
    // 作为新的WindowProc方法。在Unit的implementation段内写下DragFileProc的完整代码,
    // 当消息为其他消息地调用OldWndProc来处理,当消息为WM_DROPFILES时,作相应处理。
    // 取得被拖放的文件名,然后进行相应处理
    // 在WM_DROPFILES消息的响应程序中,先调用:
    // DragQueryFile(Message.wParam, $FFFFFFFF, nil, 0);
    // 返回值为拖放的文件总数。再循环调用:
    // DragQueryFile(Message.wParam, FileNum, Buf, Len);
    // 取得拖放文件全名。FileNum为0到拖放的文件总数减1的值,buf为Pchar型,
    // 是存放文件名的缓冲区,Len为文件名缓冲区长度。至于取得文件名后的处理,就悉听尊便了。
    // 一定要注意 Pchar 和 String 的转换!
    {===============================================================================}

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, ShellApi, ComCtrls;

    type
    TTDropFileFrm
    = class(TForm)
    RichEdit: TRichEdit;
    RichEdit1: TRichEdit;
    procedure FormCreate(Sender: TObject);
    private
    { Private declarations }
    public
    procedure DragFileProc(var Message: TMessage);
    { Public declarations }
    end;

    var
    DropFileFrm: TTDropFileFrm;

    implementation

    var
    OLDWndProc: TWndMethod;

    {$R *.dfm}

    procedure TTDropFileFrm.DragFileProc(var Message: TMessage);
    var
    FileNum: Word;
    p:
    array[0..254] of char;
    begin
    if Message.Msg = WM_DropFiles then
    begin
    Self.RichEdit.Clear;
    FileNum :
    = DragQueryFile(Message.WParam, $FFFFFFFF, nil, 0);
    // 取得拖放文件总数
    for FileNum := 0 to FileNum - 1 do
    begin
    DragQueryFile(Message.WParam, FileNum, p,
    255);
    // 取得拖放文件名
    //Self.MemoDrag.Lines.add(StrPas(p));
    //对文件的处理
    RichEdit.Lines.LoadFromFile(StrPas(p));
    end;
    end
    else // 其他消息,调用原来的处理程序
    OLDWndProc(Message);
    end;

    procedure TTDropFileFrm.FormCreate(Sender: TObject);
    begin
    DragAcceptFiles(Self.RichEdit.Handle, True);
    OLDWndProc :
    = Self.RichEdit.WindowProc;
    // 保存原来的 WindowProc
    Self.RichEdit.WindowProc :
    = Self.DragFileProc;
    // 设置新的 WindowProc
    RichEdit.Lines.Clear;
    end;

    end.
  • 相关阅读:
    B.Icebound and Sequence
    Educational Codeforces Round 65 (Rated for Div. 2) D. Bicolored RBS
    Educational Codeforces Round 65 (Rated for Div. 2) C. News Distribution
    Educational Codeforces Round 65 (Rated for Div. 2) B. Lost Numbers
    Educational Codeforces Round 65 (Rated for Div. 2) A. Telephone Number
    Codeforces Round #561 (Div. 2) C. A Tale of Two Lands
    Codeforces Round #561 (Div. 2) B. All the Vowels Please
    Codeforces Round #561 (Div. 2) A. Silent Classroom
    HDU-2119-Matrix(最大匹配)
    读书的感想!
  • 原文地址:https://www.cnblogs.com/klaus/p/1860403.html
Copyright © 2011-2022 走看看