Pochwalony.
Aktualnie piszę aplikację, w której chciałbym umożliwić użytkownikowi przesuwanie komponentów na formie.
Obsługę D&D, oraz zapisywanie i przywracanie pozycji/rozmiaru już napisałem.
Chciałbym dodać tylko zamienianie się miejscami.
Na przykład mam taką formę:
Teraz, gdy użytkownik zechce przeciągnąć GroupBox3 w miejsce GroupBox1, ten ostatni powinien zająć miejsce komponentu, który zacząłem przeciągać:
I tak ze wszystkimi komponentami GroupBox...
Oto mój obecny kod do obsługi D&D:
var
inReposition : boolean;
oldPos, newPos : TPoint;
procedure TMainfrm.ControlMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if
(Sender is TWinControl) then
begin
inReposition:=True;
SetCapture(TWinControl(Sender).Handle);
GetCursorPos(oldPos);
end;
end;
procedure TMainfrm.ControlMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if inReposition then
begin
with TWinControl(Sender) do
begin
GetCursorPos(newPos);
Screen.Cursor := crSize;
Left := Left - oldPos.X + newPos.X;
Top := Top - oldPos.Y + newPos.Y;
oldPos := newPos;
end;
end;
end;
procedure TMainfrm.ControlMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if inReposition then
begin
Screen.Cursor := crDefault;
ReleaseCapture;
inReposition := False;
end;
end;
Oraz procedura zapisując w OnClose aktualną pozycję komponentów:
procedure TMainfrm.ZapiszPozycje;
var
INI : TIniFile;
ilosc : integer;
ctrl : TControl;
begin
INI := TIniFile.Create(ChangeFileExt(Application.ExeName,'.ini')) ;
try
for ilosc := 0 to -1 + Self.ComponentCount do
begin
if Components[ilosc] is TControl then
begin
ctrl := TControl(Components[ilosc]) ;
INI.WriteInteger(ctrl.Name,'Top',ctrl.Top) ;
INI.WriteInteger(ctrl.Name,'Left',ctrl.Left) ;
INI.WriteInteger(ctrl.Name,'Width',ctrl.Width) ;
INI.WriteInteger(ctrl.Name,'Height',ctrl.Height) ;
end;
end;
finally
INI.Free ;
end;
end;
Ktoś z Was ma jakieś pomysły/sugestie?
Pozdrawiam