![]() |
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. |
AW: Stringgrid drucken
Hallo,
wie sollen wir das beantworten, ohne das Du uns mal etwas Quellcode zeigst? |
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. |
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 ... ;) |
AW: Stringgrid drucken
Zitat:
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. |
AW: Stringgrid drucken
Zitat:
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. |
AW: Stringgrid drucken
Zitat:
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; |
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). |
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. |
AW: Stringgrid drucken
Delphi-Quellcode:
Dies ist der Quelltext von den Schweizern.
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; 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:
Nur der letzte Befehl scheitert.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); Wie kann ich also den String aus der Ini mit dem Stringgrid drucken. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 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 by Thomas Breitkreuz