![]() |
Funktion zum Drucken eines TreeViews macht Probleme
Servus!
Ich habe vor einiger Zeit für jemanden ein Programm geschrieben. Vor kurzem kam der User auf mich zu und meinte, er hätte einen Fehler bei der Druckfunktion entdeckt. Und zwar wird hier ein TreeView ausgedruckt. Das klappt soweit ganz gut. Nur wenn es in Richtung des Seitenendes geht, scheint diese Funktion zu spinnen. Danach wird für jedes einzelene TV-Element (also auch für die Child-Nodes) eine neue Seite begonnen. Diesen Fehler konnte ich zwar durch einen kleinen Eingriff beheben, allerdings ist mir nicht klar, warum genau das, was ich gemacht habe, zur Lösung geführt hat. Hier jetzt erstmal die Funktion, danach nochmal etwas mehr Text. ;)
Delphi-Quellcode:
Ich frage bei jedem Knotenpunkt nach dem Setzen der y-Variable ab, ob ich bereits aus dem gewünschten Seitenbereich raus bin. Falls ja, dann soll er y wieder auf den Anfangswert setzen und eine neue Seite beginnen. Tut auch so, wie es hier steht, nur habe ich so unten einen riesigen Rand, da ich eben 2 mal den oberen Rand von der Gesamthöhe abziehe.
procedure TGesamtAbrechnungForm.Drucken;
var x, y: integer; randlinks, randoben, breite, hoehe : integer; Knoten,Knotenkind : TTreeNode; Begin Printer.BeginDoc; SetMapMode(Printer.Canvas.Handle, MM_LOMETRIC); //Umstellen auf 1/10 mm //Schrift-Einstellungen: Printer.Canvas.Font.Name := 'Courier New'; Printer.Canvas.Brush.Color := clWhite; Printer.Canvas.Font.Style := [fsbold]; Printer.Canvas.Font.Height := 50; //5 mm //Blattgröße in 1/10 mm ermitteln: breite := GetDeviceCaps(Printer.Canvas.Handle, HORZSIZE) * 10; hoehe := GetDeviceCaps(Printer.Canvas.Handle, VERTSIZE) * 10; randlinks := 150; //1,5 cm randoben := 250; //2,5 cm x := randlinks; y := randoben * -1; //Schreiben der ersten Überschrift Printer.Canvas.Font.Style := [fsbold,fsUnderline]; Printer.Canvas.Font.Height := 60; Printer.Canvas.TextOut(x,y,'Gesamtabrechnung vom ' + DateToStr(Now)); dec(y,100); //Schreiben des ersten TV-Elements Printer.Canvas.Font.Style := [fsbold]; Printer.Canvas.Font.Height := 50; Knoten := AbrechnungTV.Items.GetFirstNode; PrintLine(randlinks,y,Knoten.Text,true); If Knoten.getFirstChild <> NIL Then Begin dec(y,60); Knotenkind := Knoten.getFirstChild; PrintLine(randlinks + 70,y,Knotenkind.Text,false); While Knotenkind <> Knoten.GetLastChild Do Begin dec(y,60); If (-y > (hoehe - (2* randoben))) Then Begin y := randoben * -1; Printer.NewPage; end; Knotenkind := Knotenkind.GetNextSibling; PrintLine(randlinks + 70,y,Knotenkind.Text,false); End; End; //Schreiben der restlichen Elemente While Knoten.GetNextSibling <> NIL Do Begin dec(y,80); If (-y > (hoehe - (2* randoben))) Then Begin y := randoben * -1; Printer.NewPage; end; Knoten := Knoten.getNextSibling; PrintLine(randlinks,y,Knoten.Text,true); If Knoten.getFirstChild <> NIL Then Begin dec(y,60); If (-y > (hoehe - (2* randoben))) Then Begin y := randoben * -1; Printer.NewPage; end; Knotenkind := Knoten.GetFirstChild; PrintLine(randlinks + 70,y,Knotenkind.Text,false); While Knotenkind <> Knoten.GetLastChild Do Begin dec(y,60); If (-y > (hoehe - (2* randoben))) Then Begin y := randoben * -1; Printer.NewPage; end; Knotenkind := Knotenkind.getNextSibling; PrintLine(randlinks + 70,y,Knotenkind.Text,false); End; End; End; Printer.EndDoc; End;
Delphi-Quellcode:
Lasse ich das 2 * weg, dann kommt wieder oben erwähnter Fehler, also für jedes Item eine neue Seite. Wie kann das alles sein? Ich versteh die Welt nicht mehr!
(hoehe - (2* randoben)
Falls jemand ne bessere Methode kennt, ein TreeView auszudrucken, dann immer her damit. Ich hab mir das vor mittlerweile bestimmt nem Jahr irgendwo zusammengeklaubt und hatte vorher noch nie was mit Printer oder Canvas zu tun gehabt. Und wenn ichs mir genau überlege, bin ich inzwischen auch nicht sehr viel weiter. Naja, aber primär würde ich einfach gerne wissen, warum das nur mit diesem Mega-Rand funktioniert. |
Re: Funktion zum Drucken eines TreeViews macht Probleme
:( Kann da wirklich keiner was zu sagen? Ich weiß, is ein seltsamer Fehler, dazu viel Text und ein furchtbarer Quellcode... aber ihr schafft doch sonst auch alles! :mrgreen:
* push * |
Re: Funktion zum Drucken eines TreeViews macht Probleme
Gibts das hier auch? :gruebel:
Keiner will/kann mir antworten? Nich mal ein simples "Hör auf mit dem Scheiß pushen und mach dich mal gscheite Druckfunktion!"? :mrgreen: Hat denn keiner ne Idee was da faul sein könnte? |
Re: Funktion zum Drucken eines TreeViews macht Probleme
:cry: So langsam glaub ich, ich werd hier ignoriert. Hier gibts doch genug Cracks, die ne Ahnung von der Chose haben, oder? :dp:
|
Re: Funktion zum Drucken eines TreeViews macht Probleme
Stelle bitte die procedure PrintLine() online oder sage zumindest, was du mit dem boolschen Parameter steuerst.
Grüße vom marabu |
Re: Funktion zum Drucken eines TreeViews macht Probleme
Danke für deine Antwort, aber das hat sich in der letzten Stunde von alleine gelöst. Da pusht man 6 Tage lang seinen Thread und hat die Lösung direkt vor den Augen! :wall:
Da hätt ich auch schon gleich drauf kommen können. Der Fehler lag in der von dir nachgefragten Prozedur PrintLine. Die war einfach da, um eben den Seitenumbruch zu gestalten. Nur hatte ich das nach der langen langen Zeit total vergessen. :oops: Funktioniert jetzt wunderbar. Also trotzdem danke für deine Antwort. Is ja schön, daß sich zumindest einer hier noch gemeldet hat. ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:32 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-2025 by Thomas Breitkreuz