Witam!
Muszę zrobić program, na którym będzie można donyślnie umieszczać dowolną liczbę buttonów (dynamicznie) i mając jeden z nich kliknięty można go przesówać. Chodzi o coś takiego jak jest w edytorach html WYSIWIG.
Buttony mają nazywać się w stylu btn1, btn2 itd.
Stworzyłem 3 procedury:
procedure btnMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure btnMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure btnMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure TForm1.btnMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
i,wynik:integer;
z : string;
tmp:string;
begin
for i := 0 to ControlCount-1 do
begin
if (Controls[i] is TFlatButton) then
z := (Controls[i] as TFlatButton).Name;
end;
for i:=0 to length(z) do
if (z[i] in ['0'..'9']) then tmp:=tmp+z[i];
wynik:=strtoint(tmp);
SetCapture(TFlatButton(FindComponent('btn'+ inttostr(wynik))).Handle);
Capturing := true;
MouseDownSpot.X := x;
MouseDownSpot.Y := Y;
end;
procedure TForm1.btnMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
i,wynik:integer;
z : string;
tmp:string;
begin
for i := 0 to ControlCount-1 do
begin
if (Controls[i] is TFlatButton) then
z := (Controls[i] as TFlatButton).Name;
end;
for i:=0 to length(z) do
if (z[i] in ['0'..'9']) then tmp:=tmp+z[i];
wynik:=strtoint(tmp);
caption := inttostr(wynik);
if Capturing then begin
TFlatButton(FindComponent('btn'+ inttostr(wynik))).Left := TFlatButton(FindComponent('btn'+ inttostr(wynik))).Left - (MouseDownSpot.x - x);
TFlatButton(FindComponent('btn'+ inttostr(wynik))).Top := TFlatButton(FindComponent('btn'+ inttostr(wynik))).Top - (MouseDownSpot.y - y);
end;
end;
procedure TForm1.btnMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
i,wynik:integer;
z : string;
tmp:string;
begin
for i := 0 to ControlCount-1 do
begin
if (Controls[i] is TFlatButton) then
z := (Controls[i] as TFlatButton).Name;
end;
for i:=0 to length(z) do
if (z[i] in ['0'..'9']) then tmp:=tmp+z[i];
wynik:=strtoint(tmp);
if Capturing then begin
ReleaseCapture;
Capturing := false;
TFlatButton(FindComponent('btn'+ inttostr(wynik))).Left := TFlatButton(FindComponent('btn'+ inttostr(wynik))).Left - (MouseDownSpot.x - x);
TFlatButton(FindComponent('btn'+ inttostr(wynik))).Top := TFlatButton(FindComponent('btn'+ inttostr(wynik))).Top - (MouseDownSpot.y - y);
end;
end;
Buttony tworzą się w ten sposób:
var
btn : TFlatButton;
begin
btn := TFlatButton.Create(Self);
btn.Name := 'btn' + inttostr(liczbabtn);
btn.Caption := 'btn'+inttostr(liczbabtn);
btn.Left := 100;
btn.Parent := self;
btn.OnMouseDown := btnMouseDown;
btn.OnMouseMove := btnMouseMove;
btn.OnMouseUp := btnMouseUp;
liczbabtn:=liczbabtn+1;
Teraz sedno sprawy. Wszystko chodzi, jeśli jest 1 button. Jeśli utworze 2 i klikne na pierwszym, aby go przesunąc, potem kliknę na drugnim i też go przemiecznę i jeszcze raz na pierwszym to button drugi nakłada się na pierwszy. Co jest źle zrobione?