Announcement

Collapse
No announcement yet.

Papiergröße unter WinNT

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

  • Papiergröße unter WinNT

    Ich habe ein Problem: mit Delphi 1 ist mir unmöglich, aus dem Programm
    heraus die Papiergröße (für Etiketten) auf ein Benutzer-definiertes Format zu bringen. Gedruckt wird immer auf DinA4. Wer kann mir dabei helfen,
    auch unter WinNT dieses Problem zu lösen ?
    Anregungen, Tips und vielleicht kurze Listings (wäre klasse :-) )
    bitte an [email protected]
    P.S. Bin wirklich verzeweifelt...

  • #2
    Hallo,

    ich kann mit dem folgenden Delphi 1-Beispielprogramm unter Windows NT 4 SP5 einen Ausdruck mit verschiedenen Papierformaten erreichen.
    <pre>
    unit Unit1;

    interface

    uses
    SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
    Forms, Dialogs, Printers, Print, StdCtrls;

    type
    TForm1 = class(TForm)
    Button1: TButton;
    PrintDialog1: TPrintDialog;
    procedure Button1Click(Sender: TObject);
    private
    { Private-Deklarationen }
    function PageSetup(iBin: Integer) : Bool;
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.DFM}

    const
    MAX_PATH = 144;

    procedure TForm1.Button1Click(Sender: TObject);
    var
    iBin : Integer;
    begin
    iBin := 1;
    if PrintDialog1.Execute then begin
    if not PageSetUp(iBin) then
    begin
    ShowMessage('Fehler bei Druckerkonfiguration');
    exit;
    end;
    Printer.BeginDoc;
    Printer.Canvas.TextOut(100,100, 'Testseite für Bin ' + IntToStr(iBin));
    end
    end;

    function TForm1.PageSetup(iBin: Integer): Bool;
    var
    pDevice : pChar;
    pDriver : pChar;
    pPort : pChar;
    hDMode : THandle;
    PDMode : PDEVMODE;
    PrnHandle : THandle;
    begin
    Result := False;
    GetMem(pDevice, cchDeviceName);
    GetMem(pDriver, MAX_PATH);
    GetMem(pPort, MAX_PATH);
    Printer.GetPrinter(pDevice, pDriver, pPort, hDMode);
    if hDMode <> 0 then begin
    pDMode := GlobalLock(hDMode);
    if pDMode <> nil then begin
    if iBin = 1 then begin
    pDMode^.dmFields := pDMode^.dmFields or dm_PaperSize;
    pDMode^.dmPaperSize := DMPAPER_LETTER;
    end else begin
    pDMode^.dmFields := pDMode^.dmFields or dm_PaperSize;
    pDMode^.dmPaperSize := DMPAPER_A4;
    end;
    if Printer.Printing then
    PrnHandle := Printer.Canvas.Handle
    else
    PrnHandle := Printer.Handle;
    if ResetDc(PrnHandle, pDMode) <> 0 then
    ;
    Result := True;
    GlobalUnlock(hDMode);
    end;
    end;
    FreeMem(pDevice, cchDeviceName);
    FreeMem(pDriver, MAX_PATH);
    FreeMem(pPort, MAX_PATH);
    end;

    end.
    </pre&gt

    Comment


    • #3
      Hallo !

      Ersteinmal Danke für die schnelle Antwort, aber ich kann es immer
      noch nicht umsetzen- WinNT SP4 Drucker NEC P6Plus -.
      Mein größtes problem ist, daß ich den Dialog nicht benutzen kann, da
      der Anwender an einer sogenannten Werkbank sitzt und das Programm
      über eine seriell angeschlossene Präzisionswaage nur mit 8 Funktionstasten ansteuert.

      Vielleicht liegt es auch daran, daß der Druckserver von NT mit seinen definierten Formularen noch zwischengeschaltet ist ???

      Gruß aus Buxtehude, Monika Kriesman

      Comment


      • #4
        Hallo,

        das mit dem PrintDialog ist kein Problem, denn er kann sehr leicht umgangen werden. Mein vorherigen Beispiel ist in diesem Fall wie folgt zu ändern (die Zuweisung <b>Printer.PrinterIndex := -1;</b> schaltet auf den aktuellen Standard-Drucker):
        <pre>
        procedure TForm1.Button1Click(Sender: TObject);
        var
        iBin : Integer;
        begin
        if CheckBox1.Checked then
        iBin := 1
        else
        iBin := 2;
        Printer.PrinterIndex := -1;
        if not PageSetUp(iBin) then
        begin
        ShowMessage('Fehler bei Druckerkonfiguration');
        exit;
        end;
        Printer.BeginDoc;
        Printer.Canvas.TextOut(100,100, 'Testseite für Bin ' + IntToStr(iBin));
        Printer.EndDoc;
        end;
        </pre>

        Falls das immer noch nicht von Erfolg gekrönt ist, verträgt anscheinend der Druckertreiber nicht die direkte Umsetzung von Papiergröße zum definierten Schacht. In diesem Fall würde ich alternativ das Strukturfeld <b>DM_DEFAULTSOURCE</b> verwenden:
        <pre>
        procedure TForm1.Button2Click(Sender: TObject);
        var
        pDevice : PChar;
        pDriver : PChar;
        pPort : PChar;
        hDMode : THandle;
        PDMode : PDEVMODE;
        PrnHandle : THandle;
        iBin : Integer;
        begin
        if CheckBox1.Checked then
        iBin := 1
        else
        iBin := 2;
        Printer.PrinterIndex := -1;
        GetMem(pDevice, cchDeviceName);
        GetMem(pDriver, MAX_PATH);
        GetMem(pPort, MAX_PATH);
        Printer.GetPrinter(pDevice, pDriver, pPort, hDMode);
        if hDMode <> 0 then begin
        pDMode := GlobalLock(hDMode);
        if pDMode <> nil then begin
        if iBin = 1 then begin
        pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE;
        pDMode^.dmPaperSize := DMPAPER_A4;
        pDMode^.dmFields := pDMode^.dmFields or DM_DEFAULTSOURCE;
        pDMode^.dmDefaultSource := DMBIN_MANUAL;
        end else begin
        pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE;
        pDMode^.dmPaperSize := DMPAPER_A4;
        pDMode^.dmFields := pDMode^.dmFields or DM_DEFAULTSOURCE;
        pDMode^.dmDefaultSource := DMBIN_AUTO;
        end;
        GlobalUnlock(hDMode);
        end;
        end;
        FreeMem(pDevice, cchDeviceName);
        FreeMem(pDriver, MAX_PATH);
        FreeMem(pPort, MAX_PATH);
        { Testausdruck }
        Printer.PrinterIndex := Printer.PrinterIndex;
        Printer.BeginDoc;
        Printer.Canvas.TextOut(100,100, 'Testseite für Bin ' + IntToStr(iBin));
        Printer.EndDoc;
        end;
        </pre&gt

        Comment


        • #5
          Hall Herr Kosch,

          ich habe ihr Beispielprogramm vom 02.11.1999 Papiergrösse unter WinNT unter DELPHI 4 ausprobiert unter erhalten eine Fehler-
          meldung ungleicher Typ bei der Anweisung if ResetDc(PrnHandle, pDMode) <> 0 then .
          Können sie mir vielleicht einen kleinen Tipp geben, woran dieses liegt.
          Besten Dank im voraus.

          Klaus-G. Seeb

          Comment


          • #6
            Hallo,

            mein Beispiel vom 2.11.99 war für <b>Delphi 1</b> (Win16-API), ein mit Delphi 4 geschriebenes Programm arbeitet jedoch mit Win32 (32-Bit). Beispiele für die Druckersteuerung mit den 32-bittigen Delphi-Versionen finden sich in der Rubrik <b>Drucken</b> des Forums

            Comment

            Working...
            X