Autor Beitrag
>spEEd>
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 62


Delphi 2005 Pers.
BeitragVerfasst: Sa 13.05.06 17:14 
Hiho!

Ich habe ein kleines Problem mit der "onMouseMove"-Prozedur. Dafür erstmal ein kleiner Überblick über mein Programm:

Was ich machen möchte ist Folgendes: Wenn man mit der linken Maustaste auf das Bild "ImageZoomen" klickt, die Maustaste gedrückt hält und die Maus nach vorne bzw. nach hinten bewegt, dann soll in meinem Programm heran- bzw. weggezoomt werden. (Es handelt sich um ein 3D-Programm in dem man Punkte, Geraden und Ebenen räumlich darstellen kann.)

Mein Ansatz hierfür sieht so aus:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type TKoordinate = record
  x, y: integer;
end;

var: MausPressed: Boolean;
Maus: TKoordinate;

(relevanter Ausschnitt aus der Kopfzeile)


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TFormTest.ImageZoomenMouseDown(Sender: TObject; Button: TMouseButton; Shift: ShiftState; X, Y: Integer);
begin
  MausPressed := true;
  Maus.x := Mouse.CursorPos.x;
  Maus.y := Mouse.CursorPos.y;
end;

Beim drücken der Maustaste auf dem Bild, wird die aktuelle Mausposition in der Variable "Maus" gespeichert. Die Variable "MausPressed" wird auf "true" gesetzt, damit die folgende Prozedur "onMouseMove" ausgeführt wird:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TFormTest.ImageZoomenMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  IF MausPressed THEN BEGIN

    VerschiebungKamera(Maus.y-Y);     // Prozedur, die die Verschiebung der Kamera durch die Mausbewegung berechnet

    Zeichnen;     // Prozedur, die die Lage der Körper im Raum berechnet und diese zeichnet

    Mouse.CursorPos := Point(round(Maus.x),round(Maus.y));
  END;
end;

Ist die Maustaste gedrückt und die Maus wird vom Benutzer bewegt, so errechnet das Programm die Verschiebung der Kamera, zeichnet die neue 3 dimensionale Umgebung und setzt danach den Mauszeiger wieder zum Anfangspunkt. Theoretisch funktionieren diese Prozeduren, allerdings habe ich das Problem, dass die Prozeduren "VerschiebungKamera" und "Zeichnen" erst ausgeführt werden, wenn die Maustaste losgelassen wird. Ich möchte allerdings, dass das Bild auch während dem zoomen aktualisiert wird, weil man sonst nicht erkennen kann, wie weit man genau gezoomt hat.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TFormTest.ImageZoomenMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  MausPressed := false;
end;

Die Variable "MausPressed" wird wieder auf "false" gesetzt, damit die "onMouseMove"-Prozedur nicht mehr ausgeführt wird.

Ich hoffe mir kann jemand bei diesem Problem helfen.

>spEEd>
DaKirsche
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 187

Win XP Pro, SuSe Linux 7.3 - 10.2, Win 2k3 Server, Win 2000, Win NT 4.0
Delphi 2006 Pro, Java, HTML, SQL, PHP, CSS
BeitragVerfasst: Sa 13.05.06 17:17 
versuche es mal mit dem Zusatz Application.Processmessages; in deiner Schleife
>spEEd> Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 62


Delphi 2005 Pers.
BeitragVerfasst: Sa 13.05.06 17:27 
Klappt einwandfrei! Vielen Dank für die schnelle Hilfe!

>spEEd>
>spEEd> Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 62


Delphi 2005 Pers.
BeitragVerfasst: Sa 13.05.06 17:52 
Ich muss meine Aussage leider wieder zurücknehmen ... wenn ich Application.ProcessMessages; mit einbaue, dann wird die Prozedur "Zeichnen" scheinbar mehrmals ausgeführt, wenn ich die Maustaste wieder loslasse. Wenn ich beispielsweise einen Punkt darstelle, der abhängig vom Zoomen seine Position verändert, dann habe ich beim Loslassen der Maustaste diesen Punkt mehrmals an unterschiedlichen Positionen auf dem Bildschirm.

Wo der Befehl Application.ProcessMessages; in der "onMouseMove"-Prozedur eingebaut wird ist von der Reihenfolge her unwichtig oder?

Edit: Fehler gefunden - hat sich erledigt!