Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Schrittweise Malen mit canvas


crackm - So 25.05.08 10:55
Titel: Schrittweise Malen mit canvas
Also ich habe vollgendes Problem hoffe ihr könnt mir helfen.
Zum einem benutze ich die Funktion getcursorpos() die variable in den Klammern ist vom typ tpoint soweit alles ok, aber das ergebnis welches es liefert ist oder schein zumindes vollkommen willkürlich und ich würde ausßerdem gern die position im canvas bestimmen und nicht im ganzen Fenster. Hier die Funktion die ich benutze:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.TImage(Sender: TObject);
var
pt:tpoint;
begin
getcursorpos(pt);
//Worm.move(pt.X, pt.Y); <-- bewegung 
showmessage('The cursor pos. is: x='+inttostr(pt.x)+' y='+inttostr(pt.y));
end;


mit

Delphi-Quelltext
1:
ImgWorld: TImage;                    


zum anderem habe ich lange im netz gesucht und keine wirkliche möglichkeit gefunden, wie mann den Inhalt des Canvas löscht, deshalt habe ich eine Funktion geschriebne, die ein Weißes Viereck rüberzeichnet gibt eine bessere Alternative?

Und letztendlich bezieht sich die letzte Frage auf mein größtes Problem und zwar soll eine Figur in schritten sich bewegen, also würde es für den Syntax heißen malen, löschen, malen einen schritt weiter. Aber da es ja schritte sein sollten habe ich zu der funktion sleep gegriffen, die allerding bei Werten über 100 einfach hängt.
Hier die Vorwertsbewegung:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
while x<>px do begin
        px:=px+10;
        hide();
        ahead.Draw(MyWorld, pr,px,py, pl);
        sleep(100);
        end;

Aber die schritte dabei sind nicht sichbar. Erhöht mann den Wert bei sleep tritt das oben genannte Problem ein.
x ist übrigens der Wert der position des Cursors im Canvas, wobei ich das auch schon manuell festzulegen versucht habe.
Über Ideen und vorschläge würde ich mich sehr freuen.

Moderiert von user profile iconNarses: Quote- durch Delphi-Tags ersetzt


Fiete - So 25.05.08 12:51
Titel: Re: Schrittweise Malen mit canvas
Moin crackm,

für das Objekt TImage gibt es das Ereignis OnMouseMove
z.B. TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState;X,Y: Integer);

Das Löschen eines Canvas kannst du so machen, wobei Align auf alClient gesetzt ist

Delphi-Quelltext
1:
2:
3:
Image1.Picture:=nil;
Image1.Width:=Form1.Width-8// sonst andere Werte
Image1.Height:=Form1.Height-57;


Für eine Warteschleife habe ich mir eine Delay-Funktion gebastelt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Delay(zeit:DWord);// Pausenzeit in Millisekunden
  var zeit1:DWord;
  begin
   zeit1:=GetTickCount;
   repeat Application.ProcessMessages until GetTickCount-zeit1>zeit
  end;

Gruß
Fiete


Narses - So 25.05.08 13:04
Titel: Re: Schrittweise Malen mit canvas
Moin!

Vorab: bitte stelle nur eine Frage pro Thread, da es sich gezeigt hat, dass mehrere Fragen in einem Topic für Verwirrung sorgen. :idea: Da deine Fragen sehr nah beieinander liegem und die Diskussion bereits begonnen hat, lasse ich das Topic mal offen. ;)

user profile iconcrackm hat folgendes geschrieben:
Und letztendlich bezieht sich die letzte Frage auf mein größtes Problem und zwar soll eine Figur in schritten sich bewegen,
Der Schlüssel zu einer "brauchbaren" Lösung dieses Problems heißt Suche in: Delphi-Forum, Delphi-Library TIMEBASED MOVEMENT. :idea:


user profile iconFiete hat folgendes geschrieben:
Für eine Warteschleife habe ich mir eine Delay-Funktion gebastelt:
Sieht man mal vom Un-Sinn des Wartens in ereignisorientierten Anwendungen ab :zwinker: dann solltest du besser einen "sauberen" Ansatz dafür [http://www.delphipraxis.net/post52152.html#52152] verwenden. :idea:

cu
Narses


crackm - So 25.05.08 14:33

@Narses: Danke schon mal für die Delay funktion funktioniert wunderbar.
Dennoch habe ich einige Fragen bezüglich dessen was Fiete vorgeschlagen hat, danke auch für deinen Beitrag.
Aber es scheint mir dass du mich falsch verstanden hast ich wollte nicht die Zeichenfläche löschen sondern den inhalt dieser. Die Funktion Image1.Picture:=nil; löscht aber die Zeichenfläche, dass dannach auch der inhalt weck ist ist mir schon klar aber die Zeichenfläche brauche ich noch.

Meine Frage bleibt d. h. wie löscht man den Inhalt des canvas?

Moderiert von user profile iconNarses: 2. Frage entfernt


Narses - So 25.05.08 15:13

Moin!

user profile iconcrackm hat folgendes geschrieben:
@Narses: Danke schon mal für die Delay funktion funktioniert wunderbar.
Ähm, du hast schon bemerkt, das die eigentliche Lösung für dein Problem nicht darin besteht, eine andere Warte-Funktion zu verwenden? :gruebel:

user profile iconcrackm hat folgendes geschrieben:
Meine Frage bleibt d. h. wie löscht man den Inhalt des canvas?
Schonmal in die Suche geschaut? ;) Suche in: Delphi-Forum, Delphi-Library TIMAGE L?SCHEN

cu
Narses


crackm - So 25.05.08 15:34

Yup, suchen war keine Schlechte Idee. danke habe alles gefunden.