buttony w WYSIWIG

0

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?

0

a Sender to pies? Po jakiego grzyba szukasz czegoś co Ci jest przekazywane??

0

(Sender as TFlatButton).wartość - jak mogłem o tym zapomnieć! Chylę czoło... [sciana]

1 użytkowników online, w tym zalogowanych: 0, gości: 1