Delphi Can

Orjinalini görmek için tıklayınız: Image taşıma
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Merhaba,


TImage nesnesini taşımak için aşağıdaki kodları kullanıyorum.
Kısmen güzel çalışıyor fakat bazen anlam veremediğim durumlar ortaya çıkıyor. Taşıdığım TImage taşıma anında bir anda formun başka tarafına gidiyor.
Birde yapamadığım şey TImage TLayout içinde bu TLayout dışına çıkmamasını nasıl sağlarım? veya başka yöntemlede nasıl yapabilirim?



var
  ImageStartDragPos: TPointF;
  ImageDragging: Boolean;


procedure TMainForm.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
  if (ssleft in Shift) then
  begin
    ImageStartDragPos := ClientToScreen(Point(Round(X), Round(Y)));
    ImageDragging := True;
  end;
end;

procedure TMainForm.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
begin
  if ImageDragging then
  begin
    Imag1.Position.Point := ScreenToClient(ClientToScreen(Image1.Position.Point + ClientToScreen(Point(Round(X), Round(Y))) - ImageStartDragPos));
  end;
end;

procedure TMainForm.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
  ImageDragging := False;
end;
Bu şekliyle, Layout sınırlarını vererek Image'in yeniden pozisyon almasını önleyecek bir iki dokunuş lazım. 

Örneğin

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Single);
var
  MoveOK  : Boolean;
  aPoint  : TPointF;
begin
  if ImageDragging then
  begin
    aPoint := ScreenToClient(ClientToScreen(TImage(Sender).Position.Point + ClientToScreen(Point(Round(X), Round(Y))) - ImageStartDragPos));
    MoveOK := ( aPoint.x >= 0 )
          AND ( aPoint.x <= TLayout(TImage(Sender).Parent).Width   - TImage(Sender).Width  )
          AND ( aPoint.y >= 0 )
          AND ( aPoint.y <= TLayout(TImage(Sender).Parent).Height  - TImage(Sender).Height );
    if MoveOK then TImage(Sender).Position.Point := aPoint
              else Image1MouseDown(Sender, TMouseButton.mbLeft, Shift, X, Y ); // this line prevents move but refreshes MouseDown (ImageStartDragPos) Point
  end;
end;