AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi DBGrid direkt an Drucker schicken-Fehler:Zugriffsverletzung
Thema durchsuchen
Ansicht
Themen-Optionen

DBGrid direkt an Drucker schicken-Fehler:Zugriffsverletzung

Ein Thema von lnaemi · begonnen am 11. Dez 2008 · letzter Beitrag vom 12. Dez 2008
Antwort Antwort
lnaemi

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

DBGrid direkt an Drucker schicken-Fehler:Zugriffsverletzung

  Alt 11. Dez 2008, 11:09
Datenbank: Oracle • Version: ??? • Zugriff über: Sql-String
Liebe Experten,
ich benutze einen netzwerkdrucker, schon gemappt.

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

woran kann das liegen?

bitte um eure antworten!



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;
I'm the ONE!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: DBGrid direkt an Drucker schicken-Fehler:Zugriffsverletz

  Alt 11. Dez 2008, 11:13
Lass die Variablendeklaration für drucker weg und ersetze drucker durch Printer.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
lnaemi

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

Re: DBGrid direkt an Drucker schicken-Fehler:Zugriffsverletz

  Alt 11. Dez 2008, 11:26
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:

abstand:=Round(45/1171*Printer.canvas.TextWidth('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'));
I'm the ONE!
  Mit Zitat antworten Zitat
lnaemi

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

Re: DBGrid direkt an Drucker schicken-Fehler:Zugriffsverletz

  Alt 11. Dez 2008, 11:28
Zitat von lnaemi:
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:
Printer.BeginDoc;
I'm the ONE!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: DBGrid direkt an Drucker schicken-Fehler:Zugriffsverletz

  Alt 11. Dez 2008, 12:12
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

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]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
lnaemi

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

Re: DBGrid direkt an Drucker schicken-Fehler:Zugriffsverletz

  Alt 12. Dez 2008, 06:54
scheisse, und heute ist die abgabe:
es schreit noch immer bei Printer.BeginDoc; "Druckvorgang läuft!"
ich habe Printer.Create auch weggetan.

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

was soll ich bloss machen??


ich muss einen Grid einfach an drucker schicken.
I'm the ONE!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: DBGrid direkt an Drucker schicken-Fehler:Zugriffsverletz

  Alt 12. Dez 2008, 07:57
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
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, 20: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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:17 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