AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stringgrid drucken

Ein Thema von s4sh81 · begonnen am 22. Mai 2019 · letzter Beitrag vom 22. Jun 2019
Antwort Antwort
Seite 1 von 2  1 2      
s4sh81

Registriert seit: 11. Sep 2008
11 Beiträge
 
#1

Stringgrid drucken

  Alt 22. Mai 2019, 19:20
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.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Stringgrid drucken

  Alt 22. Mai 2019, 19:26
Hallo,
wie sollen wir das beantworten, ohne das Du uns mal etwas Quellcode zeigst?
Heiko
  Mit Zitat antworten Zitat
s4sh81

Registriert seit: 11. Sep 2008
11 Beiträge
 
#3

AW: Stringgrid drucken

  Alt 22. Mai 2019, 19:31
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.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Stringgrid drucken

  Alt 22. Mai 2019, 21:27
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 ...
Heiko

Geändert von hoika (22. Mai 2019 um 21:30 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#5

AW: Stringgrid drucken

  Alt 22. Mai 2019, 22:21
[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.
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
704 Beiträge
 
Delphi 12 Athens
 
#6

AW: Stringgrid drucken

  Alt 23. Mai 2019, 10:44
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.
Peter Below
  Mit Zitat antworten Zitat
s4sh81

Registriert seit: 11. Sep 2008
11 Beiträge
 
#7

AW: Stringgrid drucken

  Alt 24. Mai 2019, 21:30
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;
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Stringgrid drucken

  Alt 25. Mai 2019, 00:11
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).
Heiko
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.960 Beiträge
 
Delphi 12 Athens
 
#9

AW: Stringgrid drucken

  Alt 26. Mai 2019, 09:44
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.
  Mit Zitat antworten Zitat
s4sh81

Registriert seit: 11. Sep 2008
11 Beiträge
 
#10

AW: Stringgrid drucken

  Alt 21. Jun 2019, 20:16
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:48 Uhr.
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