Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Funktion zum Drucken eines TreeViews macht Probleme (https://www.delphipraxis.net/44373-funktion-zum-drucken-eines-treeviews-macht-probleme.html)

leddl 18. Apr 2005 16:39


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:
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;
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.
Delphi-Quellcode:
(hoehe - (2* randoben)
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!

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.

leddl 19. Apr 2005 23:55

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 *

leddl 21. Apr 2005 22:46

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?

leddl 24. Apr 2005 09:23

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:

marabu 24. Apr 2005 11:19

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

leddl 24. Apr 2005 11:53

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