dbgrid 中想要移动行,比如把第6行移到第3行,ID替换成第3行的ID,其他行的ID不变,但其他的数据下移一行。同时保存到数据库中。
比如:
ID NAME MONEY
1 AA 10
4 BB 20
6 CC 13 ——————(第三行)
7 DD 10
8 EE 12
13 FF 5
102 44 9 ------------(第六行)
125 DE 8结果:
ID NAME MONEY
1 AA 10
4 BB 20
6 44 9 ------------(第六行)
7 CC 13 ——————(第三行)
8 DD 10
13 EE 12
102 FF 5
125 DE 8
比如:
ID NAME MONEY
1 AA 10
4 BB 20
6 CC 13 ——————(第三行)
7 DD 10
8 EE 12
13 FF 5
102 44 9 ------------(第六行)
125 DE 8结果:
ID NAME MONEY
1 AA 10
4 BB 20
6 44 9 ------------(第六行)
7 CC 13 ——————(第三行)
8 DD 10
13 EE 12
102 FF 5
125 DE 8
通过MouseMove事件、DragOver事件、EndDrag事件实现,例如在PANEL上的LABEL:
var xpanel,ypanel,xlabel,ylabel:integer;
PANEL的MouseMove事件:xpanel:=x;ypanel:=y;
PANEL的DragOver事件:xpanel:=x;ypanel:=y;
LABEL的MouseMove事件:xlabel:=x;ylabel:=y;
LABEL的EndDrag事件:label.left:=xpanel-xlabel;label.top:=ypanel-ylabel;
交换记录procedure TForm1.ListView1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
if Source = ListView1 then Accept:=True;
end;procedure TForm1.ListView1EndDrag(Sender, Target: TObject; X, Y: Integer);
var vItem,vItem1:TListItem;
begin
if (Sender = ListView1)and (ListView1.Selected<>nil) then
begin
vItem:=ListView1.GetItemAt(X,Y);
if vItem<> nil then
begin
if vItem<>ListView1.Selected then
begin
vItem1:=ListView1.Selected;
if vItem.Index<vItem1.Index then
ListView1.Items.Insert(vItem.Index).Assign(vItem1)
else
ListView1.Items.Insert(vItem.Index+1).Assign(vItem1);
ListView1.Items.Delete(vItem1.Index);
end;
end;
end;
end;
var temp1,temp2:integer;
book:Tbookstr;
begin
temp1:=adoquery1.fieldbyname('field1').AsInteger;
adoquery1.Next;
if not adoquery1.Eof then
begin
begin
adoquery1.DisableControls;
book:=adoquery1.Book;
temp2:=adoquery1.fieldbyname('field1').AsInteger;
adoquery1.Edit;
adoquery1.fieldbyname('field1').AsInteger:=temp1;
adoquery1.Post;
adoquery1.Prior;
end;
adoquery1.Edit;
adoquery1.fieldbyname('field1').AsInteger:=temp2;
adoquery1.Post;
adoquery1.Close;
adoquery1.Open;
adoquery1.Book:=book;
adoquery1.EnableControls;
end;
end;