お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





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

"DragDropに連動するイメージ"



こんにちは、ユニコムTMです。

  ドラッグドロップ中にマウスカーソルのとなりに、イメージリストの
  中のイメージを表示する事が可能なみたいです。
  (エクスプローラーでファイルをドラッグ中にファイルの絵がカーソル
    についてまわるのと同様の事がデルファイのすべてのコントロール
    から可能になる。)

  以下のソースを参考にしてみてください。
  ImageList1の最初のイメージにドラッグ中に
  表示させていイメージをいれる。
  Panel1,Panel2はドラッグ元とドラッグ先としてあるだけで特別な意味は
  もたないので適当に配置してください。

    ※Panel1.DragMode:=dmAutomaticにする

  あとはPanel1をドラッグしてみればお分かりいただけると思います。

#####################################################################

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,
  ExtCtrls;

type
  TForm1 = class(TForm)
    ImageList1: TImageList;
    Panel1: TPanel;
    Panel2: TPanel;
    procedure Panel1StartDrag(Sender: TObject;
      var DragObject: TDragObject);
    procedure Panel2DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    procedure FormShow(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

  //  任意のイメージリストをドラッグ中に表示させる為の
  //カスタマイズされたTDragObject
  TMyDragObject = class(TDragControlObject)
  protected
    cvImagelist : TImageList;
  public
    function GetDragImages: TCustomImageList; override;
    procedure HideDragImage; override;
    procedure ShowDragImage; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function TMyDragObject.GetDragImages: TCustomImageList;
begin
  Result := cvImageList;
end;

procedure TMyDragObject.HideDragImage;
begin
  cvImageList.HideDragImage;
end;

procedure TMyDragObject.ShowDragImage;
begin
  cvImageList.ShowDragImage;
end;

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

  //  ドラッグ中にイメージが表示されるには、ドロップ先のコントロールが
  // csDisplayDragImage が ControlStyle に入っている必要がある。
  // (そして、ほとんどのコントロールで入っていないので、
  //  特定のコントロールとその子コントロールのすべてに
  //  csDisplayDragImage
  //  を設定するサブルーチン。通常はFormに対して1度よべば良い)
procedure AllControlDisplayDragImage(pvControl:TWinControl);
var
  lvI : Integer;
  lvChild : TControl;
begin
  pvControl.ControlStyle :=
pvControl.ControlStyle+[csDisplayDragImage];
  for lvI:=0 to pvControl.ControlCount-1 do
  begin
    lvChild := TControl( pvControl.Controls[lvI] );
    if ( lvChild is TWinControl ) then
      AllControlDisplayDragImage( TWinControl(lvChild) )
    else
      lvChild.ControlStyle :=
            lvChild.ControlStyle+[csDisplayDragImage];
  end;
end;


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

  //  ドラッグを開始するコントロールのStartDragで
  //TMyDragObjectを渡す。この時、TMyDragObjectに利用させる
  //ためのイメージリストも渡す。
procedure TForm1.Panel1StartDrag(Sender: TObject;
  var DragObject: TDragObject);
begin
  DragObject := TMyDragObject.Create(Panel1);
  TMyDragObject(DragObject).cvImagelist := ImageList1;

  //イメージリスト内の0番目のイメージをドラッグ中に使い、
  //そのホットスポット(x,y)を設定している。
  //(ここではイメージの中心をホットスポットにしている)
  ImageList1.SetDragImage
     (0,ImageList1.Width div 2,ImageList1.Height div 2);
end;

procedure TForm1.Panel2DragOver(Sender, Source: TObject; X, Y:
Integer;
  State: TDragState; var Accept: Boolean);
begin
  Accept := TRUE;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  //すべてのコントロールに
  //csDisplayDragImage属性を割り振る
  AllControlDisplayDragImage(Self);
end;

#####################################################################


end.


                     98/6/5(Fri) 10:06am  LDZ06115 ユニコムTM

Original document by ユニコムTM      氏 ID:(LDZ06115)


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

Copyright 1996-2002 Delphi Users' Forum