Announcement

Collapse
No announcement yet.

Noch mal Druckerschächte

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Noch mal Druckerschächte

    Hallo zusammen!<br>
    Kann mir irgenjemand einen Tip geben, wie ich rausfinde, welche Druckerschächte ein bestimmter Drucker zur Verfügung stellt?

  • #2
    Mein Kollege (Hallo, Uwe!) hat's so gemacht:<pre>
    var
    erg: array[0..200, 0..23] of char;
    ergw: array[0..200] of Word;
    count: DWord;
    <br>
    begin
    FillChar(erg, SizeOf(erg), 0);
    FillChar(ergw, SizeOf(ergw), 0);
    count := DeviceCapabilities(PChar(TPrinterDevice(Printers.O bjects[PrinterIndex]).Device), PChar(TPrinterDevice(Printers.Objects[PrinterIndex]).Port), DC_BINNAMES, nil, nil);
    DeviceCapabilities(PChar(TPrinterDevice(Printers.O bjects[PrinterIndex]).Device), PChar(TPrinterDevice(Printers.Objects[PrinterIndex]).Port), DC_BINNAMES, @erg, nil);
    DeviceCapabilities(PChar(TPrinterDevice(Printers.O bjects[PrinterIndex]).Device), PChar(TPrinterDevice(Printers.Objects[PrinterIndex]).Port), DC_BINS, @ergw, nil);
    //...
    end;
    </pre>
    Ciao, Uli

    Comment


    • #3
      Use the scrollbars, Luke

      Comment


      • #4
        TPrinterDevice ist bei mir ein undefinierter Bezeichner. Auch die Delphi-Hilfe kennt TPrinterDevice nicht. Welche Unit muß ich einbinden

        Comment


        • #5
          Hallo Ulrich!<br>
          Danke erstmal für den Tip, aber TPrinterdevice akzeptiert mein Delphi (Delphi 5) nicht, auch in der Hilfe steht dazu nix. Welche Unit müßte ich einbinden?
          Danke
          Patric

          Comment


          • #6
            Wie's ausschaut, ist TPrinterDevice nur unitintern in Printers.pas definiert. (Die hat mein Kollege etwas gegen den Strich gebürstet, deshalb funktioniert das Ganze bei uns.) Probier doch einfach mal, vor dem oben geposteten Code eine Typdefinition a la <pre>
            TPrinterDevice = class
            Driver, Device, Port: String;
            end;
            </pre> zu plazieren. (Das ist einfach aus der Printers.pas hier reingepastet, nur die Methoden hab ich rausgeschmissen, weil du die wohl eh nicht brauchst.)
            <p>Das ist jetzt natürlich nicht gerade superelegant, aber ich hab auf die Schnelle in der Hilfe keine "offizielle" Methode gefunden, um Driver, Device und Port aus einem TPrinter-Objekt rauszukitzeln.
            Vielleicht kennt da ja jemand anderes was besseres?
            <br>Ciao, Uli

            Comment


            • #7
              hallo,
              die uses winspool und printers hinzufügen.
              mit folgendem codeschnipsel klappt es:
              procedure GetBinnames(sl: TStrings);
              type
              TBinName = array[0..23] of Char;
              TBinNameArray = array[1..High(Integer) div Sizeof(TBinName)] of
              TBinName;
              PBinnameArray = ^TBinNameArray;
              TBinArray = array[1..High(Integer) div Sizeof(Word)] of Word;
              PBinArray = ^TBinArray;
              var
              Device, Driver, Port: array[0..255] of Char;
              hDevMode: THandle;
              i, numBinNames, numBins, temp: Integer;
              pBinNames: PBinnameArray;
              pBins: PBinArray;
              begin
              Printer.PrinterIndex := -1; // default drucker!!
              Printer.GetPrinter(Device, Driver, Port, hDevmode);
              numBinNames :=
              WinSpool.DeviceCapabilities(Device, Port, DC_BINNAMES, nil, nil);
              numBins :=
              WinSpool.DeviceCapabilities(Device, Port, DC_BINS, nil, nil);
              if numBins <> numBinNames then
              begin
              raise Exception.Create(
              'DeviceCapabilities reports different number of bins and ' +
              'bin names!');
              end; { If }

              if numBinNames > 0 then
              begin
              pBins := nil;
              GetMem(pBinNames, numBinNames * Sizeof(TBinname));
              GetMem(pBins, numBins * Sizeof(Word));
              try
              WinSpool.DeviceCapabilities(Device, Port, DC_BINNAMES,
              Pchar(pBinNames), nil);
              WinSpool.DeviceCapabilities(Device, Port, DC_BINS,
              Pchar(pBins), nil);
              sl.clear;
              for i := 1 to numBinNames do
              begin
              temp := pBins^[i];
              sl.addObject(pBinNames^[i], TObject(temp));
              end;
              finally
              FreeMem(pBinNames);
              if pBins <> nil then
              FreeMem(pBins);
              end;
              end;
              end

              Comment

              Working...
              X