Autor Beitrag
thorstenf01
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60

Win XP
D5 enterprise
BeitragVerfasst: So 31.08.03 11:56 
Hy!
weiß jemand zufällig wie ich den Inhalt einer Paintbox
mit dem PrintDialog ausdrucken und mit SaveDoalog abspeichern kann?
Gruß
Thorsten
schneegurke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 19

Win XP
C# (VS 2003, 2005 Express)
BeitragVerfasst: So 31.08.03 17:30 
Titel: paintbox speichern
speichern sollte so gehen, eine einfachere methode ist mir nicht bekannt:

ausblenden 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
Hält's aus hier
Beiträge: 12

Win 98
D7 Pers
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: 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?

_________________
Ciao, Sprint.
Sandra
Hält's aus hier
Beiträge: 12

Win 98
D7 Pers
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Di 04.01.05 18:19 
ausblenden 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;

_________________
Ciao, Sprint.
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: 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!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
Sandra
Hält's aus hier
Beiträge: 12

Win 98
D7 Pers
BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: 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.

ausblenden 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;

_________________
Ciao, Sprint.
Sandra
Hält's aus hier
Beiträge: 12

Win 98
D7 Pers
BeitragVerfasst: 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
ausblenden 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
Hält's aus hier
Beiträge: 12

Win 98
D7 Pers
BeitragVerfasst: 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.
ausblenden 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
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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;


ausblenden 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