Einzelnen Beitrag anzeigen

Benutzerbild von leddl
leddl

Registriert seit: 13. Okt 2003
Ort: Künzelsau
1.613 Beiträge
 
Delphi 2006 Professional
 
#1

Funktion zum Drucken eines TreeViews macht Probleme

  Alt 18. Apr 2005, 16:39
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.
(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.
Axel Sefranek
A programmer started to cuss, cause getting to sleep was a fuss.
As he lay there in bed, looping round in his head
was: while(!asleep()) ++sheep;
  Mit Zitat antworten Zitat