Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DBGrid direkt an Drucker schicken-Fehler:Zugriffsverletzung (https://www.delphipraxis.net/125774-dbgrid-direkt-drucker-schicken-fehler-zugriffsverletzung.html)

lnaemi 11. Dez 2008 11:09

Datenbank: Oracle • Version: ??? • Zugriff über: Sql-String

DBGrid direkt an Drucker schicken-Fehler:Zugriffsverletzung
 
Liebe Experten,
ich benutze einen netzwerkdrucker, schon gemappt.

gleich bei
Delphi-Quellcode:
drucker.BeginDoc;
schreibt oben erwähnte Fehlermeldung : "Zugriffsverletzung bei Adresse 004..."

woran kann das liegen? :wall: :wall:

bitte um eure antworten! :oops:



Delphi-Quellcode:
procedure TfrmMain.btnPrintUsersClick(Sender: TObject);

var
   sName, SQL, sRole, sUSR_Nr, sDSC, sACTIVE_DT :String;
   iCount:Integer;
   drucker : TPrinter;
    zeile_im_grid, gedruckte_zeile : Integer;
    zeilenhoehe, position_in_zeile : Int64;
    spalte_im_grid : Integer;
    my_rect : TRect;
    rueckgabe : Integer;
    abstand,i, gesamtbreite : Integer;
    spaltenbreite : Array Of Integer;
begin
    TRY
    drucker.BeginDoc;
    drucker.Title := 'Liste der aktiven Benutzer in BAForms';
    drucker:=TPrinter.Create;
    drucker.Canvas.Font.Name:='Arial';
    drucker.Canvas.Font.Size:=8;
    drucker.Canvas.Font.Color:=clBlack;
    drucker.Orientation:= poPortrait;
    abstand:=Round(45/1171*drucker.canvas.TextWidth('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'));
    drucker.canvas.textout(100,-100,drucker.Title);

   {   for spalte_im_grid:=0 TO DM.qry1.RecordCount-1 DO
    begin
       sRole := DM.qry1.Fields[0].AsString;
        sUSR_Nr := DM.qry1.Fields[1].AsString;
        sACTIVE_DT := DM.qry1.Fields[2].AsString;
        sDSC := DM.qry1.Fields[3].AsString;
        sName := DM.qry1.Fields[4].AsString;
    end;  }


     // statusbar1.Panels[2].Text:='Drucken ... (Zeile '+IntToStr(zeile_im_grid)+' von '+IntToStr(DM.qry1.RecordCount)+')';

      Application.ProcessMEssages;
      drucker.Canvas.Font.Style:=drucker.Canvas.Font.Style+[fsBold];
      //inc(zeile_im_grid);
      drucker.EndDoc;
    drucker.Free;

      EXCEPT
          on E: EDatabaseError do ShowMessage(E.Message);
      ELSE
          Application.MessageBox('Drucken fehlgeschlagen!', 'Fehler!');
      END;
end;

DeddyH 11. Dez 2008 11:13

Re: DBGrid direkt an Drucker schicken-Fehler:Zugriffsverletz
 
Lass die Variablendeklaration für drucker weg und ersetze drucker durch Printer.

lnaemi 11. Dez 2008 11:26

Re: DBGrid direkt an Drucker schicken-Fehler:Zugriffsverletz
 
Zitat:

Zitat von DeddyH
Lass die Variablendeklaration für drucker weg und ersetze drucker durch Printer.

danke habe gemacht.
jetzt bekomme ich die fehlermeldung "Drucker läuft" und gezeigt ist auf diese zeile:

Delphi-Quellcode:
abstand:=Round(45/1171*Printer.canvas.TextWidth('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'));
:wall:

lnaemi 11. Dez 2008 11:28

Re: DBGrid direkt an Drucker schicken-Fehler:Zugriffsverletz
 
Zitat:

Zitat von lnaemi
Zitat:

Zitat von DeddyH
Lass die Variablendeklaration für drucker weg und ersetze drucker durch Printer.

danke habe gemacht.
jetzt bekomme ich die fehlermeldung "Drucker läuft" immer noch auf dieselbe seite:
Delphi-Quellcode:
Printer.BeginDoc;
:wall:


DeddyH 11. Dez 2008 12:12

Re: DBGrid direkt an Drucker schicken-Fehler:Zugriffsverletz
 
Steht die Zeile mit TPrinter.Create noch drin? Die muss auch raus (hatte ich vorhin übersehen).

[edit] Zur Erklärung ein Zitat aus der Hilfe:
Zitat:

Printer gibt eine globale Instanz von TPrinter zurück, mit der die Interaktion mit dem Drucker verwaltet werden kann.

Unit

Printers

Kategorie

Sonstige Routinen

Delphi-Quellcode:
function Printer: TPrinter;
Beschreibung

Printer erzeugt und initialisiert bei ihrem ersten Aufruf die Instanz eines globalen TPrinter-Objekts. Die Funktion wird bei Druckausgaben in Verbindung mit einem TPrinter-Objekt benötigt.

Die Funktion Printer ist in der Unit Printers deklariert. Damit Sie Funktion und Objekt benutzen können, müssen Sie Printers zur uses-Klausel der Unit hinzufügen.
[/edit]

lnaemi 12. Dez 2008 06:54

Re: DBGrid direkt an Drucker schicken-Fehler:Zugriffsverletz
 
scheisse, und heute ist die abgabe:
es schreit noch immer bei
Delphi-Quellcode:
Printer.BeginDoc;
"Druckvorgang läuft!" :wall:
ich habe Printer.Create auch weggetan.

wenn ich
Delphi-Quellcode:
Printer.BeginDoc;
auch weg tue, was eh blöd ist, bekomme ich dann " Der Drucker druckt aktuell nicht" :wall:

was soll ich bloss machen?? :roll:


ich muss einen Grid einfach an drucker schicken. :wall:

DeddyH 12. Dez 2008 07:57

Re: DBGrid direkt an Drucker schicken-Fehler:Zugriffsverletz
 
Man müsste mal den kompletten aktuellen Source sehen. Aber abgesehen davon wäre es doch IMHO sinnvoller, nicht das Grid auszudrucken, sondern die enthaltene Datenmenge. Das kann von Hand geschehen oder über ein Reportingtool wie Rave, Quickreport, FastReport etc.

lnaemi 12. Dez 2008 20:18

Re: DBGrid direkt an Drucker schicken-Fehler:Zugriffsverletz
 
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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz