Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TObject Bewegung auf MouseMove (https://www.delphipraxis.net/98148-tobject-bewegung-auf-mousemove.html)

mleyen 22. Aug 2007 10:14


TObject Bewegung auf MouseMove
 
Hallo,
ich habe ein kleines Problem bei der Bewegung meines Panels. Und zwar soll das panel jedem Mausschritt genau 'verfolgen'.

Z.B.: Ich habe ein 100x100 Pixel großes Label und bewege dann die Maus von der Mitte aus (50x50 Pixel) nach 50x100. Dabei passiert gar nichts, obwohl der MouseMove eintrifft... Erst wenn ich die Maus über den Rand des Labels herausschiebe, dann erst wird das Label neu gezeichnet!
*Am besten ihr testet es mal selber, es sieht aus als ob es laggt* :roteyes:

Jetzt stellen sich 2 Fragen:
-Warum zeichnet sich das laben bei den ersten MouseMove´s nicht neu?
-Wie könnte ich es hinbekommen, dass es sich neuzeichnet?


Delphi-Quellcode:
//Kleiner Auschnitt meines Projekts, reduziert auf die Problematik
unit Test;
interface
uses
  Forms, ExtCtrls, Controls, Classes;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
end;
var
  Form1: TForm1;
implementation
{$R *.dfm}

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Panel1.Left:=X-50;
  Panel1.Top:=Y-50;
end;

end
*Bin Delphi-Anfänger, also macht mich fertig wenn was falsch ist!* :warn:

Ich hoffe ich habe mich nicht zu komplizier ausgedrückt und ihr wisst eine Lösung. :pale:
Vielen Dank schonmal im Vorraus!

MfG spawn

Edit: Ja die Suchfunktion hab ich schon ausgiebig durchstöbert... :|

sirius 22. Aug 2007 10:43

Re: TObject Bewegung auf MouseMove
 
Wie kommst du auf dei 50?

Du musst beim drücken der Maus, dir die Koordinaten merken und dann bei jeder Bewegung wieder neu und das Lebel auch neu setzen (eben um die Differnez zwischen den zuletzt gemerkten und den neuen Koordinaten)

mleyen 22. Aug 2007 10:48

Re: TObject Bewegung auf MouseMove
 
Zitat:

Zitat von sirius
Wie kommst du auf dei 50?

Joa bei mir ist das Label 100x100 Pixel groß und wenn ich dann dass Label -50X und -50Y Pixel tiefer setzte von der Maus, ist der Mauscursor genau in der Mitte des Labels.
*Kannst genauso gut die 50 weglassen, kommt das gleiche bei raus, ich habs nur gemach damit es schöner aussieht

Und das Label setze ich doch immer neu bei jeder bewegung der Maus.

stahli 22. Aug 2007 11:57

Re: TObject Bewegung auf MouseMove
 
Hallo spawn89,

ich bewege ein Shape, das in einem Panel plaziert ist, folgendermaßen:

Delphi-Quellcode:
unit fSpielerBildDefinieren;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, DBCtrls, ExtCtrls, ExtDlgs, StahliSoftStd;

type
  TFormSpielerBildDefinieren = class(TForm)
    PanelMain: TPanel;
...
    Shape: TShape;
...
  end;

var
  FormSpielerBildDefinieren: TFormSpielerBildDefinieren;
  MouseDownFlag:Boolean=False;
  MX,MY:Integer;


implementation

{$R *.dfm}

procedure TFormSpielerBildDefinieren.ShapeMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  MouseDownFlag:=True;
  Shape.Pen.Color:=clBlue;
  MX:=X;
  MY:=Y;
end;

procedure TFormSpielerBildDefinieren.ShapeMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
var P:TPoint;
begin
  BreakFlag:=True;
  if (MouseDownFlag) then begin
    P.X:=X;
    P.Y:=Y;
    P:=Shape.ClientToScreen(P);
    P:=PanelMain.ScreenToClient(P);
    Shape.Left:=(P.X-MX);
    Shape.Top:=(P.Y-MY);
    Shape.Refresh;
...
  end;
end;

procedure TFormSpielerBildDefinieren.ShapeMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  MouseDownFlag:=False;
...
  Shape.Pen.Color:=clBlack;
end;
Wichtig ist dabei, dass man die Mausklickposition in globalen Variablen merkt und die untergeordnete Shapeposition zum übergeordneten Panel ermittelt. Dann wird die Shapeposition zu der aktuellen Mausposition (verschoben durch die Klickkoordinaten) ermittelt...

Stahli

mleyen 22. Aug 2007 12:32

Re: TObject Bewegung auf MouseMove
 
Danke @stahli,

habe gerade festgestellt, dass das Label eine eigene OnMouseMove Funktion besitzen kann. Ich dachte die FormMouseMove wäre für alles daraufliegende zuständig. :cyclops:
Deine Methode ist bestimmt sehr gut, nur für den anfang reicht mir erstmal diese Funktion hier:

Delphi-Quellcode:
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if ((X <= 45) or (X >= 55) or (Y <= 45) or (Y >= 55)) then
  begin
    Panel1.Left:=X-50;
    Panel1.Top:=Y-50;
  end;
end;
Also Danke nochmals, Frage geklärt :hello:

MfG spawn

stahli 22. Aug 2007 12:52

Re: TObject Bewegung auf MouseMove
 
Du hast recht, die absolute Positionsermittlung ist nur für mich erforderlich, da bei mir noch weitere Komponenten beteiligt sind...

Stahli


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz