Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#2

AW: TImage in Runtime mit Maus verschieben

  Alt 11. Apr 2014, 10:45
Zitat:
SetCapture(TWinControl(Sender).Handle);
TImage, TLabel, TShape usw. sind keine "eigentständigen" Window-Controls. (TStaticText ist seitens Windows das eigentlich "TLabel")

Diese haben kein eigenes Handle (HWND und vorallem kein eigenes Canvas) und sie zeichnen sich direkt auf ihrem Parent, wo sie sich sich "hinterhältig" reingehäckt haben.


Sooooo, und beim Debuggen, was mal am wirklich lernen sollte, wäre dir aufgefallen, dass dieses TImage kein TWinControl ist und somit der Code in OnMouseDown garnicht ausgeführt wird.
> Denn die Genannten sind alles Nachfahren von TGraphicControl


[edit]
Versuch es mal so:
Delphi-Quellcode:
procedure TForm1.ControlMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if chkPositionRunTime.Checked then
  begin
    inReposition := True;
    GetCursorPos(oldPos);
    if Sender is TWinControl then
      SetCapture(TWinControl(Sender).Handle);
  end;
end;
Und was im OnMouseMove geändert werden muß, weiß ich jetzt nicht direkt, aber tausch dort mal das TWinControl gegen ein TControl aus und schau was von dem code dann nicht mehr geht.

PS: Vorallem als Anfänger würde ich dir empfehlen lieber weiche Castes/Konvertierungen wie (Sender as TWinControl) zu verwenden, anstatt den harten Castes ala TWinControl(Sender) .
Diese lassen sich problemlos austauschen, aber bei den harten Casts ist keine automatisch Typprüfung vorhanden.
Im ControlMouseDown wurde zwar vorher via IS geprüft, aber im ControlMouseMove würde es nun womöglich "ungeprüft" knallen (eine Exception), nach meinen Änderungen im ControlMouseDown.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (11. Apr 2014 um 11:01 Uhr)
  Mit Zitat antworten Zitat