|
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
|