Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - StringGrid drucken
Goaznic - Mi 21.09.11 11:17
Titel: StringGrid drucken
Hey. :)
Ich hab folgende Prozedur für das Drucken eines StringGrids:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| procedure TFormMain.Crossworddrucken1Click(Sender: TObject); var F: TextFile; s, oldFnt: string; I,e: word; begin Printer.PrinterIndex := -1; oldFnt := Printer.Canvas.Font.Name; Printer.Canvas.Font.Name := 'Coutier New'; AssignPrn(F); try Rewrite(F); with grdGrid do begin for e := 0 to ColCount - 1 do for I := 0 to RowCount - 1 do begin s := Format('%-1s', [Cells[e, I]]); Writeln(F, s); end end finally CloseFile(F); Printer.Canvas.Font.Name := oldFnt; end; end; |
Problem: Das Grid wird nicht wie ein Grid gedruckt, sondern alle Spalten werden direkt untereinander ausgedruckt.
Bsp.:
1|5|3|6
9|7|2|1
4|4|5|3
3|4|7|8
wird so gedruckt:
1
9
4
3
5
7
4
4
3
2
5
7
6
1
3
8
Horschdware - Mi 21.09.11 11:28
Kleiner Tip: Für was steht denn das "ln" in Writeln? ;-)
Goaznic - Mi 21.09.11 11:38
keine Ahnung. Für Line? :'D
Jedenfalls schreibt er mir die spalten nebeneinander in einer zeile, wenn ich das ln weg lasse ...
und untereinander in einer spalte, wenn ich es verwende.
Horschdware - Mi 21.09.11 12:45
Genau richtig!
Write schreibt einfach hintereinander Text.
Writeln (ln = line) schreibt einen Text und führt dann einen Zeilenumbruch aus.
Um dein Gitter auszugeben musst du nun einfach erst einmal die Zeichen einer Zeile ausgeben und dann einen Zeilenumbruch.
Pseudocode
1: 2: 3: 4: 5:
| für alle y tue für alle x in y tue drucke zeichen[x,y] wenn x = letzte spalte dann drucke zeilenumbruch |
Wahlweise kannst du nach jedem Zeichen noch ein Trennzeichen drucken und so weiter und so fort.
edit: typo
Goaznic - Mi 21.09.11 13:04
Also müsste das dann quasi so aussehen?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| for I := 0 to RowCount - 1 do for e := 0 to ColCount - 1 do begin s := Format('%-1s', [Cells[e, I]]); Write(F, s); if e = ColCount - 1 then writeln(F, s); end |
Horschdware - Mi 21.09.11 13:11
Fast.
Die letzte Spalte würde nun immer zwei mal ausgegeben werden, da writeln ja nicht NUR einen Zeilenumbruch schreibt, sondern Text + Zeilenumbruch, du aber bereits davor das Zeichen ausgegeben hast.
Schiebe dein erstes "Write" unten in den Else-Zweig oder gib dem Wirteln dein Zeichen in s nicht mit.
Btw: Probiers doch einfach mal aus ;-)
Goaznic - Mi 21.09.11 13:17
Oh ja, jetzt funktioniert's. :)
Danke. ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!