Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi How to set use printer offline (https://www.delphipraxis.net/142995-how-set-use-printer-offline.html)

haidomingo 7. Nov 2009 15:28


How to set use printer offline
 
Hi,

How to set "use printer online" from code.
Thanks

toms 7. Nov 2009 15:41

Re: How to set use printer offline
 
Hi, read this ms article (HOWTO: How To Change the Work Offline Status of a Printer)

SirThornberry 7. Nov 2009 15:45

Re: How to set use printer offline
 
Ich fände es besser die Lösung hier zu posten anstelle nur zu verlinken. Denn wenn der externe Artikel irgendwann verschwunden ist oder sich die URL geändert hat bringt dieses Thema keinem mehr zur Lösung.

toms 7. Nov 2009 15:47

Re: How to set use printer offline
 
Zitat:

Zitat von SirThornberry
Ich fände es besser die Lösung hier zu posten anstelle nur zu verlinken. Denn wenn der externe Artikel irgendwann verschwunden ist oder sich die URL geändert hat bringt dieses Thema keinem mehr zur Lösung.

Und eigentlich hätte ich nur auf Google verweisen wollen...(aber was ist, wenn es Google nicht mehr gibt :roll: )

haidomingo 7. Nov 2009 16:34

Re: How to set use printer offline
 
Zitat:

Zitat von toms
Hi, read this ms article (HOWTO: How To Change the Work Offline Status of a Printer)

Thanks.

Where I wrong?

Delphi-Quellcode:
var
   SelectedPrinter: string;
   hSelPrn     : dword;
   PrinterInfo : TPrinterInfo2A;
   bytesNeeded : dword;
   dwStatusMask : DWORD;
begin
    SelectedPrinter:=Printer.Printers[Printer.PrinterIndex];
    if OpenPrinter(PChar(SelectedPrinter), hSelPrn, nil) then begin
       GetPrinter(hSelPrn, 2, @PrinterInfo, SizeOf(PrinterInfo), @bytesNeeded);
       dwStatusMask:=dWord(PRINTER_ATTRIBUTE_WORK_OFFLINE);
       PrinterInfo.Attributes:=PrinterInfo.Attributes and dwStatusMask;
       SetPrinter(hSelPrn, 2, @PrinterInfo, 0);
       ClosePrinter(hSelPrn);
    end;
end;

haidomingo 8. Nov 2009 10:45

Re: How to set use printer offline
 
Zitat:

Zitat von toms
Hi, read this ms article (HOWTO: How To Change the Work Offline Status of a Printer)

Help, I can not find the solution!

Delphi-Quellcode:
var
   SelectedPrinter: string;
   hSelPrn     : dword;
   PrinterInfo : TPrinterInfo2A;
   bytesNeeded : dword;
begin
    SelectedPrinter:=Printer.Printers[Printer.PrinterIndex];
    if OpenPrinter(PChar(SelectedPrinter), hSelPrn, nil) then begin
       GetPrinter(hSelPrn, 2, @PrinterInfo, SizeOf(PrinterInfo), @bytesNeeded);
       if PrinterInfo.Attributes and PRINTER_ATTRIBUTE_WORK_OFFLINE = PRINTER_ATTRIBUTE_WORK_OFFLINE then
          PrinterInfo.Attributes:=PrinterInfo.Attributes and PRINTER_ATTRIBUTE_WORK_OFFLINE
       else
          Printerinfo.Attributes:=PrinterInfo.Attributes or PRINTER_ATTRIBUTE_WORK_OFFLINE;
       SetPrinter(hSelPrn, 2, @PrinterInfo, 0);
       ClosePrinter(hSelPrn);
    end;

SirThornberry 8. Nov 2009 11:24

Re: How to set use printer offline
 
Delphi-Quellcode:
PrinterInfo.Attributes:=PrinterInfo.Attributes and PRINTER_ATTRIBUTE_WORK_OFFLINE
The result of this is allways PRINTER_ATTRIBUTE_WORK_OFFLINE (or 0 if PRINTER_ATTRIBUTE_WORK_OFFLINE was not set before).

to remove the PRINTER_ATTRIBUTE_WORK_OFFLINE bits the expression has to be:
Delphi-Quellcode:
PrinterInfo.Attributes:=PrinterInfo.Attributes and not(PRINTER_ATTRIBUTE_WORK_OFFLINE)

haidomingo 8. Nov 2009 18:20

Re: How to set use printer offline
 
The new code:

Delphi-Quellcode:
procedure TForm24.Button1Click(Sender: TObject);
var
  HPrinter : THandle;
  InfoSize,
  BytesNeeded: Cardinal;
  PI2: PPrinterInfo2;
  PrinterDefaults: TPrinterDefaults;
  SelectedPrinter: string;

begin
  SelectedPrinter:=Printer.Printers[Printer.PrinterIndex];
  with PrinterDefaults do begin
    DesiredAccess := PRINTER_ACCESS_USE;
    pDatatype := nil;
    pDevMode := nil;
  end;
  if OpenPrinter(PChar(SelectedPrinter), HPrinter, @PrinterDefaults) then
  try
    if not GetPrinter(HPrinter, 2, nil, 0, @BytesNeeded) then begin
      PI2 := AllocMem(BytesNeeded);
      try
        InfoSize := SizeOf(TPrinterInfo2);
        if GetPrinter(HPrinter, 2, PI2, BytesNeeded, @BytesNeeded) then begin
           ShowMessage(IntToStr(PI2^.Attributes)); // Show 1601
           PI2^.Attributes:=PI2^.Attributes and not (PRINTER_ATTRIBUTE_WORK_OFFLINE);
           SetPrinter(Hprinter, 2, PI2, 0);
           ShowMessage(IntToStr(PI2^.Attributes));//Show 577
        end;
      finally
        FreeMem(PI2, BytesNeeded);
      end;
    end;
  finally
    ClosePrinter(HPrinter);
  end;
but the printer status is not changed (1601)
seems that the call to SetPrinter has no effect.

many thanks

haidomingo 22. Nov 2009 15:58

Re: How to set use printer offline
 
Delphi-Quellcode:
function TestPrinterOffLine:Boolean;
var
  HPrinter : THandle;
  InfoSize,
  BytesNeeded: Cardinal;
  PI2: PPrinterInfo2;
  PrinterDefaults: TPrinterDefaults;
  SelectedPrinter: string;

begin
  SelectedPrinter:=Printer.Printers[Printer.PrinterIndex];
  with PrinterDefaults do begin
    DesiredAccess := PRINTER_ACCESS_USE;
    pDatatype := nil;
    pDevMode := nil;
  end;
  if OpenPrinter(PChar(SelectedPrinter), HPrinter, @PrinterDefaults) then
  try
    if not GetPrinter(HPrinter, 2, nil, 0, @BytesNeeded) then begin
      PI2 := AllocMem(BytesNeeded);
      try
        InfoSize := SizeOf(TPrinterInfo2);
        if GetPrinter(HPrinter, 2, PI2, BytesNeeded, @BytesNeeded) then
            Result:=PI2^.Attributes and PRINTER_ATTRIBUTE_WORK_OFFLINE = PRINTER_ATTRIBUTE_WORK_OFFLINE
        else
            Result:=False;
      finally
        FreeMem(PI2, BytesNeeded);
      end;
    end;
  finally
    ClosePrinter(HPrinter);
  end;
end;
AND

Delphi-Quellcode:
procedure WorkPrinterOnLine(Path:string);
var
  F :TextFile;
  ScriptName: string;
begin
  ScriptName:=Path+'temp.vbs';
  AssignFile(F,ScriptName);
  Rewrite(F);
  WriteLn(F,'PrinterName = "'+ Printer.Printers[Printer.PrinterIndex]+'"');
  WriteLn(F,'VerbName = "&Use Printer Online"');
  WriteLn(F,'Dim sa');
  WriteLn(F,'Set sa = CreateObject("Shell.Application")');
  WriteLn(F,'Set printers = sa.NameSpace(4).Items()');
  WriteLn(F,'''WScript.Echo TypeName(printers)');
  WriteLn(F,'For each printer in printers');
  WriteLn(F,'''WScript.Echo printer.Name');
  WriteLn(F,'if printer.Name = PrinterName Then');
  WriteLn(F,'Dim verbs: Set verbs = printer.Verbs');
  WriteLn(F,'For Each verb in verbs');
  WriteLn(F,'''WScript.Echo verb.Name');
  WriteLn(F,'if verb.Name = VerbName Then');
 // WriteLn(F,'WScript.Echo PrinterName & " was offline"');
  WriteLn(F,'verb.Doit()');
  WriteLn(F,'End If');
  WriteLn(F,'Next');
  WriteLn(F,'End If');
  WriteLn(F,'Next');
  CloseFile(F);

  ShellExecute(0, PChar('Open'),PChar(ScriptName),nil, nil, SW_HIDE);
  if FileExists(ScriptName) then
     DeleteFile(ScriptName);
end;
Usage:

Delphi-Quellcode:
if TestPrinterOffLine then
     WorkPrinterOnLine(AppPath);

haidomingo 22. Nov 2009 16:14

Re: How to set use printer offline
 
Zitat:

Zitat von haidomingo
Delphi-Quellcode:
..
..
  WriteLn(F,'End If');
  WriteLn(F,'Next');
  CloseFile(F);
  ShellExecute(0, PChar('Open'),PChar(ScriptName),nil, nil, SW_HIDE);

//  if FileExists(ScriptName) then
//     DeleteFile(ScriptName);
end;
..
..
[/delphi]



Alle Zeitangaben in WEZ +1. Es ist jetzt 10:58 Uhr.
Seite 1 von 2  1 2      

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