Problem bei Drucken und bei Bild exportieren

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
cletep
Beiträge: 18
Registriert: Fr 23. Aug 2013, 08:19

Problem bei Drucken und bei Bild exportieren

Beitrag von cletep »

Hallo,

ich versuche nicht zu spamen, aber ich stehe schon wieder auf dem Schlauch..

Ich habe folgende Druck-Routine, die funktioniert hat, bis ich windows zu uses hinzugefügt habe:

Code: Alles auswählen

procedure TFormAuswertung.BtnDruckenClick(Sender: TObject);
var
  Seite: TBitmap;
begin
  if not PrintDialog1.Execute then
    exit;
  Seite := FormAuswertung.GetFormImage;
  Printer.BeginDoc;
  Printer.Canvas.StretchDraw(Rect(0, 0, Printer.PageWidth, Printer.PageHeight), Seite);
  printer.EndDoc;
  Seite.FreeImage;
end;      
Beim Kompilieren kommt die Fehlermeldung: Incompatible types: Got TBitmap expected BITMAP.

Wie kann ich diesen Fehler beheben?

Außerdem funktioniert folgende Prozedur auch nicht. Es wird zwar eine Bilddatei gespeichert, aber die kann man nicht öffnen, da das Format nicht unterstützt wird.

Code: Alles auswählen

procedure TFormAuswertung.MenuItemSpeichernClick(Sender: TObject);
var
  Bild: TGraphic;
   Bilddatei: file of TGraphic;
begin
  Bild:= FormAuswertung.GetFormImage;
  SavePictureDialog1.FileName:='Notenübersicht_' + aktstudent.vorname + '_' + aktstudent.nachname+'.bmp';
    if not SavePictureDialog1.Execute then exit;
    assignfile(Bilddatei,SavePictureDialog1.FileName);
    rewrite(Bilddatei);
    write(Bilddatei,Bild);
    Closefile(Bilddatei);
end;                        
Bin über jede Hilfe dankbar.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Problem bei Drucken und bei Bild exportieren

Beitrag von Michl »

Wenn es zuvor funktioniert hat, dann müsstest du schauen, welche Methoden jetzt neu von der Unit "Windows" bereitgestellt/überschrieben werden. Diese müsstest du dann entsprechend aus den Originalunits beziehen.

Also einfach mal Unit Windows wieder weg, mit der Maus auf den Bezeichner gehen und warten, dann wird angezeigt, woher dieser bezogen wird (Alternativ mit Strg + MausLinksKlick, springt in den Quelltext).

Somit müsstest du deine erste Procedure wie folgt ändern:

Code: Alles auswählen

procedure TFormAuswertung.BtnDruckenClick(Sender: TObject);
var
  Seite: Graphics.TBitmap;          //Unit Graphics
begin
  if not PrintDialog1.Execute then
    exit;
  Seite := FormAuswertung.GetFormImage;
  Printer.BeginDoc;
  Printer.Canvas.StretchDraw(Classes.Rect(0, 0, Printer.PageWidth, Printer.PageHeight), Seite);  //Rect zu Classes.Rect ändern
  printer.EndDoc;
  Seite.FreeImage;
end; 
2. Procedure analog

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: Problem bei Drucken und bei Bild exportieren

Beitrag von wp_xyz »

Leider kommt "TBitmap" sowohl in Graphics als auch in Windows vor. Warum man sich damals bei Borland für Delphi dafür entschieden hat, ist mir schleierhaft.

In der Regel brauchst du TBitmap aus der Unit Graphics. Eine Alternative, bei der Verwendung des TBitmap "Graphics" voranzustellen, ist, die Uses-Sequenz so aufzubauen, dass "Windows" vor "Graphics" steht, dann wird automatisch Graphics genommen. Also:
 

Code: Alles auswählen

 
uses
  ..., Windows, ... , Graphics, ...
 

cletep
Beiträge: 18
Registriert: Fr 23. Aug 2013, 08:19

Re: Problem bei Drucken und bei Bild exportieren

Beitrag von cletep »

Danke für die Antworten. Die Drucken Routine funktioniert nun Einwandfrei.

Die Speichern Routine funktioniert allerdings generell nicht. Egal, ob windows in den uses steht. Ich glaube, da ist irgendwie ein Fehler bei der Dateiendung oder so? oder liegt es daran, dass ich quasi file of bitmap speichere anstatt einer einfachen Bitmap?

Oder kann es sein, dass ich dafür evtl. alle Bitmaps in der Speichern-Prozedur als die "windows-Bitmapversion" deklarieren muss? Wenn ja, gibt es eine Möglichkeit, die Versionen in einander umzuwandeln?

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Problem bei Drucken und bei Bild exportieren

Beitrag von Michl »

Du kannst die von der TGraphic bereitgestellte Methode zum Grafikspeichern nutzen:

Code: Alles auswählen

procedure TFormAuswertung.MenuItemSpeichernClick(Sender: TObject);
var
  Bild: TGraphic;
begin
  Bild:= FormAuswertung.GetFormImage;
  SavePictureDialog1.FileName:='Notenübersicht_' + aktstudent.vorname + '_' + aktstudent.nachname+'.bmp';
  if SavePictureDialog1.Execute then
    Bild.SaveToFile(SavePictureDialog1.FileName); 
  Bild.Free;
end;
Zuletzt geändert von Michl am Fr 23. Aug 2013, 21:06, insgesamt 1-mal geändert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

cletep
Beiträge: 18
Registriert: Fr 23. Aug 2013, 08:19

Re: Problem bei Drucken und bei Bild exportieren

Beitrag von cletep »

Wenn ich deinen Quellcode implementiere, erhalte ich eine komplett schwarze Bitmap (aber immerhin kann man sie öffnen ;) ). Fehlt evtl eine Zeile, die die Bitmap in eine Graphic umwandelt oder sind die beiden so kompatibel?

Oder kann es damit zu tun haben, dass ich bei uses windows jetzt vor graphics eingefügt habt?

Habe gerade gesehen, dass du noch Bild.free hinzugefügt hast. Leider nutzt dies auch nichts. Hat irgendjemand woran es liegen könnte? Wenn ich GetFormImage beim Drucken benutzer, klappt's doch auch..

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Problem bei Drucken und bei Bild exportieren

Beitrag von Michl »

Weiss jetzt nicht, warum GetFormImage nicht funktioniert, habe aber mal kurz getestet und die Möglichkeit gefunden:

Code: Alles auswählen

procedure TFormAuswertung.MenuItemSpeichernClick(Sender: TObject);
var
  Bitmap: TBitmap;
  r:TRect;
begin
  Bitmap:= TBitmap.Create;
  Bitmap.Width:= FormAuswertung.Width;
  Bitmap.Height:= FormAuswertung.Height;
  r:= Rect(0, 0, FormAuswertung.Width, FormAuswertung.Height);
  Bitmap.Canvas.CopyRect(r, FormAuswertung.Canvas, r);
  SavePictureDialog1.FileName:='Notenübersicht_' + aktstudent.vorname + '_' + aktstudent.nachname+'.bmp';
  if SavePictureDialog1.Execute then
    Bitmap.SaveToFile(SavePictureDialog1.FileName);
  Bitmap.Free;
end; 

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: Problem bei Drucken und bei Bild exportieren

Beitrag von wp_xyz »

Und bei Michls Lösung brauchst du auch die Windows-Unit nicht mehr, d.h. das Programm läuft auch unter Linux.

cletep
Beiträge: 18
Registriert: Fr 23. Aug 2013, 08:19

Re: Problem bei Drucken und bei Bild exportieren

Beitrag von cletep »

Vielen Dank für die Hilfe. Jetzt funktioniert's fast perfekt. Allerdings habe ich, wenn ich das Bild speichere unten einen schwarzen Rand, der in etwa so groß ist, wie mein MainMenu oben auf dem Formular, was ja nicht mit abgebildet wird. Wie kann ich den wegschneiden?

Und könntest du die Prozedur kurz erklären/kommentieren? Habe mit TRect und CopyRect noch nicht wirklich gearbeitet.

@wp_xyz: Die Windows Unit benutze ich hierfür:

Code: Alles auswählen

procedure TFormAuswertung.MenuItemBedienungsanleitungClick(Sender: TObject);
begin
  ShellExecute(Handle, 'Open', 'Bedienungsanleitung.pdf', nil, nil, SW_SHOW);
end; 

wp_xyz
Beiträge: 5153
Registriert: Fr 8. Apr 2011, 09:01

Re: Problem bei Drucken und bei Bild exportieren

Beitrag von wp_xyz »

Allerdings habe ich, wenn ich das Bild speichere unten einen schwarzen Rand, der in etwa so groß ist, wie mein MainMenu oben auf dem Formular, was ja nicht mit abgebildet wird.
Kopiere nur den Clientbereich des Fensters in das Bitmap:

Code: Alles auswählen

 
  Bitmap.Width:= FormAuswertung.ClientWidth;
  Bitmap.Height:= FormAuswertung.ClientHeight;
  r:= Rect(0, 0, FormAuswertung.ClientWidth, FormAuswertung.ClientHeight);
 
Übrigens: wenn du diesen Code von TFormAuswertung aus aufrufst, dann ist es besser, "FormAuswertung" wegzulassen. So funktioniert der Code für jedes Fenster, nicht nur, wenn es FormAuswertung heißt. Also:

Code: Alles auswählen

 
procedure TFormAuswertung.MenuItemSpeichernClick(Sender: TObject);
var
  Bitmap: TBitmap;
  r:TRect;
begin
  Bitmap:= TBitmap.Create;
  Bitmap.Width:= ClientWidth;
  Bitmap.Height:= ClientHeight;
  r:= Rect(0, 0, ClientWidth, ClientHeight);
  Bitmap.Canvas.CopyRect(r, Canvas, r);
 
CopyRect kopiert den als 2. Parameter angegebenen Canvas (der des Formulars) in den Canvas des Bitmap. Das 1. Rechteck ist das Zielrechteck im Bitmap, das letzte R das Quellrechteck im Formular.

Ich weiß, das ist nicht dein Thema, aber Infos zum plattformunabhängigen Ersatz von ShellExecute findest du unter http://wiki.freepascal.org/Executing_Ex ... rograms/de.

cletep
Beiträge: 18
Registriert: Fr 23. Aug 2013, 08:19

Re: Problem bei Drucken und bei Bild exportieren

Beitrag von cletep »

Vielen Dank euch beiden. Jetzt funktioniert das Speichern der Bitmap endlich auch wie es soll.

Den Link zum plattformunabhängigen Programmieren werde ich bei Gelegenheit mal lesen/überfliegen. Dann kann ich mein Programm vlt auch auf meinem Mac benutzen. ;)

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: Problem bei Drucken und bei Bild exportieren

Beitrag von creed steiger »

opendocument wäre ein plattformunabhängiger Ersatz.

http://wiki.freepascal.org/Executing_Ex ... pplication

Antworten