Einzelnen Beitrag anzeigen

lnaemi

Registriert seit: 9. Okt 2008
Ort: Vösendorf
27 Beiträge
 
#8

Re: DBGrid direkt an Drucker schicken-Fehler:Zugriffsverletz

  Alt 12. Dez 2008, 21:18
ok, so weit dass was gedrückt wird, habe ich geschaft, nur der hört bei seitenende nicht auf zu drücken.

vielleicht könntet ihr meine fehler finden:
danke

Delphi-Quellcode:
procedure TfrmMain.btnPrintUsersClick(Sender: TObject);
var
  sName, SQL, sRole, sUSR_Nr, sDSC, sACTIVE_DT, sDate :String;
  PageWidth,PageHeight, cv, vv, cc: Integer;
  P, I, J, YPos, XPos, HorzSize, VertSize: Integer;
  zeile, x, y: integer;
  breite, hoehe, randlinks, randoben,wievielgedruckt: integer;
  iCount:Integer;
  zeile_im_grid, gedruckte_zeile : Integer;
  zeilenhoehe, position_in_zeile : Int64;
  spalte_im_grid : Integer;
  my_rect : TRect;
  rueckgabe : Integer;
  spaltenbreite : Array Of Integer;
  
  mmx, mmy: Extended;
  Footer: string;
  AnzSeiten, Seite, Zeilen, HeaderSize, FooterSize, ZeilenSize, FontHeight: Integer;
begin
   //Kopfzeile, Fußzeile, Zeilenabstand, Schriftgröße festlegen
  HeaderSize := 100;
  FooterSize := 200;
  ZeilenSize := 36;
  FontHeight := 36;
   wievielgedruckt := 0;
  sDate := DateToStr(date());
        Printer.Orientation := TPrinterOrientation(poPortrait);
        Printer.BeginDoc;
  //Druck auf mm einstellen
  mmx := GetDeviceCaps(Printer.Canvas.Handle, PHYSICALWIDTH) /
    GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX) * 25.4;
  mmy := GetDeviceCaps(Printer.Canvas.Handle, PHYSICALHEIGHT) /
    GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY) * 25.4;
  VertSize := Trunc(mmy) * 10;
  HorzSize := Trunc(mmx) * 10;
  SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC);

 try
                Printer.Title:='Benutzerliste';
                Printer.Canvas.Font.Name:='Arial';
                Printer.Canvas.Brush.Color:=clwhite;
                Printer.Canvas.Font.Height:=50;
    Printer.Canvas.Font.Style := [fsBold];

    Printer.Canvas.TextOut(1500, -300, 'Datum:');
    Printer.Canvas.TextOut(1650, -300, sDate);
    Printer.Canvas.TextOut(500, -350,'Liste der aktiven Benutzer in BAForms');
    Printer.Canvas.TextOut(495, -400,'---------------------------------------------------------');
    //Spalten-name platzieren
    //Zeilenanzahl festlegen
  Zeilen := (VertSize - HeaderSize - FooterSize) div ZeilenSize;
  //Seitenanzahl ermitteln
  if DM.tblUsr.RecordCount mod Zeilen <> 0 then
    AnzSeiten := DM.tblUsr.RecordCount div Zeilen + 1
  else
    AnzSeiten := DM.tblUsr.RecordCount div Zeilen;
  Seite := 1;
         // Daten aus datenbank lesen - aktive benutzer
    DM.tblUsr.Filter:= 'ACTIVE_Q <> ' + QuotedStr('0');
    DM.tblUsr.Filtered := True;
     spalte_im_grid := -700;
     Printer.Canvas.Font.Style := [];
     Printer.Canvas.Font.Height:=40;
     //DM.tblUsr.RecordCount-1
      //seitennummerierung
    Printer.Canvas.TextOut(100, -600 ,'Username');
    Printer.Canvas.TextOut(100, -650 ,'-------------');
    Printer.Canvas.TextOut(400, -600 ,'Name');
    Printer.Canvas.TextOut(400, -650 ,'-------------');
        Printer.Canvas.TextOut(900, -600 ,'Rolle');
    Printer.Canvas.TextOut(900, -650 ,'----------');
    Printer.Canvas.TextOut(1100, -600 ,'Aktiviert am');
    Printer.Canvas.TextOut(1100, -650 ,'----------------');
    //Grid Drucken
  for P := 1 to AnzSeiten do
  begin
    //Kopfzeile
    Printer.Canvas.Font.Height := 48;
    Printer.Canvas.TextOut((HorzSize div 2 - (Printer.Canvas.TextWidth(Printer.Title) div 2)),
      - 20,Printer.Title);
    Printer.Canvas.Pen.Width := 5;
    Printer.Canvas.MoveTo(0, - HeaderSize);
    Printer.Canvas.LineTo(HorzSize, - HeaderSize);
    //Fußzeile
    Printer.Canvas.MoveTo(0, - VertSize + FooterSize);
    Printer.Canvas.LineTo(HorzSize, - VertSize + FooterSize);
    Printer.Canvas.Font.Height := 36;
    Footer := 'Seite: ' + IntToStr(Seite) + ' von ' + IntToStr(AnzSeiten);
    Printer.Canvas.TextOut((HorzSize div 2 - (Printer.Canvas.TextWidth(Footer) div 2)),
      - VertSize + 150,Footer);
    //Zeilen drucken
    Printer.Canvas.Font.Height := FontHeight;
    YPos := HeaderSize + 10;
    for I := 1 to Zeilen do
    begin
                if DM.tblUsr.RecordCount >= I + (Seite - 1) * Zeilen then
                begin
                        sUSR_Nr := DM.tblUsr.Fields[0].AsString;
                        sName := DM.tblUsr.Fields[1].AsString;
                        sRole := DM.tblUsr.Fields[2].AsString;
                        sACTIVE_DT := DM.tblUsr.Fields[4].AsString;
                        sDSC := DM.tblUsr.Fields[15].AsString;
                        Printer.Canvas.TextOut(100, spalte_im_grid , sName);
                        Printer.Canvas.TextOut(400, spalte_im_grid, sDSC);
                        Printer.Canvas.TextOut(900, spalte_im_grid , sRole);
                        Printer.Canvas.TextOut(1100, spalte_im_grid , sACTIVE_DT);
                        wievielgedruckt := wievielgedruckt +1;
                        spalte_im_grid := spalte_im_grid -40;
                        DM.tblUsr.Next;
                   end;
    end;
    Inc(Seite);
    if Seite <= AnzSeiten then begin
    Printer.NewPage;
    spalte_im_grid := -200;
    Printer.Canvas.TextOut(100, -200 ,'Username');
    Printer.Canvas.TextOut(100, -250 ,'-------------');
    Printer.Canvas.TextOut(400, -200 ,'Name');
    Printer.Canvas.TextOut(400, -250 ,'-------------');
    Printer.Canvas.TextOut(900, -200 ,'Rolle');
    Printer.Canvas.TextOut(900, -250 ,'----------');
    Printer.Canvas.TextOut(1100, -200 ,'Aktiviert am');
    Printer.Canvas.TextOut(1100, -250 ,'----------------');
    end;
  end;
    Printer.EndDoc;
    Printer.Free;
     EXCEPT
         on E: EDatabaseError do ShowMessage(E.Message);
     ELSE
         Application.MessageBox('Drucken fehlgeschlagen!', 'Fehler!');
     END;

end;
I'm the ONE!
  Mit Zitat antworten Zitat