this slowpoke moves

Save & Load Printer Properties

uses WinSpool

type
  TDatensatz = record
    ID: integer;
    Name: AnsiString;
  end;

  TDataArray = array of TDatensatz;

procedure SavePrinterInfo(APrinterName: PChar; ADestStream: TStream);
procedure LoadPrinterInfo(APrinterName: PChar; ASourceStream: TStream);

//

procedure SavePrinterInfo(APrinterName: PChar; ADestStream: TStream);
var
  HPrinter : THandle;
  InfoSize,
  BytesNeeded: Cardinal;
  PI2: PPrinterInfo2;
  PrinterDefaults: TPrinterDefaults;
begin
  with PrinterDefaults do
  begin
    DesiredAccess := PRINTER_ACCESS_USE;
    pDatatype := nil;
    pDevMode := nil;
  end;
  if OpenPrinter(APrinterName, HPrinter, @PrinterDefaults) then
  try
    SetLastError(0);
    //Determine the number of bytes to allocate for the PRINTER_INFO_2 construct...
    if not GetPrinter(HPrinter, 2, nil, 0, @BytesNeeded) then
    begin
      //Allocate memory space for the PRINTER_INFO_2 pointer (PrinterInfo2)...
      PI2 := AllocMem(BytesNeeded);
      try
        InfoSize := SizeOf(TPrinterInfo2);
        if GetPrinter(HPrinter, 2, PI2, BytesNeeded, @BytesNeeded) then
          ADestStream.Write(PChar(PI2)[InfoSize], BytesNeeded - InfoSize);
      finally
        FreeMem(PI2, BytesNeeded);
      end;
    end;
  finally
    ClosePrinter(HPrinter);
  end;
end;

procedure LoadPrinterInfo(APrinterName: PChar; ASourceStream: TStream);
var
  HPrinter : THandle;
  InfoSize,
  BytesNeeded: Cardinal;
  PI2: PPrinterInfo2;
  PrinterDefaults: TPrinterDefaults;
begin
  with PrinterDefaults do
  begin
    DesiredAccess := PRINTER_ACCESS_USE;
    pDatatype := nil;
    pDevMode := nil;
  end;
  if OpenPrinter(APrinterName, HPrinter, @PrinterDefaults) then
  try
    SetLastError(0);
    //Determine the number of bytes to allocate for the PRINTER_INFO_2 construct...
    if not GetPrinter(HPrinter, 2, nil, 0, @BytesNeeded) then
    begin
      //Allocate memory space for the PRINTER_INFO_2 pointer (PrinterInfo2)...
      PI2 := AllocMem(BytesNeeded);
      try
        InfoSize := SizeOf(TPrinterInfo2);
        if GetPrinter(HPrinter, 2, PI2, BytesNeeded, @BytesNeeded) then
        begin
          PI2.pSecurityDescriptor := nil;
          ASourceStream.ReadBuffer(PChar(PI2)[InfoSize], BytesNeeded - InfoSize);
          // Apply settings to the printer
          if DocumentProperties(0, hPrinter, APrinterName, PI2.pDevMode^,
                                PI2.pDevMode^, DM_IN_BUFFER or DM_OUT_BUFFER) = IDOK then
          begin
            SetPrinter(HPrinter, 2, PI2, 0);  // Ignore the result of this call...
          end;
        end;
      finally
        FreeMem(PI2, BytesNeeded);
      end;
    end;
  finally
    ClosePrinter(HPrinter);
  end;
end;


// Für das Speichern der Druckereigenschaften kann
// man keinen genauen Code schreiben, weil es so viele
// verschiedene Drucker gibt. Hier ist ein Beispielansatz,
// wie das Speichern und Laden als Stream aussehen könnte.

// Speichern der Eigenschaften
procedure TForm1.Button1Click(Sender: TObject);
var
  Data : TDataArray; // Wird oben als type implementiert
  Stream : TStream;
  Len: Longint;
  i : integer;
begin
  SetLength(Data, 2); // Hier die Anzahl der Eigenschaften des Druckers angeben

  // Beispiel für Drucker Eigenschaften
  Data[0].Name := 'Name des Druckers';
  Data[1].ID := 1;

  Stream := TFileStream.Create('c:\Temp.cfg', fmCreate);
  try
    Len := Length(Data);
    Stream.Write(Len, SizeOf(Len));

    // Für das Speichern von mehreren Datensätzen von einem Array
    {
    for i := 0 to Length(Data) - 1 do
    begin
    Stream.Write(Data[I].ID, SizeOf(Data[I].ID));
    end;
    }

  finally
  Stream.Free;
  end;
end;

// Laden der Eigenschaften
procedure TForm1.Button2Click(Sender: TObject);
var
  Data: TDataArray;
  Stream: TStream;
  i : integer;
  Len: LongInt;
begin
  Stream := TFileStream.Create('c:\Temp.cfg', fmOpenRead);
  try
    Stream.Read(Len, SizeOf(Len));
    SetLength(Data, Len);
    LoadPrinterInfo('Name des Druckers', Stream);

    // Für das Laden von mehreren Datensätzen von einem Array
    {
    for I := 0 to Len - 1 do
    begin
    Stream.Read(Data[i].ID, SizeOf(Data[i].ID));
    Stream.Read(Len, SizeOf(Len));
    SetLength(Data[i].Name, Len);
    Stream.Read(PChar(Data[i].Name)^, Len);
    end;
    }
  finally
  Stream.Free;
  end;
end;

Keine Kommentare:

Kommentar veröffentlichen

Beliebte Posts

Translate