Autor |
Beitrag |
Medicide
      
Beiträge: 18
|
Verfasst: Sa 29.11.08 19:10
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
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 29.11.08 19:18
Ich nehme an das hier meinst du? Bezierkurven?
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 
      
Beiträge: 18
|
Verfasst: 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
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 18
|
Verfasst: 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
      
Beiträge: 467
Erhaltene Danke: 17
WIN 7
NQC, Basic, Delphi 2010
|
Verfasst: 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.
_________________ »Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
|
|
Medicide 
      
Beiträge: 18
|
Verfasst: 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
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Di 02.12.08 19:57
warum nicht funktioniert?
Welche Fehlermeldung?
|
|
Medicide 
      
Beiträge: 18
|
Verfasst: Di 02.12.08 20:00
also fehlermeldung kommt nur an meinem pc (der keinen drucker hat  )
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
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 18
|
Verfasst: Di 02.12.08 20:11
aso...uups
muss ich also das Printer.Enddoc; und da dann sowas wie:
Delphi-Quelltext
reinschreiben oder so?
Moderiert von Gausi: B- durch Delphi-Tags ersetzt
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 02.12.08 20:13
|
|
Medicide 
      
Beiträge: 18
|
Verfasst: 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
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 02.12.08 20:27
|
|
Medicide 
      
Beiträge: 18
|
Verfasst: Di 02.12.08 20:40
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 18
|
Verfasst: Di 02.12.08 21:45
danke....klappt jetz alles und ahbe es auch halbwegs verstanden..guck ich mir einafch nochmal an
|
|
|