14. januar 2006 - 13:53
Der er
2 kommentarer og
1 løsning
Drag and drop
Hej Eksperter.
Jeg har to listbokse, hvoraf jeg i den ene har en række navne fra en database.
Det jeg godt kunne tænke mig var at man kunne trække navne fra listbox1 over til listbox2 (De skal stadig blive i listbox 1), i listbox2, skal man gerne kunne flytte filerne op og ned også med drag and drop, og man skal kunne fjerne ellementerne fra listbox to ved at trække dem udenfor feltet.
Hvordan løser jeg dette problem?
14. januar 2006 - 16:08
#1
Du skal lave tre events for de to listboxe som vist i nedenstående eksempel:
unit udragtest;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
ListBox1: TListBox;
ListBox2: TListBox;
procedure ListBoxMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure ListBoxDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure ListBoxDragDrop(Sender, Source: TObject; X, Y: Integer);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ListBoxMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if button=mbleft then (sender as tlistbox).begindrag(false, 10);
end;
procedure TForm1.ListBoxDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
accept := (source is tlistbox);
end;
procedure TForm1.ListBoxDragDrop(Sender, Source: TObject; X, Y: Integer);
var
p, i: integer;
begin
p := (sender as tlistbox).itematpos(point(x,y), true);
with (source as tlistbox) do
begin
for i := 0 to items.Count-1 do if selected[i] then
begin
if (sender = source)
then items.Move(i, p)
else (sender as tlistbox).Items.Insert(p, items[i]);
inc(p);
end;
// if sender<>source then deleteselected; hvis afsender-element skal fjernes
end;
end;
end.