Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Wie Druckerränder einstellen? (https://www.delphipraxis.net/85718-wie-druckerraender-einstellen.html)

PeterPanino 3. Feb 2007 22:17


Wie Druckerränder einstellen?
 
Hallo, weiß jemand wie man die Größe der Ränder des aktuellen Druckers einstellen kann?

MacGuyver 4. Feb 2007 12:21

Re: Wie Druckerränder einstellen?
 
Moin auch :hi:

Kommt dabei als erstes die Frage auf: "Womit druckst du?" Nicht den Namen des Druckers sondern der Software.

Stefan

PeterPanino 4. Feb 2007 14:15

Re: Wie Druckerränder einstellen?
 
Zitat:

Zitat von MacGuyver
Moin auch :hi:

Kommt dabei als erstes die Frage auf: "Womit druckst du?" Nicht den Namen des Druckers sondern der Software.

Stefan

Ganz einfach: Mit WriteLn in ein TextFile auf den aktuellen Drucker:

Delphi-Quellcode:
var
  MyFile: TextFile;
begin
  AssignPrn(MyFile);
  Rewrite(MyFile);
  WriteLn(MyFile, 'Mein Text');
Und noch eine zweite Frage: Wie kann ich mitbekommen, wenn auf dem Drucker-Canvas eine überlange Zeile umgebrochen wird?

Delphi-Quellcode:
Printer.Canvas.OnChange := MeinCanvasEventHandler;

bitsetter 4. Feb 2007 23:52

Re: Wie Druckerränder einstellen?
 
Hallo,
also folgendes müsste für Textdateien funktionieren:
Delphi-Quellcode:
uses Printers;

procedure Ausdrucken(Text: TStringList; x, y: integer);
var
  i, Zeile, FontSize: integer;
begin
  Zeile:= 0;
  x:= x* 10;
  y:= y* 10;
  printer.begindoc;
  printer.Canvas.Font.Size:= 12;
  FontSize:= printer.Canvas.Font.Size* 10;
  for i:= 0 to Text.Count- 1 do
  begin
    if Printer.Canvas.TextWidth(Text[i])> printer.PageWidth- x then
      Showmessage('Zeile '+inttostr(i)+ ' ist zu breit');
     
    Printer.Canvas.TextOut(x, y+ FontSize* Zeile, Text[i]);
    inc(Zeile);
    if (y+ FontSize* Zeile> printer.PageHeight) and (Zeile<= Text.Count) then
    begin
      Zeile:= 0;
      printer.NewPage;
    end;
  end;
  printer.enddoc;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Text: TStringList;
begin
  Text:= TStringList.Create;
  Text.LoadFromFile('C:\Test.txt');
  Ausdrucken(Text, 20, 120);
  Text.Free;
end;

PeterPanino 6. Feb 2007 01:11

Re: Wie Druckerränder einstellen?
 
Hallo bitsetter, vielen Dank für den Code!

Ich habe den Code etwas umgemodelt, um auch verschiedene Schriftgrößen innerhalb des Textes zu unterstützen. Was hältst du davon:

Delphi-Quellcode:
procedure Ausdrucken(Text: TStringList; x, y: integer);
var
  i, z: integer;
begin
  x := x * 10;
  y := y * 10;
  z := y;
  Printer.Begindoc;
  //printer.Canvas.Font.Name := 'Courier New';
  for i := 0 to Text.Count - 1 do
  begin
    (*if Printer.Canvas.TextWidth(Text[i]) > printer.PageWidth - x then
      Showmessage('Zeile ' + inttostr(i + 1) + ' ist zu breit');*)
    if (i mod 3) = 0 then
      printer.Canvas.Font.Size := 16
    else
      printer.Canvas.Font.Size := 11;
    Printer.Canvas.TextOut(x, y, Text[i]);
    y := y + (printer.Canvas.Font.Size * 11);
    if (y > (printer.PageHeight - z - (printer.Canvas.Font.Size * 10))) then
    begin
      y := z;
      Printer.NewPage;
    end;
  end;
  Printer.Enddoc;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  Text: TStringList;
begin
  Text:= TStringList.Create;
  Text.LoadFromFile('C:\Test.txt');
  Ausdrucken(Text, 20, 17);
  Text.Free;
end;
Jetzt bräuchte man nur noch eine Funktion, die überlange Textzeilen vor dem rechten Seitenrand an Wortgrenzen umbricht, dann wäre es perfekt!

PeterPanino 6. Feb 2007 04:05

Re: Wie Druckerränder einstellen?
 
So, nun ist auch die Umbruchfunktion fertig! Wer sagt denn, dass die Nacht zum Schlafen da ist?

Delphi-Quellcode:
procedure Ausdrucken(Text: TStringList; x, y: integer);
var
  i, j, z, w, m, c: integer;
  ThisLine: string;
  EndOfLine: Boolean;
  procedure PrintLine(const Line: string);
  begin
    Printer.Canvas.TextOut(x, y, Line);
    y := y + (Printer.Canvas.Font.Size * 11);
    if (y > (Printer.PageHeight - z - (printer.Canvas.Font.Size * 11))) then
    begin
      y := z;
      Printer.NewPage;
    end;
  end;
begin
  x := x * 10;
  y := y * 10;
  z := y;
  Printer.Begindoc;
  //printer.Canvas.Font.Name := 'Courier New';
  for i := 0 to Text.Count - 1 do
  begin
    m := i mod 8;
    case m of
      0: printer.Canvas.Font.Size := 16;
      1: printer.Canvas.Font.Size := 15;
      2: printer.Canvas.Font.Size := 14;
      3: printer.Canvas.Font.Size := 13;
      4: printer.Canvas.Font.Size := 12;
      5: printer.Canvas.Font.Size := 11;
      6: printer.Canvas.Font.Size := 10;
      7: printer.Canvas.Font.Size := 9;
    end;
    //Überlange Zeilen an Wortgrenzen umbrechen:
    ThisLine := Text[i];
    w := 1; //?
    c := 0;
    EndOfLine := False;
    repeat
    begin
      for j := 1 to Length(ThisLine) do
      begin
        if ThisLine[j] = ' ' then
          w := j - 1 //Wortgrenze merken
        else if ThisLine[j] in [',', '.', ';', ':', '!', '?', '-'] then
          w := j; //Wortgrenze merken
        if (Printer.Canvas.TextWidth(Copy(ThisLine, 1, j))) > (printer.PageWidth - (x * 2)) then
        begin
          PrintLine(Copy(ThisLine, 1, w));
          //Rest der Zeile:
          ThisLine := Trim(Copy(ThisLine, w + 1, Length(ThisLine)));
          BREAK;
        end;
        if j = Length(ThisLine) then
        begin
          EndOfLine := True;
          PrintLine(ThisLine);
        end;
      end;
      //Zur Sicherheit:
      if c > Text.Count then BREAK;
      Inc(c);
    end;
    until EndOfLine;
  end;
  Printer.Enddoc;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  Text: TStringList;
begin
  Text:= TStringList.Create;
  Text.LoadFromFile('C:\Test.txt');
  Ausdrucken(Text, 20, 17);
  Text.Free;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz