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(00, 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: Stringconst APaintBox: TPaintBox);
begin

  with TBitmap.Create do
  begin
    try
      PixelFormat := pf32bit;
      Width := APaintBox.Width;
      Height := APaintBox.Height;
      Canvas.CopyRect(Rect(00, Width, Height), APaintBox.Canvas, Rect(00, 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(00, Width, Height), PaintBox1.Canvas, Rect(00, 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(00, Width, Height), PaintBox1.Canvas, Rect(00, 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, 00, PaintBox1.Width, PaintBox1.Height, PaintBox1.Canvas.Handle, 00, 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, 00, Paintbox1.width, Paintbox1.height, Paintbox1.Canvas.handle, 00, 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