AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TObject Bewegung auf MouseMove

Ein Thema von mleyen · begonnen am 22. Aug 2007 · letzter Beitrag vom 22. Aug 2007
Antwort Antwort
Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#1

TObject Bewegung auf MouseMove

  Alt 22. Aug 2007, 10:14
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*

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!*

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

MfG spawn

Edit: Ja die Suchfunktion hab ich schon ausgiebig durchstöbert...
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: TObject Bewegung auf MouseMove

  Alt 22. Aug 2007, 10:43
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)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#3

Re: TObject Bewegung auf MouseMove

  Alt 22. Aug 2007, 10:48
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.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: TObject Bewegung auf MouseMove

  Alt 22. Aug 2007, 11:57
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
  Mit Zitat antworten Zitat
Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#5

Re: TObject Bewegung auf MouseMove

  Alt 22. Aug 2007, 12:32
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.
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

MfG spawn
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: TObject Bewegung auf MouseMove

  Alt 22. Aug 2007, 12:52
Du hast recht, die absolute Positionsermittlung ist nur für mich erforderlich, da bei mir noch weitere Komponenten beteiligt sind...

Stahli
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:38 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