![]() |
drucken einer tabelle ?!
hallo,
ich hab folgendes etwas komplexeres problem: ich hab ein stringgrid, das ich ausdrucken möchte. allerdings möchte ich dazu -zeilenumrüche innerhalb der zellen beachten -vertikale und horizontale trennlinien zeichnen -das ganze auch als durckvorschau anzeigen -das ganze überhaupt drucken ;-) :-( so. jetzt hab ich aber ewig nach funktionen zum zeilenumbruch im internet gesucht und es dann selbst gemacht. (wer interesse daran hat, kann sich ja bei mir melden) dabei wird eine tabelle übergeben und jede zelle wird durchlaufen... dann wird die so neu entstandene tabelle in ein array gespeichert. soviel dazu! jetzt hab ich aber das problem das ich die tabelle natürlich auch noch drucken muss! dazu hab ich folgenden code verfasst:
Delphi-Quellcode:
allerdings ist da irgendwo n fehler drin, da:
...
//typdefinierung für eine zelle der tabelle "table" type TZelle = record rownr: Word; text: ShortString; end; const //abstand von links (randbreite) lrand = 20; //abstand von oben orand = 20; //abstand von unten urand = 20; var //größen der einzelnen spalten der tabelle (grafisch) cwidths, temp: array of Byte; //tabelle mit den umgebrochenen zelleninhalten table: array of array of TZelle; //tabelle mit den fertigen drucktabellen //größe der tabelle + 1 tpos: Word; //anzahl der zellen colpos: Word; ... //diese prozedur wird aufgerufen, um die tabelle zu drucken procedure Tfrmprnt.make_printing; var i: Word; //zählvariable begin with Printer do begin //druckauftrag beginnen BeginDoc; //druckbild auf "horizontal" stellen Orientation := poPortrait; //jede zeicheneinheit des canvas auf 0.1 mm festlegen positive x nach rechts // positive y nach oben SetMapMode(Handle, MM_LOMETRIC); //seitenbreite und - höhe festlegen pgwidth := GetDeviceCaps(Handle, HorzSize); pgheight := GetDeviceCaps(Handle, VertSize); //wenn die tabellenbreite > als seitenbreite bei druckbild = "horizontal" if (temp[colpos - 1] + 2 * lrand) > pgwidth then begin //druckbild auf "vertikal" umstellen Orientation := poLandscape; //jede zeicheneinheit des canvas auf 0.1 mm festlegen positive x nach // rechts positive y nach oben -- kann vermutlich weggelassen werden!! SetMapMode(Handle, MM_LOMETRIC); //seitenbreite und -höhe neu festlegen pgwidth := GetDeviceCaps(Handle, HorzSize); pgheight := GetDeviceCaps(Handle, VertSize); end //y = oberer rand = 20mm y := -orand; //titel des ausdrucks drucken print_title; //tabellenkopf schreiben print_line(1, true); //jede zeile der tabelle schreiben for i := 2 to tpos - 1 do begin //überprüfen, ob trennlinie gezogen werden soll (wegen zeilenumbrüchen!!!) if i > 2 then if table[i, 1].rownr <> table[i - 1, 1].rownr then print_line(i, true) else print_line(i, false); //wenn am rand unten angekommen neu seite beginnen if y < -(pgheight - urand) then begin break; //warum das weis ich nicht (steht so im kochbuch delphi6) //neue seite auf dem drucker erstellen NewPage; //y neu festlegen y := - orand; //jede zeicheneinheit des canvas auf 0.1 mm festlegen positive x nach // rechts positive y nach oben SetMapMode(Handle, MM_LOMETRIC); //tabellenheader erneut drucken print_line(1, true); end; end; //druckauftrag abschließen EndDoc; end; end; //diese prozedur wird aufgerufen, um den titel zu schreiben procedure Tfrmprnt.print_title; begin with Printer.Canvas do begin //größe und aussehen der schrift festlegen Font.Size := 4 * 10; //* 10, da 0.1mm ;-) Font.Style := [fsbold]; // SetTextAlign(Printer.Handle, TA_RIGHT + TA_TOP); //titel schreiben TextOut((pgwidth * 10 - TextWidth(title)) div 2, y * 10, title); end; //mit schreiber um 20 nach unten gehen dec(y, 20); end; //diese prozedur wird aufgerufen, um text rechtsbündig zu schreiben //x: position auf x-achse; txt: zu druckender text procedure Tfrmprnt.print_right(x: Word; txt: ShortString); begin //schreiber auf rechts oben ausrichten SetTextAlign(Printer.Handle, TA_RIGHT + TA_TOP); //text schreiben Printer.Canvas.TextOut(lrand * 10 + x * 10, y * 10, txt); end; //diese prozedur wird aufgerufen, um die zeile i der tabelle zu drucken procedure Tfrmprnt.print_line(i: Word; rowend: Boolean); var j: Byte; //zählvariable begin with Printer.Canvas do begin //größe und aussehen der schrift festlegen Font.Height := 2 * 10; Font.Style := []; //jede zelle schreiben for j := 1 to colpos - 1 do print_right(temp[j], table[i, j].text); //mit schreiber um drei nach unten gehen dec(y, 3); //wenn ende der "zeileneinheit" (da mit zeilenumbruch) if rowend = true then begin //stiftgröße festlegen Pen.Width := 1; //linie vertikal zeichnen MoveTo(lrand * 10, y * 10); LineTo(prntwidth * 10, (y - 2) * 10); end; end; end; -die schriftgröße völlig überdimensional ist -die tabelle nicht zu erkennen ist, da alles übereinander geschrieben wird kann mir jemand einen tipp geben, oder sagen wo der hund hängt? (oder auch nen neuen vorschlag achen) ps: -mit quickreport wollt ichs nicht machen, da die vertikalen striche nicht richtig dargestellt werden (ein problem für sich...) und die exe sonst zu groß werden würde! -die vertikalen striche werden bis jetzt auch bei mir noch nicht behandelt! hoffe ich hab keine variablendefinitionen ausgelassen, etc. ;-) |
Re: drucken einer tabelle ?!
ja hallo noch mal!
hab jetzt einige fehler gefunden und behoben, allerdings hab ich folgendes noch nicht gelöst: die breiten der stringridspalten werden ja in ein array gespeichert. so will ich dann die linke "druckentfernung" brechnen. jetzt hab ich aber gemerkt, dass die breitenangabe ja einfach von tabelle.colwidth[x] übernommen wird und deshalb in "pixel" ist!!! wie kann ich also diese angabe in 0.1mm umrechnen?!? tschüss, heiopei |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:47 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