Drag and Drop
A grafikus operációs rendszerek hasznos szolgáltatása a Drag&Drop, azaz vonszolási technika. Grafikus elemeinket megfoghatjuk, mozgathatjuk, és egy olyan objektum felé helyezve, mely képes a vonszolt elemet fogadni, elengedhetjük, aminek következtében az elem az új objektumban fog megjelenni. Ez a technika Delphi-ben is könnyen megvalósítható.
Legyen kis alkalmazásunkban elsőként két listadoboz, melyekből egy-egy elemet megfoghatunk és a másikba egérrel áttehetjük. Második részben egy listadobozból egy sztrigrácsba helyezhessünk át elemeket úgy, hogy az elengedés helye a cellát is jelölje ki. A harmadik részben beviteli mező tartalmát helyezhessük át az elsőből a másodikba. A beállításhoz az objektumok onMouseDown, onDragOver és onDragDrop eseménykezelőinek megírása szükséges.
A program futtatási képe, amikor már az elemeket, illetve az elemek egy részét már áthelyeztük a fogadó objektumba:
A program listája:
unit UDrag;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms, Dialogs, StdCtrls, Grids;
type
TfmDrag = class(TForm)
lbDrag: TLabel;
btKilepes: TButton;
ldA: TListBox;
ldB: TListBox;
ldC: TListBox;
sgRacs: TStringGrid;
edA: TEdit;
edB: TEdit;
procedure btKilepesClick(Sender: TObject);
procedure ldAMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure ldBMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure ldADragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure ldBDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure ldADragDrop(Sender, Source: TObject; X, Y: Integer);
procedure ldBDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure ldCMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure sgRacsDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure sgRacsDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure edAMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure edBDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure edBDragDrop(Sender, Source: TObject; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
fmDrag: TfmDrag;
implementation
{$R *.dfm}
procedure TfmDrag.btKilepesClick(Sender: TObject);
begin
Close;
end;
procedure TfmDrag.ldAMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ldA.BeginDrag(False);
ldB.ItemIndex:= -1;
ldC.ItemIndex:= -1;
end;
procedure TfmDrag.ldBMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ldB.BeginDrag(False);
ldA.ItemIndex:= -1;
ldC.ItemIndex:= -1;
end;
procedure TfmDrag.ldADragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept:= True;
end;
procedure TfmDrag.ldBDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept:= True;
end;
procedure TfmDrag.ldADragDrop(Sender, Source: TObject; X, Y: Integer);
begin
With ldB Do
Begin
If ItemIndex=-1 Then Exit;
ldA.Items.Add(Items[ItemIndex]);
Items.Delete(ItemIndex);
End;
end;
procedure TfmDrag.ldBDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
With ldA Do
Begin
If ItemIndex=-1 Then Exit;
ldB.Items.Add(Items[ItemIndex]);
Items.Delete(ItemIndex);
End;
end;
procedure TfmDrag.ldCMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ldC.BeginDrag(True);
ldA.ItemIndex:= -1;
ldB.ItemIndex:= -1;
end;
procedure TfmDrag.sgRacsDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept:= True;
end;
procedure TfmDrag.sgRacsDragDrop(Sender, Source: TObject; X, Y: Integer);
Var ACol, ARow: Integer;
begin
With ldC Do With sgRacs Do
Begin
If ItemIndex=-1 Then Exit;
ACol:= X Div ColWidths[0];
ARow:= Y Div RowHeights[0];
If ACol*ARow>0 Then
Begin
Col:= ACol; Row:= ARow;
Cells[Col,Row]:= Items[ItemIndex];
Items.Delete(ItemIndex);
End;
End;
end;
procedure TfmDrag.edAMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
edA.BeginDrag(True);
end;
procedure TfmDrag.edBDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept:= True;
end;
procedure TfmDrag.edBDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
edB.Text:= edA.Text;
edA.Text:= '';
end;
end.