canvas.draw in Schleife

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

canvas.draw in Schleife

Beitrag von felix96 »

Dieser Code sollte eigentlich eine Blaue Kugel zu dem Punkt auf den man gecklikt hat über ein Image bewegen, es gibt auch keine Fehler, aber es funktionirt nicht :cry:
wisst ihr warum?

Code: Alles auswählen

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin     
ap.x:=0;   ap.y:=0;
  with image1 do
   begin
   for i:=ap.x to x do begin canvas.Draw(ap.x,ap.y,kugel); sleep(20); end;
 
   for i:=ap.y to y do begin canvas.Draw(ap.x,ap.y,kugel); sleep(20); end;
 
   end;
end;
Zuletzt geändert von felix96 am Do 15. Apr 2010, 21:45, insgesamt 1-mal geändert.
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

martin_frb
Beiträge: 586
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: canvas.draw in Schleife

Beitrag von martin_frb »

Ja.

Du veränderst zwar das Image im Speicher, allerdings erfolgt die Ausgabe auf den Bildschirm erst, wenn deine schleife vorüber ist, und die Message-Loop deiner Anwendung wieder Kontrolle hat (weil die MessageLoop den Code für die Bildschirmausgabe aufruft).

Du kanns
Application.ProcessMessages for jedem "sleep" einfügen. Das ruft dann auch die MessageLoop auf.

Aber Achtung:
Wenn der Benutzer zweimal klickt, dann gibt es auch 2 mal MouseUp. Das 2te Mouse-up wird dann während ProcessMessages verarbeitet.
=> Das bedeutet, das Image1MouseUp ein zweites Mal aufgerufen wird, während es noch im ersten Durchlauf ist....


Besser als eine Schleife mit Sleep, wäre ein Timer, der regelmäßig deine Methode aufruft. Dann must du natuerlich die letzten Koordinaten im Object, und nicht lokal speichern.

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: canvas.draw in Schleife

Beitrag von felix96 »

Mit Aplication.possesmessages funktionirt es auch nicht, nicht mal zum schluss sieht man einen Punkt.
Es erscheint einfach nichts , so als hätte man ncht geklickt:cry:
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: canvas.draw in Schleife

Beitrag von Scotty »

Du zeichnest auf den Canvas des Image. Solange das Bild selbst nicht gezeichnet wird, siehst du gar nichts.
Vielleicht willst du auch über ein TShape mit dem Style stCircle nachdenken.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: canvas.draw in Schleife

Beitrag von pluto »

20 ms ist so gut wie nichts, erhöhe den Wert mal auf 40 oder 60. Wenn du bei diesem Ansatz bleiben möchtest. Bessere wäre wie schon erwähnt ein TImage zu nehmen oder einfach OnMouseDown. Das ins OnMouseUp zu packen ist sehr ungewöhnlich.
MFG
Michael Springwald

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: canvas.draw in Schleife

Beitrag von felix96 »

Scotty hat geschrieben:Du zeichnest auf den Canvas des Image. Solange das Bild selbst nicht gezeichnet wird, siehst du gar nichts.
Wie habe ich dass zu verstehen?
soll ich nach dem Aufruf image1.refresh aufrufen?
Und wenn ich´s ins OnMouseDown schreibe, passiert genau das gleiche: nix. :cry:
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: canvas.draw in Schleife

Beitrag von Scotty »

Wenn Image1 ein TImage ist, das Du auf dem Hauptforumlar liegen hast, dann sollte ein Image1.Repaint; helfen.

felix96
Beiträge: 287
Registriert: So 29. Nov 2009, 17:44
CPU-Target: 32BitWin+64bitUbunt

Re: canvas.draw in Schleife

Beitrag von felix96 »

Danke :-)
Danke schonmal für eure Antworten
it´s not a bug, it´s a feature!

Antworten