Drucken in Win7

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
CPU-Quaeler
Beiträge: 36
Registriert: So 17. Aug 2008, 00:04

Drucken in Win7

Beitrag von CPU-Quaeler »

Hallo Leute!

Ich wollte heute für ein Programm einfache Druckmöglichkeiten umsetzen, aber Pustekuchen. Ich habe Win7x64 und Lazarus 0.9.28 x86. Als Drucker habe ich den PDF-Creator 0.9.9 installiert und als Standard-Drucker festgelegt. Doch sobald ich versuche was auszudrucken, bekomme ich eine AV, egal welchen Weg ich einschlage. Alles, was in sämtlichen Beispielen funktioniert, geht bei mir einfach nicht...könnte mir die Haare...Auch wenn ich nur sage Printer.index:=-1; (Was angeblich den Standard-Drucker auswählen soll), bekomme ich schon eine AV.

Und nun die Frage aller Fragen: Bin ich einfach nur zu blöd, oder muss man in Win7 etwas anders machen???

Wens interessiert, auf diese beiden Weisen hab ichs probiert:
1.:

Code: Alles auswählen

procedure blablabla;
var
   Datei:Textfile;
   s,oldfont:string;
   i:dword;
  begin
    printer.index:=-1;
    printer.BeginDoc;
    oldFont := Printer.Canvas.Font.Name;
    Printer.Canvas.Font.Name := 'Courier New';
    printer.Canvas.Font.Height:=10;
    i:=0;
    try
      with StringGrid1 do begin
        printer.BeginDoc;
        s:=Format('%-30s %-25s %-5s %-30s %-12s %-7s %-7s %-30s',[Cells[0,0], Cells[1,0], Cells[2,0], Cells[3,0], Cells[4,0], Cells[5,0], Cells[6,0], Cells[7,0]]);
        printer.Canvas.TextOut(0,i*20+20,s);
        s:=Format('%-80s', ['---------------------------------------------------------']);
        for i := 1 to RowCount - 1 do begin
          s:=Format('%-30s %-25s %-5s %-30s %-12s %-7s %-7s %-30s',[Cells[0,i], Cells[1,i], Cells[2,i], Cells[3,i], Cells[4,i], Cells[5,i], Cells[6,i], Cells[7,i]]);
          printer.Canvas.TextOut(0,i*20,s);
        end
      end;
      printer.EndDoc;
    finally
      Printer.Canvas.Font.Name := oldFont;
    end;
  end;
2.:

Code: Alles auswählen

procedure blablabla;
 var
   w,v : TSize;
   OUTDC : HDC;
   zeile : Integer;
   s   : string;
   groesse,i:longInt;
 const
   maxZeilen  = 60;   // Zeilen pro Seite
   textHoehe  = 40;   // 4 mm
   linkerRand = 200;  // 20 mm
  begin
    Printer.BeginDoc;
    outDC := Printer.Canvas.Handle;
    SetMapMode(OutDC,mm_lometric);    
    GetWindowExtEx(OutDC,w);           
    GetViewportExtEx(OutDC,v);
    SetMapMode(OutDC,MM_ANISOTROPIC);       
    SetWindowExtEX(OutDC,w.cx,w.cy,nil);      
    SetViewPortExtEx(OutDC,v.cx,-v.cy,nil);
 
    Printer.Canvas.Font.Name := 'Courier New';
    Printer.Canvas.Brush.Color := clWhite;   // Hintergrundfarbe
    Printer.Canvas.Font.Height:= textHoehe;
    zeile := 0;
    groesse:=STringgrid1.RowCount;
    while i<groesse do begin
      Inc(zeile,1);
      if zeile = maxZeilen then begin
        zeile := 0;
        Printer.NewPage
      end;
      if zeile = 0 then begin        
        Printer.Canvas.Font.Style := [fsBold];
        Printer.Canvas.TextOut(linkerRand,0,'Seite: ' + IntToStr(Printer.PageNumber));
        inc(Zeile);
        with stringgrid1 do begin
          s:=Format('%-30s %-25s %-5s %-30s %-12s %-7s %-7s %-30s',[Cells[0,0], Cells[1,0], Cells[2,0], Cells[3,0], Cells[4,0], Cells[5,0], Cells[6,0], Cells[7,0]]);
        end;
        Printer.Canvas.TextOut(linkerRand, zeile * (textHoehe + 3), s);
        Printer.Canvas.Font.Style := []
      end;
      with stringgrid1 do begin
        s:=Format('%-30s %-25s %-5s %-30s %-12s %-7s %-7s %-30s',[Cells[0,i], Cells[1,i], Cells[2,i], Cells[3,i], Cells[4,i], Cells[5,i], Cells[6,i], Cells[7,i]]);
      end;
      Printer.Canvas.TextOut(linkerRand, zeile * (textHoehe + 3), s);
      inc(i,1);
    end;
    Printer.EndDoc
  end;

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Drucken in Win7

Beitrag von theo »

Hast du die Abhängigkeit Printer4Lazarus und/oder einen PrintDialog drin?
Du hast hoffentlich nicht Printer selber created?

Ich hab kein win7

edewolf78
Beiträge: 12
Registriert: Mo 23. Nov 2009, 18:42
OS, Lazarus, FPC: Win (L 0.9.29 FPC 2.4.0)
CPU-Target: x32/x64
Wohnort: Ludwigsburg

Re: Drucken in Win7

Beitrag von edewolf78 »

Hallo,
das Problem bei Win7 x64 (auch Vista x64 ist davon betroffen), die winutilprn.pas (lazarus\components\printers\win32).
Die records dürfen für Win x64 nicht gepackt sein, einfach in der Winutilprn.pas die compiler switches einbauen und neu compilieren.

Eigentlich wollte ich noch einen Patch bauen, bin aber bisher noch nicht dazu gekommen

Code: Alles auswählen

...
  TFcntHook = function(Wnd: HWND; uiMsg: UINT; wParam: WPARAM; lParam: LPARAM): UINT_PTR; stdcall;
 
{$IFDEF CPU64}
  tagPSD= record
{$ELSE}[
  tagPSD= packed record
{$ENDIF}
...
{$IFDEF CPU64}
  tagPD=Record
{$ELSE}
  tagPD=packed Record
{$ENDIF}
...
{$IFDEF CPU64}
  TDeviceMode =   Record
{$ELSE}
  TDeviceMode =  packed Record
{$ENDIF}
...
{$IFDEF CPU64}
  _PRINTER_DEFAULTS = record
{$ELSE}
  _PRINTER_DEFAULTS = packed record
{$ENDIF}
...
{$IFDEF CPU64}
  _FORM_INFO_1    = Record
{$ELSE}
  _FORM_INFO_1    = packed Record
{$ENDIF}
...
 {$IFDEF CPU64}
  TDocInfo = record
 {$ELSE}
  TDocInfo = packed record
 {$ENDIF}
...
{$IFDEF CPU64}
  DOC_INFO_1 =  record
{$ELSE}
  DOC_INFO_1 = packed record
{$ENDIF}
...
{$IFDEF CPU64}
  _PRINTER_INFO_1 = Record
{$ELSE}
  _PRINTER_INFO_1 = packed Record
{$ENDIF}
...
{$IFDEF CPU64}
  _PRINTER_INFO_2 = Record
{$ELSE}
  _PRINTER_INFO_2 = packed Record
{$ENDIF}
...
{$IFDEF CPU64}
  _PRINTER_INFO_4 = Record
{$ELSE}
  _PRINTER_INFO_4 = packed Record
{$ENDIF}
...
{$IFDEF CPU64}
  _PRINTER_INFO_5 = Record
{$ELSE}
  _PRINTER_INFO_5 = packed Record
{$ENDIF}
...
Gruss Edwin

CPU-Quaeler
Beiträge: 36
Registriert: So 17. Aug 2008, 00:04

Re: Drucken in Win7

Beitrag von CPU-Quaeler »

Hallo!

Vielen Dank für Eure Hinweise! Es hat geholfen, wenn ich einen Printdialog einfach anlege (ohne diesen zu benutzen) :) . Ich habe mich für den Tipp von Theo entschieden, weil ich dafür an den Lazarus-Units nichts ändern muss und das Programm an jedem Windows-Rechner ohne zu überlegen kompilieren kann.

Gruß, Arthur

edewolf78
Beiträge: 12
Registriert: Mo 23. Nov 2009, 18:42
OS, Lazarus, FPC: Win (L 0.9.29 FPC 2.4.0)
CPU-Target: x32/x64
Wohnort: Ludwigsburg

Re: Drucken in Win7

Beitrag von edewolf78 »

Hallo,

solange Du für Win32 compilierst ist es ja auch kein Problem, nur wenn Du als Ziel Win x64 angibst,
kommst Du an den Änderungen nicht vorbei.

Gruss Edwin

Antworten