TChart Drucken



  • Hallo ^^

    also, zwar habe ich das thema 2x gefunden, geholfen hats mir aber nichts :S

    Die Hauptfrage ist: Wie kann ich das Chart mit Hilfe eines beliebigen Drucker drucken? mit dem eingestellten Standartdrucker funktioniert es wunderbar 😉

    folgendes habe ich gemacht und die aufgetretenen probleme sind als kommentare
    geschrieben:

    if (PrintDialog1->Execute())
       {
          Chart1->Print();
       }
    
    // Ausgabe nicht mit einem anderen Drucker möglich, obwohl der Dialog geöffnet wird
    
       Printer()->Orientation = poLandscape;           
       PrintDialog1->Execute();
       Printer()->BeginDoc();
       Chart1->PaintTo(Printer()->Handle,200,200);      
       Printer()->EndDoc();
    
    //Ausdruck geht, aber Chart viiiiel zu klein ;)
    
       if(PrintDialog1->Execute())
       {
         Chart1->PrintMargins = TRect(0,0,0,0);
         Chart1->PrintResolution = 0;
         Chart1->Print();
       }
    // Auch hier: Ausgabe nicht mit einem anderen Drucker möglich, obwohl der Dialog geöffnet wird
    

    procedure ChartPreview(AForm: TForm; AChart: TChart);
    habe ich noch gefunden, scheint aber bei mir im bcb6 nicht definiert zu sein?
    oder habe ich da eine Bibliothek, die ich noch einbinden muss?

    mfg
    wolfshuendchen



  • Am Besten funktioniert das Drucken über ein Metafile. Da gab es bei Steema mal einen FAQ-Beitrag dazu den ich derzeit aber nicht finden. Hier mal die Variante, die ich anwende.

    if( ChartPrintDlg->Execute())
    {
        Controls::TBevelCut oldbevel = chart->BevelOuter;
        chart->BevelOuter = Controls::bvNone;
        TColor oldcolor = chart->Color;
        chart->Color = clNone;
        std::auto_ptr<TMetafile> tmpmeta(chart->TeeCreateMetafile( true, chart->ClientRect));
        int width, height;
        try
        {
            Printer()->Orientation = Printers::poLandscape;
            int pw(Printer()->PageWidth), ph(Printer()->PageHeight);
            width = pw-20;
            double fact = width*1.0/tmpmeta->Width;
            height = tmpmeta->Height*fact;
            if( (height + 100) > ph)
            {
               height = ph - 110;
               width = width*fact;
            }
            Printer()->BeginDoc();
            Printer()->Canvas->StretchDraw(Rect(10,100,width+10, height+100), tmpmeta.get();
            Printer()->EndDoc();
        }
        __finally
        {
            chart->BevelOuter = oldbevel;
            chart->Color = oldcolor;
        }
    }
    


  • okay..
    von einem Metafile hab ich noch nichts gelesen..
    und deinen code übernehmen kann ich auch nicht 😉
    da gewisse fehlermeldungen bei mir auftauchen, die ich selbst nicht zu lösen scheinen kann ^^'

    ich schreib sie mal auf, dann weisst du welche:

    [C++ Error] measure.cpp(183): E2316 'auto_prt' is not a member of 'std'
    [C++ Error] measure.cpp(183): E2108 Improper use of typedef 'TMetafile'
    [C++ Error] measure.cpp(183): E2268 Call to undefined function 'tmpmeta'
    [C++ Error] measure.cpp(190): E2288 Pointer to structure required on left side of -> or ->*
    [C++ Error] measure.cpp(191): E2288 Pointer to structure required on left side of -> or ->*
    [C++ Error] measure.cpp(198): E2294 Structure required on left side of . or .*

    Zeile 183:
    std::auto_prt<TMetafile> tmpmeta(Chart1->TeeCreateMetafile( true, Chart1->ClientRect));

    Zeile 190, 191:
    double fact = width1.0/tmpmeta->Width;
    height = tmpmeta->Height
    fact;

    Zeile 198:
    Printer()->Canvas->StretchDraw(Rect(10,100,width+10, height+100), tmpmeta.get());

    mfg
    wolfshuendchen



  • Um auto_ptr nutzen zu können brauchst du noch ein
    #include <memory>
    Die anderen Fehler sind Folgefehler.



  • wolfshuendchen schrieb:

    [C++ Error] measure.cpp(183): E2316 'auto_prt' is not a member of 'std'

    Also richtig abschreiben sollteste schon.



  • Das außerdem. 🙂



  • witte schrieb:

    wolfshuendchen schrieb:

    [C++ Error] measure.cpp(183): E2316 'auto_prt' is not a member of 'std'

    Also richtig abschreiben sollteste schon.

    also wenn ich das abschreiben würde wäre ich ja wohl nicht ganz bei sinnen!
    hab mich da nur kurz gefragt, ob vielleicht prt statt ptr von wegen print..
    😉

    aber geht immernoch nicht :S
    es taucht derselbe fehler auf wie bei den einfacheren beispielen
    (erste post, versuch 1 und 3 😉 )
    ich mach mal printscreen!

    cpubeimdrucken.bmp (1.2 MB)



  • Wie sieht jetzt dein Code aus?



  • so wie deiner, nur eben mit dem memory und der kleinen verbesserung beim einten fehler !



  • Das Problem ist, dass dein Ausdruck zu klein ist?
    Geh mal mit dem Debugger durch und schau dir width und height an.



  • also.. anfangs war es so:

    width = 11; height =3; (Zufallswerte)

    dann hab ich nachgesehn vor der if abfrage

    width = 6749; height = 4233;

    dasselbe noch, wenn ich vor dem Printer()->BeginDoc(); stoppe
    (ph = 4760)

    und die if-Schleife wird auch durchlaufen 😉



  • Das sieht eigentlich gut aus. Ohne deinen Code jetzt direkt testen zu können weiß ich auch nicht weiter.
    Der von mir gezeigte Code funktioniert bei mir bis jetzt auf allen möglichen Druckern.



  • Ich kann mich nicht erinnern, in deinem Code wirklich was verändert zu haben..
    eventuell wird das Diagramm vom Chart mit falschen grössen übergeben?
    wäre das möglich?

    void __fastcall TForm1::BPrintGraphClick(TObject *Sender)
    {
    if( PrintDialog1->Execute())
    {
        Controls::TBevelCut oldbevel = Chart1->BevelOuter;
        Chart1->BevelOuter = Controls::bvNone;
        TColor oldcolor = Chart1->Color;
        Chart1->Color = clNone;
        std::auto_ptr<TMetafile> tmpmeta(Chart1->TeeCreateMetafile( true, Chart1->ClientRect));
        int width, height;
        try
        {
            Printer()->Orientation = Printers::poLandscape;
            int pw(Printer()->PageWidth), ph(Printer()->PageHeight);
            width = pw-20;
            double fact = width*1.0/tmpmeta->Width;
            height = tmpmeta->Height*fact;
            if( (height + 100) > ph)
            {
               height = ph - 110;
               width = width*fact;
            }
            Printer()->BeginDoc();
            Printer()->Canvas->StretchDraw(Rect(10,100,width+10, height+100), tmpmeta.get());
            Printer()->EndDoc();
        }
        __finally
        {
            Chart1->BevelOuter = oldbevel;
            Chart1->Color = oldcolor;
        }
    }
    }
    


  • Ich sehe hier keinen Fehler.
    Hier ist übrigens der Orginal-FAQ-Text
    http://www.steema.com/support/faq/NewVCL/FAQ_VCL_PRINTING.htm
    Was für eine TeeChart-Variante verwendest du denn?



  • TChart Standardversion 4.04
    (war im CBuilder Version 6 automatisch drin) ^^

    gibt es da wirklich so grosse unterschiede? ô.O



  • Die Standardversion war gegenüber der Pro-version schon recht eingeschränkt. Ob es sich jetzt auch darauf bezieht weiß ich nicht. Ich kann deinen Code dann auch nicht richtig testen, da derzeit nur noch die Versionen 5.0Pro und 8.04Pro auf meinem Rechner habe.


Anmelden zum Antworten