2012-12-03 15 views
10

Ich habe eine TImage auf einem TPanel und eine andere (leere) TPanels. Ich möchte das Bild von dem ersten auf das zweite Panel ziehen und ziehen.Verschieben von Bildern beim Ziehen und Ablegen

Ich möchte eigentlich das Bild sehen, während es von einem Panel auf die andere (halbtransparent) bewegt.

Ich denke, ich sollte TDragObject.GetDragImages verwenden, aber ich kann nicht herausfinden, wie man die ganze Magie konstruiert.

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; 
    Shift: TShiftState; X, Y: Integer); 
begin 
    Image1.ControlStyle := Image1.ControlStyle + [csDisplayDragImage]; // ??? 
    TImage(Sender).BeginDrag(False); 
end; 

procedure TForm1.Image1StartDrag(Sender: TObject; var DragObject: TDragObject); 
begin 
    // ??? 
end; 

procedure TForm1.Panel1DragOver(Sender, Source: TObject; X, Y: Integer; 
    State: TDragState; var Accept: Boolean); 
begin 
    if (Source is TImage) then 
    Accept := TImage(Source).Parent <> Sender; 
end; 

procedure TForm1.Panel1DragDrop(Sender, Source: TObject; X, Y: Integer); 
begin 
    if (Source is TImage) then 
    begin 
    TImage(Source).Parent := TPanel(Sender); 
    TImage(Source).Align := alClient; 
    end; 
end; 

Update - fand ich einen nützlichen Beitrag: Implementing Professional Drag & Drop In VCL/CLX Applications

Antwort

13
unit Unit3; 

interface 
// 2012 Thomas Wassermann - demo 
uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, ExtCtrls; 

type 


    TMyDragObject = class(TDragControlObject) 
    private 
    FImageList:TImageList; 
    FDragSource:TControl; 
    protected 
    function GetDragImages: TDragImageList; override; 
    public 
    Procedure StartDrag(G:TGraphic;p:TPoint;DragSource:TControl); 
    Constructor Create(AControl: TControl); override; 
    Destructor Destroy;override; 
    Property DragSource:TControl read FDragSource; 
    end; 



    TForm3 = class(TForm) 
    Panel1: TPanel; 
    Panel2: TPanel; 
    Image1: TImage; 
    procedure Image1StartDrag(Sender: TObject; var DragObject: TDragObject); 
    procedure FormCreate(Sender: TObject); 
    procedure Panel1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); 
    procedure FormDestroy(Sender: TObject); 
    procedure Panel1DragDrop(Sender, Source: TObject; X, Y: Integer); 
    private 
    { Private-Deklarationen } 
    FDragObject:TMyDragObject; 
    public 
    { Public-Deklarationen } 
    end; 

var 
    Form3: TForm3; 

implementation 

constructor TMyDragObject.Create(AControl: TControl); 
begin 
    inherited; 
    FImageList:=TImageList.Create(nil); 
end; 

destructor TMyDragObject.Destroy; 
begin 
    FImageList.Free; 
    inherited; 
end; 

function TMyDragObject.GetDragImages: TDragImageList; 
begin 
    Result := FImageList; 
end; 

{$R *.dfm} 

procedure TMyDragObject.StartDrag(G: TGraphic;p:TPoint;DragSource:TControl); 
var 
bmp:TBitMap; 
begin 
    FDragSource := DragSource; 
    bmp:=TBitMap.Create; 
    try 
    FImageList.Width := g.Width; 
    FImageList.Height := g.Height; 
    bmp.Width := g.Width; 
    bmp.Height := g.Height; 
    bmp.Canvas.Draw(0,0,g); 
    FImageList.Add(bmp,nil); 
    finally 
    bmp.Free; 
    end; 
    FImageList.SetDragImage(0,p.x,p.y) 
end; 

procedure TForm3.FormCreate(Sender: TObject); 
var 
i:Integer; 
begin 
    ControlStyle := ControlStyle + [csDisplayDragImage]; 
    for I := 0 to ControlCount -1 do 
     if Controls[i] is TPanel then 
     TPanel(Controls[i]).ControlStyle := TPanel(Controls[i]).ControlStyle + [csDisplayDragImage]; 
    ReportMemoryLeaksOnShutDown := True; 
end; 

procedure TForm3.FormDestroy(Sender: TObject); 
begin 
    if Assigned(FDragObject) then FDragObject.Free; 
end; 

procedure TForm3.Image1StartDrag(Sender: TObject; var DragObject: TDragObject); 
var 
p:TPoint; 

begin 
    p:=TImage(Sender).ScreenToClient(mouse.cursorpos); 
    if Assigned(FDragObject) then FDragObject.Free; 
    FDragObject := TMyDragObject.Create(TImage(Sender)); 
    FDragObject.StartDrag(TImage(Sender).Picture.Graphic,p,TImage(Sender)); 
    DragObject := FDragObject; 
end; 

procedure TForm3.Panel1DragDrop(Sender, Source: TObject; X, Y: Integer); 
begin 
    if FDragObject.DragSource is TImage then 
    TImage(FDragObject.DragSource).Parent := TPanel(Sender); 
end; 

procedure TForm3.Panel1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); 
begin 
    Accept := Source is TMyDragObject; 
end; 

end. 
+2

Danke @bummi. Dein Code war sehr hilfreich! – ZigiZ

Verwandte Themen