2012-12-03 71 views
10

Tôi có một TImage trên TPanel và một TPanels (trống) khác. Tôi muốn kéo hình ảnh từ bảng đầu tiên đến bảng thứ hai bằng cách kéo và thả.Di chuyển hình ảnh trong khi kéo và thả

Tôi thực sự muốn xem hình ảnh trong khi di chuyển từ một bảng đến khác (nửa công khai).

Tôi nghĩ tôi nên sử dụng TDragObject.GetDragImages nhưng tôi không thể tìm ra cách xây dựng toàn bộ ma thuật.

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 - Tôi tìm thấy một bài viết hữu ích: Implementing Professional Drag & Drop In VCL/CLX Applications

Trả lời

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

Cảm ơn bạn @bummi. mã của bạn rất hữu ích! – ZigiZ

Các vấn đề liên quan