[DELPHI]Poruszanie dynamicznym komponentem

0

http://4programmers.net/Forum/viewtopic.php?id=96583

Tutaj znalazłem odpowiedź jak poruszać komponentem. No i działa.

Jednak ja chcę poruszać dynamicznie stworzonym komponentem.

Mam taki komponent:

salea:=timage;

...

salea:= Timage.Create(groupbox1);
salea.Parent := Self.groupbox1;
salea.picture.Assign(source);
salea.Top:= 211;
salea.left:= 110;
salea.AutoSize:=true;
salea.Transparent:=true;

I wstawiam procedury:

procedure TForm1.saleaMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
MD := True;
 P := Point(X, Y);
end;

procedure TForm1.saleaMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 if MD then
 begin
 salea.Left := salea.Left + (X - P.X);
 salea.Top := salea.Top + (Y - P.Y);
 end;
end;

procedure TForm1.saleaMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 MD := False;
end;

I się nie przesuwa. Dlaczego ?

0

Trzeba myśleć [!!!] [!!!] [!!!] Jakim cudem dynamicznie stworzony Image ma "wiedzieć" że jest poruszany
czy cokolwiek jest z nim robione skoro nie ma przypisanych żadnych zdarzeń? Co z tego że wkleisz kod,
sam komponent nie jest taki domyślny. Poza tym statycznie tworzony komponent też sam nie zareaguje
na zdarzenia dopóki mu takich zdarzeń nie oprogramujesz i nie ustawiasz w zakładce "Events". Zrób tak:

// ... ciach ...
type
// ... ciach ...
    procedure Salea_MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Salea_MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Salea_MouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
// ... ciach ...

procedure TForm1.Salea_MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MD := True;
  P := Point(X, Y);
end;

procedure TForm1.Salea_MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if MD then
    begin
    Salea.Left := Salea.Left + (X - P.X);
    Salea.Top := Salea.Top + (Y - P.Y);
    end;
end;

procedure TForm1.Salea_MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MD := False;
end;
// ... ciach ...

I w procedurze dla na przykład przycisku - wklej taki kod jak poniżej. Ja ładuje dla testów obrazek z dysku,
ale Ty możesz sobie assignować inny obiekt Image czy co Ci się tam podobra :P Ważne są trzy ostatnie
linijki kodu, bez nich Twoj komponent jak już wspominałem nie "domyśli się" co się z nim aktualnie dzieje.

  Salea := Timage.Create(GroupBox1);
  Salea.Parent := Self.groupbox1;
  Salea.Picture.LoadFromFile('test.jpg');
  Salea.Top := 211;
  Salea.Left := 110;
  Salea.AutoSize := True;
  Salea.Transparent := True;
  Salea.OnMouseDown := Self.Salea_MouseDown;
  Salea.OnMouseMove := Self.Salea_MouseMove;
  Salea.OnMouseUp := Self.Salea_MouseUp;

Poza tym dobrym nawykiem jest formatowanie kodu i oddzielanie := spacjami po i przed tym operatorem.

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