AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Funktion zum Drucken eines TreeViews macht Probleme
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion zum Drucken eines TreeViews macht Probleme

Ein Thema von leddl · begonnen am 18. Apr 2005 · letzter Beitrag vom 24. Apr 2005
Antwort Antwort
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, 17: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
Benutzerbild von leddl
leddl

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

Re: Funktion zum Drucken eines TreeViews macht Probleme

  Alt 20. Apr 2005, 00:55
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!

* push *
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
Benutzerbild von leddl
leddl

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

Re: Funktion zum Drucken eines TreeViews macht Probleme

  Alt 21. Apr 2005, 23:46
Gibts das hier auch?
Keiner will/kann mir antworten? Nich mal ein simples "Hör auf mit dem Scheiß pushen und mach dich mal gscheite Druckfunktion!"?

Hat denn keiner ne Idee was da faul sein könnte?
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
Benutzerbild von leddl
leddl

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

Re: Funktion zum Drucken eines TreeViews macht Probleme

  Alt 24. Apr 2005, 10:23
So langsam glaub ich, ich werd hier ignoriert. Hier gibts doch genug Cracks, die ne Ahnung von der Chose haben, oder?
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
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Funktion zum Drucken eines TreeViews macht Probleme

  Alt 24. Apr 2005, 12:19
Stelle bitte die procedure PrintLine() online oder sage zumindest, was du mit dem boolschen Parameter steuerst.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

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

Re: Funktion zum Drucken eines TreeViews macht Probleme

  Alt 24. Apr 2005, 12:53
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!
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.
Funktioniert jetzt wunderbar. Also trotzdem danke für deine Antwort. Is ja schön, daß sich zumindest einer hier noch gemeldet hat.
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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz