Entwickler-Ecke
Sonstiges (Delphi) - Problem mit Paint - Programm
Medicide - Sa 29.11.08 19:10
Titel: Problem mit Paint - Programm
hey, leute
ich habe da so ein problem
wir sollen für die schule in informatik ein kleines minipaint programieren. So ich habe bereits die farbpalette, radieren, freihandzeichnen, löschen, die dicke des stifts, speichern und öffnen einprogramiert . Dies reicht aber noch nciht ganz, ich würde gerne noch quadrate zeiehn können, kreise, ellipsen und so aber ich weiß dass es sehr schwer sien soll. Deswegen was einfacheres was ich leider iwie nciht hinbekomme:
ich möchte gerne eine gummilinie (s heißt das, habe ich gelesen) zeichen können. Was ich damit meine ist, das programm soll sich den punkt (X,Y) merken an dem ich die linke maustaste drücke, von da an soll er eine gerade linie zeichnen aber nur so weit ich die maus bewege und gedrückt habe. Wenn ich die maustatse loslasse soll die linie von dem anfangspunkt bis hin zu dem punkt an dem ich die maustaste losgelassen habe gezeichnet werden.
Hoffe ihr könnt mir helfen
Gruß daniel
jaenicke - Sa 29.11.08 19:18
Ich nehme an das hier meinst du? Bezierkurven?
http://www.delphipraxis.net/topic99285.html
Oder willst du einfach nur eine gerade Linie ziehen? Da wüsste ich jetzt nicht was du mit Gummilinie meinst.
Medicide - Sa 29.11.08 19:23
ich möchte einfach nur eine gerade linie zeichnen...natürlich aber mit der maus gezogen
den begriff "gummilinie" habe ich gefunden als ich mal gegooglet habe..aber dies nicht verstanden habe
eine einfach gerade linie soll es sein
jaenicke - Sa 29.11.08 19:34
Dann musst du nur in OnMouseDown die Koordinaten x und y als Zeichenposition setzen.
In OnMouseUp kannst du dann eine Linie von den gespeicherten Koordinaten zu den aktuellen machen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm86.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Canvas.MoveTo(X, Y); end;
procedure TForm86.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin Canvas.LineTo(X, Y); end; |
Zusätzlich könntest du auch in OnMouseMove die Linie wie sie beim Loslassen gezeichnet
würde zeichnen, aber erstmal reicht es ja beim Loslassen zu zeichnen. Um beim Ziehen die aktuelle Linie zu zeichnen müsstest du in OnMouseDown eine Boolean-Variable auf True setzen, die dir anzeigt, dass die Maustaste gedrückt ist, dazu die Koordinaten. In OnMouseMove kannst du dann wenn die Maustaste gedrückt ist die alte Linie löschen und die neue zeichnen. Dafür musst du auch die letzten Koordinaten von OnMouseMove speichern.
Medicide - Sa 29.11.08 19:45
vielen dank schonmal dafür...
aber das andee versteh ich gard nicht: du meinst dass mann die linie sieht wenn man die maus gedrückt bewegt ne?
ok das wäre gut wenn ich dass dann noch machen würde...probier gleich mal aus
der organist - Sa 29.11.08 21:41
und was deine Kreise und Rechtecke angeht, kannst du genauso per OnMouseDown und OnMouseUp die Koordinaten speichern und dann den Kreis oder Rechteck mit Canvas.Ellipse oder Canvas.Rectangle zeichnen.
Medicide - Di 02.12.08 19:56
hey
dankeschön
ich hätte da noch ne bitte
ich möchte jetzt auch noch das, was ich in meinem image gemalt habe drucken
ich habe das mal so ausgetestet:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.PrintClick(Sender: TObject); begin If printdialog1.Execute then TRY Printer.BeginDoc; Printer.Enddoc; Printer.Newpage; EXCEPT showmessage ('Fehler beim Drucken der Datei!'); End; end; |
hat aber nciht wirklich funktioniert...könnt ihr mir da helfen?
Moderiert von
Gausi: B- durch Delphi-Tags ersetzt
Boldar - Di 02.12.08 19:57
warum nicht funktioniert?
Welche Fehlermeldung?
Medicide - Di 02.12.08 20:00
also fehlermeldung kommt nur an meinem pc (der keinen drucker hat :-P)
habe des aber dann an einem anderen pc (wo ein drucker angeschlossen ist und aug eig funktioniert)....doch da hat der dann einfach cniht gedruckt
es kam dann die meldung die angezeigt werden sollte ( habe ich ja selbst einprogrammiert:
Fehler beim Drucken der Datei!
jaenicke - Di 02.12.08 20:07
Naja, schau mal was du machst:
1. BeginDoc --> "Heft" aufschlagen zum Schreiben
2. EndDoc --> Heft zumachen und zum Drucken abgeben
3. NewPage... öhm, neue Seite? Von was? Das Heft (Dokument) ist doch schon abgeschickt und geschlossen.
Zwischen BeginDoc und EndDoc solltest du auch was zu Druckendes dem Druckdokument hinzufügen, dass sonst nix passiert ist irgendwie klar.
Du gehst zur Druckerei und sagst: "Druck mal folgendes, ich fange an... (Schweigen) ...ja, das war alles" ;-)
Medicide - Di 02.12.08 20:11
aso...uups
muss ich also das
Printer.Enddoc; und da dann sowas wie:
reinschreiben oder so?
Moderiert von
Gausi: B- durch Delphi-Tags ersetzt
Medicide - Di 02.12.08 20:25
thx
aber
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.PrintClick(Sender: TObject); Var Rect:TRect; Begin Printer.BeginDoc; With Printer.Canvas Do Rect:=Bounds(0,0,Printer.PageWidth div 2, Printer.PageHeight div 2); StretchDraw(Rect, Image1.Picture.Bitmap); End; Printer.Enddoc; End; |
kennt der nciht : [Fehler] paint.pas(134): Undefinierter Bezeichner: 'StretchDraw'
Moderiert von
Gausi: B- durch Highlight-Tags ersetzt
Moderiert von
Gausi: Delphi-Tags hinzugefügt
jaenicke - Di 02.12.08 20:27
:shock: , ich hatte mir den Code nicht genauer angeschaut, da haben die doch glatt ein begin vergessen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TForm1.PrintClick(Sender: TObject); Var Rect:TRect; Begin Printer.BeginDoc; With Printer.Canvas Do begin Rect:=Bounds(0,0,Printer.PageWidth div 2, Printer.PageHeight div 2); StretchDraw(Rect, Image1.Picture.Bitmap); end; Printer.Enddoc; End; |
Medicide - Di 02.12.08 20:40
ich bedanke mch schonmal für dein bemühen
aber könntest du mir die fettgedruckten sachen mal erklären also was das programm da jetzt genau machtund so halt...wäre super nett:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.PrintClick(Sender: TObject); Var Rect:TRect; Begin printdialog1.Execute; Printer.BeginDoc; With Printer.Canvas Do begin Try Rect:=Bounds(0,0,Printer.PageWidth div 2, Printer.PageHeight div 2); StretchDraw(Rect, Image1.Picture.Bitmap); Except showmessage ('Fehler beim Drucken der Datei!'); End; Printer.Enddoc; end; |
Moderiert von
Gausi: B- durch Highlight-Tags ersetzt
Moderiert von
Gausi: Delphi-Tags hinzugefügt
jaenicke - Di 02.12.08 20:52
Rect ist ein Rechteck, in diesem Fall gibt es an in welchen Bereich gedruckt werden soll. StretchDraw zeichnet das angegebene Bild auf die Leinwand, in diesem Fall auf die des Druckers und passt die Größe dabei an das angegebene Rechteck an.
Was soll das try..except denn dauernd? Wenn überhaupt tritt ein Fehler (kein Drucker installiert) nicht an der Stelle auf, zudem sollte man try..except nur im Notfall verwenden, wenn es anders eben nicht geht. Hier kannst du aber einfach mit Printer.Printers.Count die Anzahl der installierten Drucker am Anfang abfragen und ggf. einen Fehler anzeigen, wenn die Anzahl 0 ist.
Das with sorgt dafür, dass man Befehle aus dem angegebenen Objekt benutzen kann ohne es erneut hinzuschreiben, aber das ist ohnehin kein guter Programmierstil.
So sieht es anders geschrieben aus, statt Bounds zu benutzen kann man die Grenzen des Rechtecks auch einzeln zuweisen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var Rect: TRect; Begin if Printer.Printers.Count = 0 then ShowMessage('Kein Drucker installiert!'); if not PrintDialog1.Execute then Exit; Printer.BeginDoc; Rect.Left := 0; Rect.Top := 0; Rect.Right := Printer.PageWidth div 2; Rect.Bottom := Printer.PageHeight div 2; Printer.Canvas.StretchDraw(Rect, Image1.Picture.Bitmap); Printer.Enddoc; |
F1 drücken, wenn der Textcursor in einem Befehl ist, ist auch eine Idee, die Hilfe von Delphi ist gar nicht so schlecht. ;-)
Medicide - Di 02.12.08 21:45
danke....klappt jetz alles und ahbe es auch halbwegs verstanden..guck ich mir einafch nochmal an
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!