Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zeichenprogramm (https://www.delphipraxis.net/166639-zeichenprogramm.html)

Mystery 22. Feb 2012 20:21

Zeichenprogramm
 
Stehe vor folgendem Problem:

Versuche ein Zeichenprogramm zu erstellen. Meine ersten Versuche waren mit Canvas.

sah ungefähr so aus:

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin

if getkeystate(VK_LBUTTON)<0 then begin
form1.Canvas.MoveTo(mouse.CursorPos.X,mouse.Cursor Pos.Y); while getasynckeystate(VK_LBUTTON)<0 do begin form1.Canvas.Pen.Color:=clred; form1.Canvas.lineto(mouse.CursorPos.X,mouse.Cursor Pos.Y); end; end;

end;

das ganze läuft auch wie ich es mir wünsche :-) nur leider wird das formular und alles gezeichnete nach einer gewissen zeit schwarz und ich muss alles neu zeichnen. Ich verstehe NICHT warum..
Das Programm läuft imm Vollbildmodus, wenn ich einmal kurz auf den Desktop gehe und das Programm danach wieder groß mache, ist das Formular wieder leer.

Popov 22. Feb 2012 21:20

AW: Zeichenprogramm
 
Die erste Frage die sich stellt ist: warum setzt du alles in FormMouseMove Prozedur? Warum nicht in die Button1Click Prozedur? Die Frage ist berechtigt, denn um X/Y auzulesen nimmst du Mouse.CursorPos und um zu prüfen ob Maustaste geklickt ist nimmst du GetKeyState. Warum? Was glaubst du wozu die Angaben in
Delphi-Quellcode:
FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer)
gut sind? Da hast Shift und X und Y. mit
Delphi-Quellcode:
if ssLeft in Shift then
findest du heraus ob Maustaste geklickt ist, X und Y sind selbsterklärend.

Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssLeft in Shift then
  begin
    //Canvas.Pen.Color := Farbe;
    Canvas.MoveTo(xAlt, yAlt);
    Canvas.LineTo(X, Y);
  end;

  xAlt := X;
  yAlt := Y;
end;
Edit:

Und was das leere Formular angeht, Canvas ist nur eine Leinwand. Alles was sich drüber legt wischt das Ergebnis weg. Dann entweder alles zusätzlich in einer Bitmap speichern und auf OnPaint des Formulars reagieren oder gleich Image Komponente nehmen.

Übrigens, die zu Delphi mitgelieferten Beispiele (im Installationsverzeichnis) enthalten ein Mallprogramm. Da mal reingucken.

Mystery 22. Feb 2012 21:29

AW: Zeichenprogramm
 
Das habe ich bewusst nicht so gemacht, da bei einer schnelleren Bewegung der Maus keine durchgängige Linie gezeichnet wird.
Der Quelltext den ich habe soll eigentlich so bleiben, auch wenn es nicht die beste Lösung ist ;)

Das Problem ist, was bei deinem Code auch nicht gelöst wird, wenn ich zum Beispiel windowstaste+ d drücke um auf den desktop zu gelangen, danach das Programm wieder öffne, ist das gezeichnete verschwunden, was nicht sein dürfte :)

und mit einem image habe ich es auch schon versucht:

Jedoch wird erst gezeichnet wenn ich die Maus wieder loslasse, was ebenfalls nicht sein soll :(

Luckie 22. Feb 2012 21:33

AW: Zeichenprogramm
 
Zitat:

Zitat von Mystery (Beitrag 1152411)
Jedoch wird erst gezeichnet wenn ich die Maus wieder loslasse, was ebenfalls nicht sein soll :(

Und genau das passiert weil du nicht auf ein Bitmap im speicher zeichnest. Der Canvas hat kein Gedächtnis.

Mystery 22. Feb 2012 21:37

AW: Zeichenprogramm
 
Wenn ich es direkt auf die form zeiche, zeichnet das Programm sofort mit, wenn ich es über image1.canvas anstatt form1.canvas mache jedoch nicht :( Böses delphi :D

Popov 22. Feb 2012 21:39

AW: Zeichenprogramm
 
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Image1.Picture.Bitmap.Width := Screen.Width;
  Image1.Picture.Bitmap.Height := Screen.Height;
  Image1.Align := alClient;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssLeft in Shift then
    Image1.Picture.Bitmap.Canvas.LineTo(X, Y);

  Image1.Picture.Bitmap.Canvas.MoveTo(X, Y);
end;
Sorry, ich habe trotzdem mit dem MouseMove Angaben gearbeitet.

Luckie 22. Feb 2012 21:41

AW: Zeichenprogramm
 
Ein Image ist ja auch nicht zum zeichnen gedacht. Wenn dann nimm eine Paintbox.

Mystery 22. Feb 2012 21:42

AW: Zeichenprogramm
 
du bist ein GOTT !! Danke vielmals !!!!!

kann deinen beitrag leider nicht liken ;) aber danke Popov :-*

himitsu 22. Feb 2012 22:30

AW: Zeichenprogramm
 
Etwas, daß ich irgendwie jeden fragen muß.
Warum greifst du auf die globale Variable form1 zu?

Mystery 22. Feb 2012 22:42

AW: Zeichenprogramm
 
bin anfänger und mag form1 einfach so gern (:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:32 Uhr.
Seite 1 von 2  1 2      

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