Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Stringgrid drucken (https://www.delphipraxis.net/200763-stringgrid-drucken.html)

s4sh81 22. Mai 2019 18:20

Stringgrid drucken
 
Hallo zusammen,

ich möchte ein Stringgrid drucken.
Dies funktioniert auch soweit ganz gut.

Sobald der Text in einer Zelle allerdings mit einem Zeilenumbruch dargestellt wird,
wird beim Drucken, dieser Text wieder ohne Zeilenumbrüche "gedruckt".

Wie kann ich also, die Funktion des Zeilenumbruchs auch in der Druckversion einfügen.

Danke vorab.

hoika 22. Mai 2019 18:26

AW: Stringgrid drucken
 
Hallo,
wie sollen wir das beantworten, ohne das Du uns mal etwas Quellcode zeigst?

s4sh81 22. Mai 2019 18:31

AW: Stringgrid drucken
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
Stringgrid1.ColWidths[0] := 75;
Stringgrid1.ColWidths[1] := 510;
Stringgrid1.ColWidths[2] := 50;
Stringgrid1.ColWidths[3] := 30;

  StringGrid1.colcount := 4;
  StringGrid1.rowcount := 60;
  StringGrid1.Cells [0,0] := 'Datum';
  StringGrid1.Cells [1,0] := 'Arbeitsbeschreibung';
  StringGrid1.Cells [2,0] := 'Stunden';
  Stringgrid1.Cells [3,0] := 'PKW';
  Stringgrid1.Cells [0,2] := datetostr(now);
  Stringgrid1.Cells [1,2] := 'Hallo, das ist ein test, ob eer auch einen zeilenumbruch hinbegkommet, und dann kommt jede menge text und text und text noch mehr text um zu testen ob der zeilenumbruch funktionerit';
  stringgrid1.Cells [3,2] := '15';
end;


procedure TForm1.Button4Click(Sender: TObject);
begin
if PrintDialog1.execute then
begin
  PrintStringGrid(stringGrid1, '', poPortrait);
end;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
StringGrid1.Canvas.FillRect(Rect);
// Jetzt kommt was aus der WindowsAPI
DrawText(StringGrid1.Canvas.Handle,
PChar(StringGrid1.Cells[ACol, ARow]),
length(StringGrid1.Cells[ACol, ARow]),
Rect, DT_WordBreak)
end;

end.

hoika 22. Mai 2019 20:27

AW: Stringgrid drucken
 
Hallo,
mein Compiler sagt
PrintStringGrid not found

Wenn ich das richtig erkenne, erfolgt der Ausdruck in PrintStringGrid, oder irre ich mich?

Warum versteckst du dann genau diesen Code vor uns ... ;)

Delphi.Narium 22. Mai 2019 21:21

AW: Stringgrid drucken
 
Zitat:

Zitat von s4sh81 (Beitrag 1432894)
[DELPHI]
Stringgrid1.Cells [1,2] := 'Hallo, das ist ein test, ob eer auch einen zeilenumbruch hinbegkommet, und dann kommt jede menge text und text und text noch mehr text um zu testen ob der zeilenumbruch funktionerit';

DrawText(StringGrid1.Canvas.Handle,
PChar(StringGrid1.Cells[ACol, ARow]),
length(StringGrid1.Cells[ACol, ARow]),
Rect, DT_WordBreak)

Im Text ist kein Zelenumbruch.
DrawText ist nur für die Bildschirmanzeige.
Von daher ist es vollkommen ok, wenn beim Druck kein Zeilenumbruch erfolgt.

Das, was Du für die Bildschirmanzeige mit DrawText(...) machst, musst Du analog für die Druckausgabe implementieren, schließlich wird ja der Inhalt des StringGrids gedruckt und nicht die Bildschirmausgabe.

peterbelow 23. Mai 2019 09:44

AW: Stringgrid drucken
 
Zitat:

Zitat von s4sh81 (Beitrag 1432890)
Hallo zusammen,

ich möchte ein Stringgrid drucken.
Dies funktioniert auch soweit ganz gut.

Sobald der Text in einer Zelle allerdings mit einem Zeilenumbruch dargestellt wird,
wird beim Drucken, dieser Text wieder ohne Zeilenumbrüche "gedruckt".

Wie kann ich also, die Funktion des Zeilenumbruchs auch in der Druckversion einfügen.

Danke vorab.

Falls Du den Druck per Ausgabe auf dem Printer.Canvas machst verwende die TextRect-Methode, die kann Text umbrechen, allerdings mußt Du vorher rausfinden, wie groß das Ausgaberechteck werden muss. TextRect kann das auch.

Ein Grid zu drucken ist komplex, da sollte man sich schon mal überlegen, ob man das nicht delegieren kann. Ich erzeuge oft einfach ein HTML-File mit einer entsprechenden Tabelle und lasse das vom Browser drucken (per Shellexecute). Oder, wenn verfügbar, packe die Daten in ein Excel-File (per OLE automation) und lasse den Benutzer das nach seinen Vorlieben drucken.

Oder man verwendet einen Report, sowas kann man auch mit Daten aus anderen Quellen als einer Datenbank füttern, und die Reportkomponente hat üblicherweise auch eine Druckfunkion.

s4sh81 24. Mai 2019 20:30

AW: Stringgrid drucken
 
Zitat:

Zitat von hoika (Beitrag 1432898)
Hallo,
mein Compiler sagt
PrintStringGrid not found

Wenn ich das richtig erkenne, erfolgt der Ausdruck in PrintStringGrid, oder irre ich mich?

Warum versteckst du dann genau diesen Code vor uns ... ;)

So, hier der Code aus dem PrintStringgrid.

Delphi-Quellcode:
  //vertikale linien zeichnen

   Printer.Canvas.Pen.Width := 1;
   printer.Canvas.MoveTo(380, -headersize);
   printer.Canvas.LineTo(380, - VertSize + FooterSize);

   Printer.Canvas.Pen.Width := 1;
   printer.Canvas.MoveTo(1750, -headersize);
   printer.Canvas.LineTo(1750, - VertSize + FooterSize);

   Printer.Canvas.Pen.Width := 1;
   printer.Canvas.MoveTo(1890, -headersize);
   printer.Canvas.LineTo(1890, - VertSize + FooterSize);

    for I := 1 to Zeilen do
    begin
      if Grid.RowCount >= I + (Seite - 1) * Zeilen then
      begin
        XPos := 0;
        for J := 0 to Grid.ColCount - 1 do
        begin
          Printer.Canvas.TextOut(XPos+200, - YPos,
          Grid.Cells[J, I + (Seite - 1) * Zeilen - 1]);
          XPos := XPos + Grid.ColWidths[J] * 3;
        end;
        YPos := YPos + ZeilenSize;
      end;
    end;
    //Seite hinzufügen
    Inc(Seite);
    if Seite <= AnzSeiten then Printer.NewPage;
  end;
  Printer.EndDoc;
end;

hoika 24. Mai 2019 23:11

AW: Stringgrid drucken
 
Hallo,
TextOut kennt keine Umbrüche, da müsste man schon DrawText bemühen.

Das ganze ist aber überhaupt nicht trivial.
Besser eine fertige Bibliothek benutzen (z.B., QuickPDF, ist aber Löhnware).

TurboMagic 26. Mai 2019 08:44

AW: Stringgrid drucken
 
Delphi kommt doch mit einer Lite Version fon FastReports. Die hab' ich vor einer Weile mal
in 2 Projekten benutzt und die Einarbeitung ist eigentlich nicht so schwer.

Es gibt ein PDF Handbuch dazu, das einen vernünftigen Eindruck macht um mal die
Grundlagen zu erklären, und mann muss die Daten auch nicht zwingend aus einem Dataset
bereit stelle. Außerdem kann man so einen report dann auch gleich als PDF, RTF oder TIFF
Datei ausgeben wenn man mag und in der neuesten Version auch noch als JPG.

s4sh81 21. Jun 2019 19:16

AW: Stringgrid drucken
 
Delphi-Quellcode:
uses
  printers;

//StringGrid Inhalt ausdrucken
procedure PrintStringGrid(Grid: TStringGrid; Title: string;
  Orientation: TPrinterOrientation);
var
  P, I, J, YPos, XPos, HorzSize, VertSize: Integer;
  AnzSeiten, Seite, Zeilen, HeaderSize, FooterSize, ZeilenSize, FontHeight: Integer;
  mmx, mmy: Extended;
  Footer: string;
begin
  //Kopfzeile, Fußzeile, Zeilenabstand, Schriftgröße festlegen
  HeaderSize := 100;
  FooterSize := 200;
  ZeilenSize := 36;
  FontHeight := 36;
  //Printer initializieren
  Printer.Orientation := Orientation;
  Printer.Title := Title;
  Printer.BeginDoc;
  //Druck auf mm einstellen
  mmx := GetDeviceCaps(Printer.Canvas.Handle, PHYSICALWIDTH) /
    GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSX) * 25.4;
  mmy := GetDeviceCaps(Printer.Canvas.Handle, PHYSICALHEIGHT) /
    GetDeviceCaps(Printer.Canvas.Handle, LOGPIXELSY) * 25.4;

  VertSize := Trunc(mmy) * 10;
  HorzSize := Trunc(mmx) * 10;
  SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC);

  //Zeilenanzahl festlegen
  Zeilen := (VertSize - HeaderSize - FooterSize) div ZeilenSize;
  //Seitenanzahl ermitteln
  if Grid.RowCount mod Zeilen <> 0 then
    AnzSeiten := Grid.RowCount div Zeilen + 1
  else
    AnzSeiten := Grid.RowCount div Zeilen;

  Seite := 1;
  //Grid Drucken
  for P := 1 to AnzSeiten do
  begin
    //Kopfzeile
    Printer.Canvas.Font.Height := 48;
    Printer.Canvas.TextOut((HorzSize div 2 - (Printer.Canvas.TextWidth(Title) div 2)),
      - 20,Title);
    Printer.Canvas.Pen.Width := 5;
    Printer.Canvas.MoveTo(0, - HeaderSize);
    Printer.Canvas.LineTo(HorzSize, - HeaderSize);
    //Fußzeile
    Printer.Canvas.MoveTo(0, - VertSize + FooterSize);
    Printer.Canvas.LineTo(HorzSize, - VertSize + FooterSize);
    Printer.Canvas.Font.Height := 36;
    Footer := 'Seite: ' + IntToStr(Seite) + ' von ' + IntToStr(AnzSeiten);
    Printer.Canvas.TextOut((HorzSize div 2 - (Printer.Canvas.TextWidth(Footer) div 2)),
      - VertSize + 150,Footer);
    //Zeilen drucken
    Printer.Canvas.Font.Height := FontHeight;
    YPos := HeaderSize + 10;
    for I := 1 to Zeilen do
    begin
      if Grid.RowCount >= I + (Seite - 1) * Zeilen then
      begin
        XPos := 0;
        for J := 0 to Grid.ColCount - 1 do
        begin
          Printer.Canvas.TextOut(XPos, - YPos,
            Grid.Cells[J, I + (Seite - 1) * Zeilen - 1]);
          XPos := XPos + Grid.ColWidths[J] * 3;
        end;
        YPos := YPos + ZeilenSize;
      end;
    end;
    //Seite hinzufügen
    Inc(Seite);
    if Seite <= AnzSeiten then Printer.NewPage;
  end;
  Printer.EndDoc;
end;

//Example
procedure TForm1.Button1Click(Sender: TObject);
begin
  //Drucken im Hochformat
  PrintStringGrid(Grid, 'StringGrid Print Portrait', poPortrait);
end;
Dies ist der Quelltext von den Schweizern.

Ich versuche nun in der Prozedur PrintStringGrid
Inhalte aus einer Ini Datei ebenfalls per Printer.Canvas.TextOut zu drucken.
Das laden aus der Ini funktioniert.

Delphi-Quellcode:
 
var
ini: TIniFile;
ABC : string;
begin
  ini:= TIniFile.Create('C:\......\Projekte\.....ini');
  try

    ABC := Ini.ReadString('Projekt', 'Wert', 'Wert');

    Printer.Canvas.TextOut(180, - 60,ABC);
Nur der letzte Befehl scheitert.

Wie kann ich also den String aus der Ini mit dem Stringgrid drucken.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:27 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