drag and drop + ruch komponentu

0

Znalazlem na forum rozwiaznanie mojego prblemu a mianowicie przeciaganie komponentow na siebie. wszystko jest ok ale zalezy mi na tym aby podczas przeciagania jednego buttona na drugi bylo widac jego trase.

Rozwiazanie pierwszego problemu jest takie:

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
{ jezeli podczas przesuwania kursora myszy nacisniety jest lewy przycisk myszy to rozpocznij proces DnD }
if ssLeft in Shift then
Tbutton(Sender).BeginDrag(FALSE);
end;

procedure TForm1.Button2DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := Sender <> Source;
end;

procedure TForm1.Button2DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
TButton(Sender).Text:=(TButton(Source).Text);
TButton(Source).Clear;
end;

Aby widziec ruch przycisku uzylem:

if ssLeft in Shift then
begin
getcursorpos(p2);
Button1.Left:=Button1.Left+(p2.X-p1.X);
Button1.top:=Button1.top+(p2.y-p1.y);
getcursorpos(p1);

Oba rozwiazania pojedynczo dzialaja jak nalezy. Ale nie moge ich polaczyc zeby widziec ruch i przenosic zawartosc (caption) na drugi przycisk po upuszczeniu go. Z gory dzieki za pomoc.

0

jestem prawie pewien że to w ten sposób (z DnD) niemożliwe. musiałbyś zmienić sam mechanizm przeciągania. jest też pomysł ukrycia przeciąganego buttona podczas tego procesu, w jego miejsce utworzenia nowego który jeździ za kursorem. na pewno jednak nie można DnD przycisku który jest niewidzialny więc pomysł odpada. ja bym próbował obsłużyć OnMouseDown dla przeciąganego buttona. w OnMouseUp szukałbym innych buttonów w miejscu puszczenia itd. jeśli dobrze zrozumiałem.

0

Nie do konca chyba sie zrozumielismy
obie metody dzialaja. Pierwsza metoda dziala tylko ze jak przeciagam z jednego buttona do drugiego to zostaje on na swym miejscu (przenosi sie tylko zawartosc caption). A mi zalezy aby przeciagac button tak jak w drugiej opcji ale w momencie pojawienia sie przeciaganego buttona nad innym wynik ma byc jak w pierwszej metodzie. To tak jakbys gral w scrable i przenosil kwadracik z literka na dane pole.

0

jeszcze raz - klasyczny mechanizm DnD jest jaki jest i przenoszonego komponentu nie widzać w "real-time". pozostaje Ci :
a)napisać własny mechanizm tudzież zmodyfikować istniejący
b)zrobić to co zaproponowałem w poprzednim poście, np:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button2MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button2MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Button2MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Mxpoint, Mypoint, xpoint, ypoint : integer;

implementation

{$R *.dfm}

procedure TForm1.Button2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  var pos : Tpoint;
begin
   if (Button=mbLeft) then
      begin
      GetCursorPos(pos);
      mxpoint:=pos.X-Button2.Left;
      mypoint:=pos.Y-Button2.Top;
      end;
end;

procedure TForm1.Button2MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var pos : Tpoint;
    tabx, taby : integer;
begin
if Shift=[ssleft] then
   begin
   getcursorpos(pos);
   tabx:=pos.X-mxpoint;
   taby:=pos.y-mypoint;
   Button2.Left:=tabx;
   Button2.Top:=taby;
   end;
end;

procedure TForm1.Button2MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
  var i : longword;
begin
//teraz szukasz pewnych wartosc x i y, wdg których chcesz wyznaczac punkt upuszczenia buttona, np
xpoint:=Button2.Left;
ypoint:=Button2.Top;
for i:=0 to Form1.ComponentCount-1 do
    if TButton(Form1.Components[i]).Name='Button1' then
    //albo jesli to sa scrabble i masz duzo przyciskow
    if (Form1.Components[i] is TButton)and(Form1.Components[i]<>Self) then
       if (TButton(Form1.Components[i]).Left<xpoint)and
          (TButton(Form1.Components[i]).Left+TButton(Form1.Components[i]).Width>xpoint)and
          (TButton(Form1.Components[i]).Top<ypoint)and
          (TButton(Form1.Components[i]).Top+TButton(Form1.Components[i]).Height>ypoint) then
          begin
          TButton(Form1.Components[i]).Caption:=TButton(Sender).Caption;
          TButton(Sender).Visible:=false;
          end;
end;

end.

działa ? działa.

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