Printer- Problem - Muss z.T. erstmalig Setup rufen



  • Hallo zusammen,
    hab nun endlich auch mal ein Druckerproblem.

    TPrinter *PrinterInstanz;
        PrinterInstanz=Printer();
        for (i=0;i<PrinterInstanz->Printers->Count;i++)
        { PrinterList->Items->Add(PrinterInstanz->Printers->Strings[i]);
          PrinterListDroppedWidth=max(PrinterListDroppedWidth,
                                      CP->Canvas->TextWidth(
                                      PrinterInstanz->Printers->Strings[i]));
        }
        if (PrinterName->Caption.Length()>0)
        {
          PrnItemIndOld=PrinterInstanz->PrinterIndex;
          if (PrinterList->Items->IndexOf(PrinterName->Caption)>=0)
          { PrinterList->ItemIndex=PrinterList->Items->IndexOf(PrinterName->Caption);
            PrinterInstanz->PrinterIndex=PrinterList->ItemIndex;
            try
            {
              if (PrinterInstanz->Handle==0) //Hier bei einigen Druckern/ Treibern Exception!!!
              { if (!PSDlg->Execute())
              .
              .
              .
    

    Mein Problem ist:
    Bei vielen Druckern, die installiert sind klappt alles bestens. Aber gelegentlich kommen auf anderen PCs installierte Drucker NICHT richtig an.
    (zum Beispiel der HP Design-Jet 1050 - das ist ein A1- Plotter)

    D.h.:
    Schon bei der Abfrage des Handle - das ist in dem Moment noch nichtmal 0 - gibt es ne schöne Exception. Diese fange ich ab, und starte im Catch- Block den Setup- Dialog. Der muss nur mit OK bestätigt werden und schon gehts.

    Bei wiederholten Aufrufen dieser Funktion klappt alles - während dieser Programm- Session.

    Nach jedem Programm- Neustart muss das für die betroffenen Printer wiederholt werden.

    Das ist für Anwender natürlich Murks.

    WIE kann ich so einen "sperrigen" Drucker initialisieren, OHNE den Setupdialog zu öffnen?

    Thx
    Frank



  • Scheinbar hat da HP Probleme mit dem Druckertreiber/-spooler.

    http://forums.msrportal.com/archive/index.php?t-25425.html



  • Das Problem scheint aber anders zu liegen als in dem Link.

    - Das Drucken funktioniert ja eigentlich. Nur muss beim ersten aktivieren dieses Druckers der Setup- Dialog gerufen werden. Und das nach jedem Programmstart. Wird bei laufendem Programm mehrmals gedruckt, muss das nicht jedesmal gemacht werden.

    Da scheint Windoof den Treiber nicht richtig zu initialisieren.

    Putzig ist auch: IrvanView initialisiert den Drucker richtig und druckt ohne Setup- Dialog. Nur wie machen die das?

    Gruss
    frank



  • Hallo,

    vielleicht hilft ein Blick in die Dialogs.pas,

    function TPrinterSetupDialog.Execute: Boolean;,
    GetPrinter(DevHandle, hDevNames) / SetPrinter(hDevMode, hDevNames)...

    mfg
    :xmas1:
    kpeter



  • kpeter schrieb:

    Hallo,

    vielleicht hilft ein Blick in die Dialogs.pas,

    function TPrinterSetupDialog.Execute: Boolean;,
    GetPrinter(DevHandle, hDevNames) / SetPrinter(hDevMode, hDevNames)...

    mfg
    :xmas1:
    kpeter

    Die PAS- Quelldateien sind beim BCB 4 nicht dabei. 🙄

    Putzig ist ja, das mein Code prinzipiell klappt. Ich kann nach Wechsel des Druckers i.A. auch die anderen Eigenschaften per Code setzen - sogar das mit der PaperSize hab ich mit WinAPI- Funktionen soweit hinbekommen.

    Problem ist: bei manchen Druckern ist nach der Umschaltung das Handle ungültig.
    Nur wenn ich einmalig den SetupDialog rufe und OK gebe klappt meine Umstellung reibungslos - auch folgende Drucke.

    NOCH KOMISCHER:
    Wenn ich die Druckerwahl mit PrintDialog mache klappt das mir dem Handle auch???

    Ich will aber nicht jedesmal einen der beiden Dialoge rufen.

    Meine Drucker:

    "HP DeskJet 690C" (klappt ohne Probleme)
    "HP DesignJet 1050C by HP" (macht beim ersten Ansprechen Probleme)

    Der zweite ist ein Plotter, da habe ich nur den Treiber und drucke in Plotfile.
    Die können dann an geeignetem PC geplottet werden (das klappt dann auch)

    Gruss
    Frank)



  • Hallo,

    die pas-Dateien sind Goldstaub :). Besorg dir mal welche.

    Nun, eventuell hätte das zunächst auch nicht weitergeholfen. Nachfolgend ein Schnipsel,
    nachdem alle lokalen Drucker einschl. ihrer Ports, Status, Jobs uvm. aufgelistet werden.
    Möglicherweise hilfts dir weiter..

    Die Strukturen PRINTER_INFO_1 bis ... enthalten weitere interessante ➡ Details

    #include <winspool.h>
    //-------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       EnumeratePrinters(PRINTER_ENUM_LOCAL);
    }
    
    void __fastcall TForm1::EnumeratePrinters(DWORD flags)
    {
    
       PRINTER_INFO_2* prninfo = NULL;
       DWORD needed, returned;
    
       // Puffergrösse ermitteln
       EnumPrinters(flags, NULL, 2, NULL, 0, &needed, &returned);
    
       // allocate für PRINTER_INFO Struktur
       prninfo = (PRINTER_INFO_2*) GlobalAlloc(GPTR,needed);
    
       if (!EnumPrinters(flags,
                          NULL,
                          2,
                          (LPBYTE) prninfo,
                          needed,
                          &needed,
                          &returned))
       {
          DWORD err = GetLastError();
       }
       else {
    
          for (int i=0; i < returned; i++ ) {
    
             LPTSTR PrnName = prninfo[i].pPrinterName;
             LPTSTR Port    = prninfo[i].pPortName;
             DWORD Status   = prninfo[i].Status;
             DWORD jobs     = prninfo[i].cJobs;
             // hier weiter die Struktur abfragen
    
             // Ausgabe in die Listbox:
             PrinterList->Items->Add(PrnName + (String)" Port: " + Port + " Status: " +IntToStr(Status)+ " Jobs: " +IntToStr(jobs));
          }
       }
       GlobalFree(prninfo);
    }
    

    mfg
    kpeter


Anmelden zum Antworten