Entwickler-Ecke
Sonstiges (Delphi) - Paintbox drucken und speichern
thorstenf01 - So 31.08.03 11:56
Titel: Paintbox drucken und speichern
Hy!
weiß jemand zufällig wie ich den Inhalt einer Paintbox
mit dem PrintDialog ausdrucken und mit SaveDoalog abspeichern kann?
Gruß
Thorsten
schneegurke - So 31.08.03 17:30
Titel: paintbox speichern
speichern sollte so gehen, eine einfachere methode ist mir nicht bekannt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var Bmp: TBitmap; begin if SaveDialog1.Execute then begin Bmp := TBitmap.Create; Bmp.Width := PaintBox1.Width; Bmp.Height := PaintBox1.Height; Bmp.Canvas.Draw(0, 0, PaintBox1.Canvas); Bmp.SaveToFile(SaveDialog1.Filename); Bmp.Free; end; end; |
gruss
mark
Sandra - Di 04.01.05 01:44
Habe das so probiert und bekomme dabei die Fehlermeldung:
Inkompatible Typen: 'TGraphic' und 'TCanvas'
woran liegt das?
liebe grüße
sandra
Sprint - Di 04.01.05 02:03
Sandra hat folgendes geschrieben: |
Habe das so probiert und bekomme dabei die Fehlermeldung: |
Was willst du denn? TPaintBox/TBitmap speichern/drucken?
Sandra - Di 04.01.05 10:55
Ich habe versucht die Paintbox zu speichern undzu dieser Zeile die Fehlermeldung
Bmp.Canvas.Draw(0, 0, PaintBox1.Canvas);
Sprint - Di 04.01.05 18:19
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure SavePaintBoxToFile(const FileName: String; const APaintBox: TPaintBox); begin
with TBitmap.Create do begin try PixelFormat := pf32bit; Width := APaintBox.Width; Height := APaintBox.Height; Canvas.CopyRect(Rect(0, 0, Width, Height), APaintBox.Canvas, Rect(0, 0, APaintBox.Width, APaintBox.Height)); SaveToFile(FileName); finally Free; end; end;
end; |
wulfskin - Di 04.01.05 19:23
Oder benutz einfach BitBlt und kopiere dann direkt auf den Canvas des Bildes. Zum "einfachen Drucken" einfach auf die Leinwand Printer.Canvas kopieren, allerdings musst du schon die Größe der Auflösung des Druckers anpassen.
GRuß Hape!
Sandra - Mi 05.01.05 13:07
Sprint, danke für deinen Code.
Ich will ja wirklich nicht nerven und er Code an sich funktioniert ja auch, aber ich habe Probleme, wenn ich Ihn mit einem Buttonclick verbinden will. Da es nicht direkt funltioniert, muss ich es über eine Buttonclick Procedure machen, aber dann bekomme ich die Fehlermeldung, dass nicht genügend wirkliche Parameter vorhanden sind.
Oder aber das Programm startet und stürzt dann beim klicken auf den speicher button ab und markiert dann die zeile 11: SaveToFile(FileName);
woran liegt das? außer dass ich wahrscheinlich zu doof dafür bin.
Habe es mittlerweile auch geschafft mit einem SaveDialog ein Bitmap zu speichern, aber dieses hat keinen Inhalt, weil bei mir eben
Delphi-Quelltext
1:
| Bitmap.Canvas.Draw(0,0,Paintbox1); |
eine Fehlermeldung verursacht. Wie kann ich dies umgehen, also den Inhalat der Paintbox auf das Bitmap übertragen ohne eine Fehlermeldung zu haben?
Das sollte doch dann mit dem Code von Sprint gehen, oder? Bräuchte man dazu dann keinen Savedialog?
Sprint - Mi 05.01.05 14:34
Sandra hat folgendes geschrieben: |
Bräuchte man dazu dann keinen Savedialog? |
Wenn du vorher weißt wo die Datei gespeichert werden soll, dann brauchst du kein TSaveDialog.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Button1Click(Sender: TObject); begin
if SaveDialog1.Execute then with TBitmap.Create do try PixelFormat := pf32bit; Width := PaintBox1.Width; Height := PaintBox1.Height; Canvas.CopyRect(Rect(0, 0, Width, Height), PaintBox1.Canvas, Rect(0, 0, PaintBox1.Width, PaintBox1.Height)); SaveToFile(SaveDialog1.FileName); finally Free; end;
end; |
Sandra - Mi 05.01.05 15:07
danke, jetzt klappt das speichern :)
alerdings auch nicht so richtig.
habe jetzt zwar einbild mit der größe der paintbox und inhalt, allerdings ist dieser inhalt nicht der der paintbox.
die oberen 3/4 es bildes haben die selbe farbe, wie der hintergrund meines formulars und das untere viertel die hintergrundfarbe der paintbox. zuerst habe ich gedacht, dass vielleicht ein anderes rechteck dieser größe vom formular des programms gespeichert wird, allerdings kann das auch nicht sein, weil diese aufteilung nirgendwo so vorkommt.
es wird ja auch mit
Delphi-Quelltext
1:
| Canvas.CopyRect(Rect(0, 0, Width, Height), PaintBox1.Canvas, Rect(0, 0, PaintBox1.Width, PaintBox1.Height)); |
das rechteck gezeichnet und eigentlich müsste es ja auch den inhalt der paintbox haben, aber wieso funktioniert es immer noch nicht richtig?
Sandra - Do 06.01.05 15:36
Vielen Danke für euere Hilfe!!!
Habe jetzt eine Variante gefunden, die funktioniert, wollte sie nur kurz posten, falls noch jemand dieses Problem einmal haben sollte.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure Speichern(Sender: TObject); begin Bild:=TBitmap.Create; Bild.Height:=PaintBox1.Height; Bild.Width:=Paintbox1.Width; BitBlt(Bild.Canvas.Handle, 0, 0, PaintBox1.Width, PaintBox1.Height, PaintBox1.Canvas.Handle, 0, 0, SRCCOPY); if SaveDialog1.Execute then Bild.Savetofile(SaveDialog1.Filename) else exit; end; |
Luna - Di 21.03.06 21:13
Hallo Leute,
die Frage zum Drucken der Paintbox hätte ich auch. Das was ich bisher gelesen habe, beschäftigt sich ja eher mit dem Speichern.
Ich habe zwar eine Lösung, die auch so weit funktioniert, allerdings wird sehr schwach gedruckt (also eher grau statt schwarz). Der Quellcode für diese Lösung ist:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TFraktale.druckenClick(Sender: TObject); var x,y:integer; begin if PrintDialog1.Execute then begin Printer.Title := Lbueberschrift.Caption; Printer.BeginDoc; for x:=0 to Paintbox1.Height-1 do for y:=0 to Paintbox1.Width-1 do Printer.Canvas.Pixels[5*x,5*y]:=Paintbox1.Canvas.Pixels[x,y]; Printer.EndDoc; end; end; |
Andere Algorithmen habe ich auch schon ausprobiert, aber entweder wird gar nichts gedruckt oder es gibt die übliche Fehlermeldung
Inkompatible Typen: 'TGraphic' und 'TCanvas'
diese Quellcodes wären:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TFraktale.druckenClick(Sender: TObject); var x,y: integer; graphic: TGraphic; begin if PrintDialog1.Execute then begin Printer.Title := Lbueberschrift.Caption; Printer.BeginDoc; BitBlt(Printer.Canvas.handle, 0, 0, Paintbox1.width, Paintbox1.height, Paintbox1.Canvas.handle, 0, 0, srccopy); Printer.EndDoc; end; end; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TFraktale.druckenClick(Sender: TObject); var x,y: integer; graphic: TGraphic; begin if PrintDialog1.Execute then begin Printer.Title := Lbueberschrift.Caption; Printer.BeginDoc; Printer.Canvas.draw(0,0,Paintbox1.Canvas); Printer.EndDoc; end; end; |
Hat jemand vielleicht noch eine andere Lösung für mich? Ich bin echt am Ende mit meinem Latein.
Luna
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!