dropurl.pas

来自「Drag files and Drop to delphi forms 0402」· PAS 代码 · 共 303 行

PAS
303
字号
unit DropURL;

interface

{$include DragDrop.inc}

uses
  ImgList,
  DragDrop,
  DropSource,
  DropTarget,
  DragDropGraphics,
  DragDropInternet,
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, ExtCtrls, ActiveX, CommCtrl, Menus;

type
  TFormURL = class(TForm)
    Panel1: TPanel;
    ButtonClose: TButton;
    StatusBar1: TStatusBar;
    Memo2: TMemo;
    DropURLTarget1: TDropURLTarget;
    DropURLSource1: TDropURLSource;
    DropBMPSource1: TDropBMPSource;
    DropBMPTarget1: TDropBMPTarget;
    PanelImageTarget: TPanel;
    ImageTarget: TImage;
    Panel3: TPanel;
    Memo1: TMemo;
    PanelImageSource2: TPanel;
    ImageSource2: TImage;
    LabelURL: TLabel;
    ImageList1: TImageList;
    PanelImageSource1: TPanel;
    ImageSource1: TImage;
    DropDummy1: TDropDummy;
    PopupMenu1: TPopupMenu;
    MenuCopy: TMenuItem;
    MenuCut: TMenuItem;
    N1: TMenuItem;
    MenuPaste: TMenuItem;
    PanelURL: TPanel;
    procedure ButtonCloseClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure URLMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ImageMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure DropURLTarget1Drop(Sender: TObject; ShiftState: TShiftState;
      Point: TPoint; var Effect: Integer);
    procedure DropBMPTarget1Drop(Sender: TObject; ShiftState: TShiftState;
      Point: TPoint; var Effect: Integer);
    procedure MenuCutOrCopyClick(Sender: TObject);
    procedure MenuPasteClick(Sender: TObject);
    procedure PopupMenu1Popup(Sender: TObject);
    procedure DropBMPSource1Paste(Sender: TObject; Action: TDragResult;
      DeleteOnPaste: Boolean);
  private
    PasteImage: TImage; // Remembers which TImage is the source of a copy/paste
  public
  end;

var
  FormURL: TFormURL;

implementation

{$R *.DFM}

uses
  ComObj;

function GetTransparentColor(const bmp: TBitmap): TColor;
begin
  if (bmp = nil) or (bmp.empty) then
    Result := clWhite
  else
    Result := bmp.TransparentColor;
end;

procedure TFormURL.FormCreate(Sender: TObject);
begin
  // Note: This is an example of "manual" target registration. We could just
  // as well have assigned the TDropTarget.Target property at design-time to
  // register the drop targets.

  // Register the URL and BMP DropTarget controls.
  DropURLTarget1.Register(PanelURL);
  DropBMPTarget1.Register(PanelImageTarget);

  // This enables the dragged image to be visible
  // over the whole form, not just the above targets.
  DropDummy1.Register(Self);
end;

procedure TFormURL.FormDestroy(Sender: TObject);
begin
  // Note: This is an example of "manual" target unregistration. However,
  // Since the targets are automatically unregistered when they are destroyed,
  // it is not nescessary to do it manually.

  // UnRegister the DropTarget windows.
  DropURLTarget1.UnRegister;
  DropBMPTarget1.UnRegister;
  DropDummy1.UnRegister;
end;

procedure TFormURL.ButtonCloseClick(Sender: TObject);
begin
  Close;
end;

//------------------------------------------------------------------------------
// URL stuff ...
//------------------------------------------------------------------------------
type
  // TWinControlCracker is used to gain access to the protected memebers of
  // TWinControl.
  TWinControlCracker = class(TWinControl);

procedure TFormURL.URLMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  DragImage: TBitmap;
begin
  // Wait for user to move cursor before we start the drag/drop.
  if (DragDetectPlus(TWincontrol(Sender))) then
  begin
    // This demonstrates how to create a drag image based on the source control.
    // Note: DropURLSource1.Images = ImageList1
    DragImage := TBitmap.Create;
    try
      DragImage.Width := TWinControl(Sender).Width;
      DragImage.Height := TWinControl(Sender).Height;
      TWinControl(Sender).PaintTo(DragImage.Canvas.Handle, 0, 0);
      ImageList1.Width := DragImage.Width;
      ImageList1.Height := DragImage.Height;
      ImageList1.Add(DragImage, nil);
    finally
      DragImage.Free;
    end;
    DropURLSource1.ImageHotSpotX := X;
    DropURLSource1.ImageHotSpotY := Y;

    DropURLSource1.ImageIndex := 0;
    try
      // Copy the data into the drop source.
      DropURLSource1.Title := PanelURL.Caption;
      DropURLSource1.URL := LabelURL.Caption;

      // Temporarily disable Edit1 as a drop target.
      DropURLTarget1.DragTypes := [];
      try
        DropURLSource1.Execute;
      finally
        // Enable Edit1 as a drop target again.
        DropURLTarget1.DragTypes := [dtLink];
      end;

    finally
      // Now that the drag has completed we don't need the image list anymore.
      ImageList1.Clear;
    end;
  end;
end;

procedure TFormURL.DropURLTarget1Drop(Sender: TObject;
  ShiftState: TShiftState; Point: TPoint; var Effect: Integer);
begin
  // An URL has been dropped - Copy the URL and title from the drop target.
  PanelURL.Caption := DropURLTarget1.Title;
  LabelURL.Caption := DropURLTarget1.URL;
end;

//------------------------------------------------------------------------------
// Bitmap stuff ...
//------------------------------------------------------------------------------
procedure TFormURL.ImageMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  p: TPoint;
begin
  if (Button = mbRight) or (TImage(Sender).Picture.Graphic = nil) then
    exit;

  // First convert the mouse coordinates from Image relative coordinates
  // to screen coordinates.
  p := TControl(Sender).ClientToScreen(Point(X,Y));

  // Since the TImage component hasn't got a window handle, we must
  // use the TPanel behind it instead...
  if (DragDetectPlus(TImage(Sender).Parent.Handle, p)) then
  begin
    // Freeze clipboard contents if we have live data on it.
    // This is only nescessary because the TGraphic based data formats (such as
    // TBitmapDataFormat) doesn't support auto flushing.
    if (DropBMPSource1.LiveDataOnClipboard) then
      DropBMPSource1.FlushClipboard;

    // Copy the data into the drop source.
    DropBMPSource1.Bitmap.Assign(TImage(Sender).Picture.Graphic);

    // This just demonstrates dynamically allocating a drag image.
    // Note: DropBMPSource1.Images = ImageList1
    ImageList1.Width := DropBMPSource1.Bitmap.Width;
    ImageList1.Height := DropBMPSource1.Bitmap.Height;
    ImageList1.AddMasked(DropBMPSource1.Bitmap,
      GetTransparentColor(DropBMPSource1.Bitmap));
    DropBMPSource1.ImageIndex := 0;
    try

      // Perform the drag.
      if (DropBMPSource1.Execute = drDropMove) then
        // Clear the source image if image were drag-moved.
        TImage(Sender).Picture.Graphic := nil;

    finally
      // Now that the drag has completed we don't need the image list anymore.
      ImageList1.Clear;
    end;
  end;
end;

procedure TFormURL.PopupMenu1Popup(Sender: TObject);
var
  PopupSource: TComponent;
begin
  PopupSource := TPopupMenu(Sender).PopupComponent;

  // Enable cut and copy for source image unless it is empty.
  if (PopupSource = ImageSource1) or (PopupSource = ImageSource2) then
  begin
    MenuCopy.Enabled := (TImage(PopupSource).Picture.Graphic <> nil);
    MenuCut.Enabled := MenuCopy.Enabled;
    MenuPaste.Enabled := False;
  end else
  // Enable paste for target image if the clipboard contains a bitmap.
  if (PopupSource = ImageTarget) then
  begin
    MenuCopy.Enabled := False;
    MenuCut.Enabled := False;
    // Enable paste menu if the clipboard contains data in any of
    // the supported formats.
    MenuPaste.Enabled := DropBMPTarget1.CanPasteFromClipboard;
  end;
end;

procedure TFormURL.MenuCutOrCopyClick(Sender: TObject);
begin
  // Clear the current content of the clipboard.
  // This isn't strictly nescessary, but can improve performance; If the drop
  // source has live data on the clipboard and the drop source data is modified,
  // the drop source will copy all its current data to the clipboard and then
  // disconnect itself from it. It does this in order to preserve the clipboard
  // data in the state it was in when the data were copied to the clipboard.
  // Since we are about to copy new data to the clipboard, we might as well save
  // the drop source all this unnescessary work.
  DropBMPSource1.EmptyClipboard;

  // Remember which TImage component the data originated from. This is used so
  // we can clear the image if a "delete on paste" is performed.
  PasteImage := TImage(TPopupMenu(TMenuItem(Sender).GetParentMenu).PopupComponent);

  DropBMPSource1.Bitmap.Assign(PasteImage.Picture.Graphic);

  if (Sender = MenuCut) then
    DropBMPSource1.CutToClipboard
  else
    DropBMPSource1.CopyToClipboard;
  StatusBar1.SimpleText := 'Bitmap copied to clipboard';
end;

procedure TFormURL.DropBMPSource1Paste(Sender: TObject;
  Action: TDragResult; DeleteOnPaste: Boolean);
begin
  // When the target signals that it has pasted the image (after a
  // CutToClipboard operation), we can safely delete the source image.
  // This is an example of a "Delete on paste" operation.
  if (DeleteOnPaste) then
    PasteImage.Picture.Assign(nil);
  StatusBar1.SimpleText := 'Bitmap pasted from clipboard';
end;

procedure TFormURL.MenuPasteClick(Sender: TObject);
begin
  // PasteFromClipboard fires an OnDrop event, so we don't need to do
  // anything special here.
  DropBMPTarget1.PasteFromClipboard;
  StatusBar1.SimpleText := 'Bitmap pasted from clipboard';
end;

procedure TFormURL.DropBMPTarget1Drop(Sender: TObject;
  ShiftState: TShiftState; Point: TPoint; var Effect: Integer);
begin
  // An image has just been dropped on the target - Copy it to
  // our TImage component
  ImageTarget.Picture.Assign(DropBMPTarget1.Bitmap);
end;

end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?