IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Exporter une form en Bmp ET Impression


Sujet :

C++Builder

  1. #1
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut Exporter une form en Bmp ET Impression
    bonjours,

    Jai regardé plusieur topic sur le forum a ce suget mais aucun na fonctionné dans mon cas.

    Voila, jai une form contenant un TChart et plusieur autre objet.
    Je souhaiterais limprimé, etant donné que jai plusieur form contenant a peu pré les meme info, jai créer une form qui me sert a limpresion

    Voila mon code d'impression :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    void __fastcall TForm3::BitBtn1Click(TObject *Sender)
    {
            FormImpre->LabelDate->Caption = FormatDateTime("ddd ' le ' d MMMM  yyyy", Now());
            FormImpre->Series1->Assign(Form3->Series1);
            FormImpre->Chart1->Title = Form3->Chart1->Title;
            FormImpre->LabelHeure->Caption = FormatDateTime("HH : mm",Now());
            FormImpre->Panel2->Visible = true;
            FormImpre->PanelPdTF1->Caption = Form3->PanelPdTF1->Caption;
            FormImpre->PanelPfTF1->Caption = Form3->PanelPfTF1->Caption;
            FormImpre->PanelDiffTF1->Caption = Form3->PanelDiffTF1->Caption;
            FormImpre->PrintScale = poPrintToFit;
            FormImpre->Print();
            FormImpre->Panel2->Visible = false;
    }
    donc sa, sa fonctionne nikel

    Maintenant je voudrais exporté limage de la form, exactement ce que jai imprimé, juste en metant masquant 2 label (mais sa c'est pas un prob lol)

    Jai esseyé avec la fonction ImprimEcran que jai trouvé dans les sources, mais linconvéniant c'est qu'il faut que jaffiche la form, et meme parfois limage qui est généré na pas certain label :s
    Jai eseyé avec un Tbitmap mais jai pas réusi
    Je voudrais créer limage de la form , mais sans devoir l'affiche pff

    sa fais 2h que je me casse la tete desus

    Cordialement Baxter
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  2. #2
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    jai trouvé une solution je croie que c'est la bonne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Graphics::TBitmap *Bitmap = new Graphics::TBitmap;
            Bitmap = FormImpre->GetFormImage();
            Bitmap->SaveToFile("salut.bmp");
            delete Bitmap;
    vous en pensez quoi ?
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  3. #3
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    Quelqu'un connaitrais t'il une meileur méthode pour imprimé une form contenant un tchart et dautre objet

    Jai en tous 4 form donc 4 courbe (TChart un sur chaque form)

    Un coup sa imprime nikel un coup Je ne vois pas le TChart de la FormImpre sur ce qui sortt a limprimante ni sur le bpm que jai exporté
    pff je galére, aidez moi sil vous plait


    code pour limpression par bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    void __fastcall TForm3::BitBtn1Click(TObject *Sender)
    {
            FormImpre->LabelDate->Caption = FormatDateTime("ddd ' le ' d MMMM  yyyy", Now());
            FormImpre->Series1->Clear();
            FormImpre->Series1->Assign(Form3->Series1);
            FormImpre->Chart1->Title = Form3->Chart1->Title;
            FormImpre->LabelHeure->Caption = FormatDateTime("HH : mm",Now());
            FormImpre->Panel2->Visible = true;
            FormImpre->PanelPdTF1->Caption = Form3->PanelPdTF1->Caption;
            FormImpre->PanelPfTF1->Caption = Form3->PanelPfTF1->Caption;
            FormImpre->PanelDiffTF1->Caption = Form3->PanelDiffTF1->Caption;
            FormImpre->PrintScale = poPrintToFit;
            FormImpre->Print();
            FormImpre->Panel2->Visible = false;
    }
    code pour limpression en automatique commandé par l'automate en openmodbus :
    (c'est dans un thread indépendant)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    while(Form1->bFinThread)
            {
                //GESTION COURBE TEMPERATURE FILTRE 1
                    if(AccesDataRead(4010,2)==1)       //Effacement des valeur
                            Form3->Series1->Clear();
                    if(AccesDataRead(4011,2)==1  &&  Form1->TabFrontPourImpression[cTempFiltre1] == 0)
                    {
                            //exportation de la courbe  et impression
                            FormImpre->LabelDate->Caption = FormatDateTime("ddd ' le ' d MMMM  yyyy", Now());
                            FormImpre->Series1->Clear();
                            FormImpre->Series1->Assign(Form3->Series1);
                            FormImpre->Chart1->Title = Form3->Chart1->Title;
                            FormImpre->LabelHeure->Caption = FormatDateTime("HH : mm",Now());
                            FormImpre->Panel2->Visible = true;
                            FormImpre->Chart1->Visible = true;
                            FormImpre->PanelPdTF1->Caption = Form3->PanelPdTF1->Caption;
                            FormImpre->PanelPfTF1->Caption = Form3->PanelPfTF1->Caption;
                            FormImpre->PanelDiffTF1->Caption = Form3->PanelDiffTF1->Caption;
                            FormImpre->PrintScale = poPrintToFit;
                            FormImpre->Print();
                            FormImpre->LabelDate->Caption = "";
                            FormImpre->LabelHeure->Caption = "";
                            ExporterFormImpre("TempFiltre1/TF1"+FormatDateTime("ddmmyy'_'hhmm",Now())+".bmp");
                            FormImpre->Panel2->Visible = false;
                            Form1->TabFrontPourImpression[cTempFiltre1] = 1;
                    }
                    if(AccesDataRead(4011,2)==0 && Form1->TabFrontPourImpression[cTempFiltre1] == 1)
                            Form1->TabFrontPourImpression[cTempFiltre1] = 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void ExporterFormImpre(AnsiString Nom)
    {
      Graphics::TBitmap *Bitmap = new Graphics::TBitmap;
            Bitmap = FormImpre->GetFormImage();
            Bitmap->SaveToFile(Nom);
            delete Bitmap;
    }
    Cordialement baxter
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  4. #4
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    apperement en fesant sa, sa marche mieux, mais bon c'est pas sur encore, parceque avant sa marchais aussi parfois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FormImpre->Series1->AssignValues(Form3->Series1);
    A des moment la page qu'il m'imprime est entierement grise :s
    et le coup d'apres sa marche nikel

    pfff prise de tete ce truc

    Mais si quelqu'un a une meilleur idée je suis ouvert a toute suggestion

    COrdialement Baxter
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  5. #5
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    Ils ne savaient pas que c'était impossible alors ils l'ont fait (Mark Twain)
    _ _ _ _ _ _ _ _ _

    La planète ne nous appartient pas, elle nous a été prêtée par nos enfants
    _ _ _ _ _ _ _ _ _

    Technos : Access, C++ Builder, SQL, PostgreSQL, Crystal Reports, XML entre autres

  6. #6
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut Baxter67
    Pour imprimer une Form avec tout ce qui est pose dessus tu peut essayer ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    TRect rd;
    TPrinter *Prntr = Printer();
    rd = Rect(0, 0, Prntr->PageWidth, Prntr->PageHeight);
      Graphics::TBitmap *Bitmap = new Graphics::TBitmap;
            Bitmap = Form1->GetFormImage();
    // pour eviter une page blanche ajouter la ligne suivante
            Bitmap->PixelFormat = pf24bit; // a adapter
    //TPixelFormat {pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit, pfCustom}
    Prntr->BeginDoc();
    Prntr->Canvas->StretchDraw(rd, Bitmap);
    Prntr->EndDoc();
            delete Bitmap;
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  7. #7
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    ok j'essairais sa demain

    merci

    cordialement baxter
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  8. #8
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    bon avec ta méthode, jai limpression que l'impression marche mieux .

    Mais y a des fois je voie pas le TChart de la FormImpre ni sur ce qui est imprimé, ni sur le bmp exporté grrr

    Une idée ?

    Cordialement Baxter
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  9. #9
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    personne n'a une idée de génié ?
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Vérifier si la form est totalement dessinée avant l'opération ???
    C'est juste une idée... dès fois que... juste histoire de passer pour un génie (pendant un temps très court certes, mais... ça compte dans la vie) !

    Autre chose qui compte également, et ça concerne le forum, c'est "orthographe" !

    A plus !

  11. #11
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    Et comment tu vérifie que la form est entierement déssiné ?
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  12. #12
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    personne pour m'aidé s'il vous plait ???
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  13. #13
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    J'ai esseyé comme sa :

    Code du bouton Imprimé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            FormImpre->LabelDate->Caption = FormatDateTime("ddd ' le ' d MMMM  yyyy", Now());
            Form3->Chart1->SaveToBitmapFile("FichierRessource/ImgImprim.bmp");
            FormImpre->Image2->Picture->LoadFromFile("FichierRessource/ImgImprim.bmp");
            DeleteFile("FichierRessource/ImgImprim.bmp");
            FormImpre->LabelHeure->Caption = FormatDateTime("HH : mm",Now());
            FormImpre->Panel2->Visible = true;
            FormImpre->PanelPdTF1->Caption = Form3->PanelPdTF1->Caption;
            FormImpre->PanelPfTF1->Caption = Form3->PanelPfTF1->Caption;
            FormImpre->PanelDiffTF1->Caption = Form3->PanelDiffTF1->Caption;
            ImprimerFormImpre();
            FormImpre->Panel2->Visible = false;
    Code de l'impression automatique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    while(Form1->bFinThread)
            {
     
                //GESTION COURBE TEMPERATURE FILTRE 1
                    if(AccesDataRead(4010,2)==1)       //Effacement des valeur
                            Form3->Series1->Clear();
                    if(AccesDataRead(4011,2)==1  &&  Form1->TabFrontPourImpression[cTempFiltre1] == 0)
                    {
                            //exportation de la courbe  et impression
                            FormImpre->LabelDate->Caption = FormatDateTime("ddd ' le ' d MMMM  yyyy", Now());
                            Form3->Chart1->SaveToBitmapFile("FichierRessource/ImgImprim.bmp");
                            FormImpre->Image2->Picture->LoadFromFile("FichierRessource/ImgImprim.bmp");
                            DeleteFile("FichierRessource/ImgImprim.bmp");
                            FormImpre->LabelHeure->Caption = FormatDateTime("HH : mm",Now());
                            FormImpre->Panel2->Visible = true;
                            FormImpre->PanelPdTF1->Caption = Form3->PanelPdTF1->Caption;
                            FormImpre->PanelPfTF1->Caption = Form3->PanelPfTF1->Caption;
                            FormImpre->PanelDiffTF1->Caption = Form3->PanelDiffTF1->Caption;
                            ImprimerFormImpre("TempFiltre1/TF1"+FormatDateTime("ddmmyy'_'hhmm",Now())+".bmp");
                            FormImpre->Panel2->Visible = false;
                            Form1->TabFrontPourImpression[cTempFiltre1] = 1;
                    }
                    if(AccesDataRead(4011,2)==0 && Form1->TabFrontPourImpression[cTempFiltre1] == 1)
                            Form1->TabFrontPourImpression[cTempFiltre1] = 0;
    }
    Fonctions d'impression :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    void ImprimerFormImpre(AnsiString Nom)
    {
      TRect rd;
      TPrinter *Prntr = Printer();
     
            rd = Rect(0, 0, Prntr->PageWidth, Prntr->PageHeight);
            Graphics::TBitmap *Bitmap = new Graphics::TBitmap;
     
            Bitmap = FormImpre->GetFormImage();
            // pour eviter une page blanche ajouter la ligne suivante
            Bitmap->PixelFormat = pf24bit; // a adapter
            //TPixelFormat {pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit, pfCustom}
            Prntr->BeginDoc();
            Prntr->Canvas->StretchDraw(rd, Bitmap);
            Prntr->EndDoc();
     
            Bitmap->Canvas->Brush->Color=clWhite;
            Bitmap->Canvas->FillRect(Rect(592,450,800,600));
     
            Bitmap->SaveToFile(Nom);
            delete Bitmap;
     
    }
    //---------------------------------------------------------------------------
    void ImprimerFormImpre()
    {
      TRect rd;
      TPrinter *Prntr = Printer();
     
            rd = Rect(0, 0, Prntr->PageWidth, Prntr->PageHeight);
            Graphics::TBitmap *Bitmap = new Graphics::TBitmap;
     
            Bitmap = FormImpre->GetFormImage();
            // pour eviter une page blanche ajouter la ligne suivante
            Bitmap->PixelFormat = pf24bit; // a adapter
            //TPixelFormat {pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit, pfCustom}
            Prntr->BeginDoc();
            Prntr->Canvas->StretchDraw(rd, Bitmap);
            Prntr->EndDoc();
            delete Bitmap;
    }

    Mais sa marche toujours pas a tous les coup
    Il y a des fois le Chart de la Form3 disparais complétement (la form3 est la form que jaffiche, ou la courbe se trace)
    Je précise que, quand je lance limpression la courbe ne trace plus.

    Aidez moi SVP
    Cordialement Baxter
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  14. #14
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Salut je ne sait pas si sa peut t'aider (j'ai pas lus toutes la discussion), mais j'ai trouvé un composant Delphi 5.0 gratuit qui imprime une form complète: http://www.efg2.com/Lab/Library/Delp...on_BDPrint.zip

    Sinon, encore en Delphi, tu peux aller voir un code qui imprime un bitmap tiré d'une form: http://www.efg2.com/Lab/Library/UseNet/1999/0512f.txt
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  15. #15
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    On pourrait éventuellement se dire que lorsque l'on trouve une bonne couleur pour certains pixels du bitmap le dessin est achevé.
    Si on n'a pas les bonnes couleurs on attend via une boucle.
    Ce que je donne ici n'est peut-être que schématique (voir si on ne peut pas faire autrement)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    Graphics::TBitmap *Temp = new Graphics::TBitmap;
     
    Again :
     
    Temp->Assign(FormN->GetFormImage()); // ça devrait le faire mais c'est à tester
     
    if( (Temp->Canvas->Pixels[...][...] != ...) || 
        (.....) ||
        (.....))
        { 
        int Start =  GetTickCount();
        while (( GetTickCount() - Start ) < 100) // 100 ms ou plus ???
            {
            //pour ne pas bloquer l'appli
            Application->ProcessMessages();
            }
        goto Again; // On reprend la photo !
        } 
    //... ici l'image est dans la boite !
    //On imprime.
     
    delete Temp;
    Autre chose : peut-être faudrait-il retirer les autres composants de la form et ne pas en rajouter.
    On a, en effet, la possiblité de dessiner directement sur le bitmap, une fois que la photo est bonne !
    Ca va éviter de générer en interne des messages qui pourraient retarder le dessin de l'essentiel : le graphe.
    Donc ça se ferait avant d'imprimer, pour envoyer l'ensemble, d'un seul coup !

    J'espère que l'idée est bonne !

    A plus !

  16. #16
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    Bon ben en m'inspirant de ta proposition j'ai esseyé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
    //---------------------------------------------------------------------------
    void ImprimerFormImpre(AnsiString Nom, TForm *Form)
    {
      TRect rd;
      TPrinter *Prntr = Printer();
     
            rd = Rect(0, 0, Prntr->PageWidth, Prntr->PageHeight);
            Graphics::TBitmap *Temp = new Graphics::TBitmap;
     
            Temp->Assign(Form->GetFormImage());
     
            int Start =  GetTickCount();
            while (( GetTickCount() - Start ) < 100) // 100 ms ou plus ???
            {
                    //pour ne pas bloquer l'appli
                    Application->ProcessMessages();
            }
     
            //DESSIN DES CADRE
     
            //Enleve le bouton Imprimé
            Temp->Canvas->Brush->Color=clWhite;
            Temp->Canvas->FillRect(Rect(592,450,800,600));
     
            //Enleve le bouton Retour
            Temp->Canvas->Brush->Color = clMenuBar;
            Temp->Canvas->FillRect(Rect(8,464,185,564));
     
            Temp->Canvas->Font->Color = clBlack;
            Temp->Canvas->Font->Size = 12;
            Temp->Canvas->Font->Name = "Arial";
            Temp->Canvas->TextOutA(12, 468, "Visa Chef d'équipe :");
            Temp->Canvas->TextOutA(12, 508, "Visa Oenologue :");
     
            Temp->SaveToFile(Nom);
     
            Temp->Canvas->Brush->Color = clWhite;
            Temp->Canvas->TextOutA(595, 468, FormatDateTime("ddd ' le ' d MMMM  yyyy", Now()));
            Temp->Canvas->TextOutA(595, 508, FormatDateTime("HH : mm",Now()));
     
            // pour eviter une page blanche ajouter la ligne suivante
            Temp>PixelFormat = pf24bit; // a adapter
            //TPixelFormat {pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit, pfCustom}
            Prntr->BeginDoc();
            Prntr->Canvas->StretchDraw(rd, Temp);
            Prntr->EndDoc();
            delete Temp;
    }
    //---------------------------------------------------------------------------
    void ImprimerFormImpre(TForm *Form)
    {
      TRect rd;
      TPrinter *Prntr = Printer();
     
            rd = Rect(0, 0, Prntr->PageWidth, Prntr->PageHeight);
            Graphics::TBitmap *Temp = new Graphics::TBitmap;
     
            Temp->Assign(Form->GetFormImage());
     
            int Start =  GetTickCount();
            while (( GetTickCount() - Start ) < 100) // 100 ms ou plus ???
            {
                    //pour ne pas bloquer l'appli
                    Application->ProcessMessages();
            }
     
     
            //DESSIN DES CADRE
     
            //Enleve le bouton Imprimé
            Temp->Canvas->Brush->Color=clWhite;
            Temp->Canvas->FillRect(Rect(592,450,800,600));
     
            //Enleve le bouton Retour
            Temp->Canvas->Brush->Color = clMenuBar;
            Temp->Canvas->FillRect(Rect(8,464,185,564));
     
            Temp->Canvas->Font->Color = clBlack;
            Temp->Canvas->Font->Size = 12;
            Temp->Canvas->Font->Name = "Arial";
            Temp->Canvas->TextOutA(12, 468, "Visa Chef d'équipe :");
            Temp->Canvas->TextOutA(12, 508, "Visa Oenologue :");
     
            Temp->Canvas->Brush->Color = clWhite;
            Temp->Canvas->TextOutA(595, 468, FormatDateTime("ddd ' le ' d MMMM  yyyy", Now()));
            Temp->Canvas->TextOutA(595, 508, FormatDateTime("HH : mm",Now()));
     
            // pour eviter une page blanche ajouter la ligne suivante
            Temp->PixelFormat = pf24bit; // a adapter
            //TPixelFormat {pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit, pfCustom}
            Prntr->BeginDoc();
            Prntr->Canvas->StretchDraw(rd, Temp);
            Prntr->EndDoc();
            delete Temp;
    }
    //---------------------------------------------------------------------------
    jai enlevé le test de bit parceque je ne sais pas trop quelles pixels testé

    Je vais tester voir si sa marche

    Cordialement Baxter
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  17. #17
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    bon bon bon,
    parfois sa marche, parfois y a pas de courbe ...
    parfois il exporte mais il imprime pas ... et enfin parfois l'appli freeze totalement ...

    je commence a désespéré. sniffff



    je met des capture d'écran si sa peut vous aidé :





    Voici une capture d'ecran d'une image tel qu'elle doit etre apres exportation :



    Ce qui doit etre imprimé est identique, juste avec la date et l'heure de limpresiion ecrie en bas a droite


    Cordialement Baxter


    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  18. #18
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    En fait... TChart::OnAfterDraw devrait permettre de signaler qu'il a terminé de se dessiner.

    Donc maintenant, ils'agit de savoir comment l'exploiter...

    Soit on réalise l'impression à partir de cet événement soit elle est réalisée ailleurs et il faudra dans ce cas utiliser un ou deux flags...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    bool IsDrawing; 	//Indique si le TChart se dessine
    bool ReadyToPrint;      //Indique si un nouveau graph est disponible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    IsDrawing = true;
    ReadyToPrint = true;
    //On modifie les séries
    //le TChart se dessine...
    //Arrive l'événement OnAfterDraw...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void __fastcall TForm1::Chart1AfterDraw(TObject *Sender)
    {
    isDrawing = false;
    }

    Donc ailleurs, on a cette possibilité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    Graphics:TBitmap *Temp;
    if(ReadyToPrint) // S'il y a quelque chose de nouveau à dessiner
        {
        while(IsDrawing)
        	{
        	//Pour pouvoir gérer en arrière plan le OnAfterDraw
        	Application->ProcessMessages();
        	}
        ReadyToPrint = false; //On imprime qu'une fois
        Temp = ...GetFormImage();
        //...La suite on la connait
     
        delete Temp;
        }

    Quelque chose dans ce genre là...

    A plus !

  19. #19
    Membre actif Avatar de Baxter67
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 270
    Points : 216
    Points
    216
    Par défaut
    Bon moi jai eseyé de faire différement

    jai séparé l'exportation et limpression en 3 fonction distincte :

    Une fonction d'impression avec en argument la form a imprimé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    //---------------------------------------------------------------------------
    void ImprimerFormImpre(TForm *Form)
    {
      TRect rd;
      TPrinter *Prntr = Printer();
     
            rd = Rect(0, 0, Prntr->PageWidth, Prntr->PageHeight);
            Graphics::TBitmap *Temp = new Graphics::TBitmap;
     
            Temp->Assign(Form->GetFormImage());
     
            int Start =  GetTickCount();
            while (( GetTickCount() - Start ) < 100) // 100 ms ou plus ???
            {
                    //pour ne pas bloquer l'appli
                    Application->ProcessMessages();
            }
     
            //DESSIN DES CADRE
     
            //Enleve le bouton Imprimé
            Temp->Canvas->Brush->Color=clWhite;
            Temp->Canvas->FillRect(Rect(592,450,800,600));
     
            //Enleve le bouton Retour
            Temp->Canvas->Brush->Color = clMenuBar;
            Temp->Canvas->FillRect(Rect(8,464,185,564));
     
            Temp->Canvas->Font->Color = clBlack;
            Temp->Canvas->Font->Size = 12;
            Temp->Canvas->Font->Name = "Arial";
            Temp->Canvas->TextOutA(12, 468, "Visa Chef d'équipe :");
            Temp->Canvas->TextOutA(12, 508, "Visa Oenologue :");
     
            Temp->Canvas->Brush->Color = clWhite;
            Temp->Canvas->TextOutA(595, 468, FormatDateTime("ddd ' le ' d MMMM  yyyy", Now()));
            Temp->Canvas->TextOutA(595, 508, FormatDateTime("HH : mm",Now()));
     
            // pour eviter une page blanche ajouter la ligne suivante
            Temp->PixelFormat = pf24bit; // a adapter
            //TPixelFormat {pfDevice, pf1bit, pf4bit, pf8bit, pf15bit, pf16bit, pf24bit, pf32bit, pfCustom}
            Prntr->BeginDoc();
            Prntr->Canvas->StretchDraw(rd, Temp);
            Prntr->EndDoc();
            delete Temp;
    }
    //---------------------------------------------------------------------------
    Une Fonction D'exportation pour les form ne contenant que la courbe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //---------------------------------------------------------------------------
    void ExporterCourbe(TChart *Chart, AnsiString Nom)
    {
            Chart->Refresh();
            Chart->SaveToBitmapFile(Nom);
    }
    //---------------------------------------------------------------------------
    Une fonction identique avec 3 unsigned int en plus ( ce sont 3 valeurs qu'il faut sauvegardé pour un type de courbe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    //---------------------------------------------------------------------------
    void ExporterCourbe(TChart *Chart, unsigned int uiPde, unsigned int uiPfin, unsigned int uiPdiff, AnsiString Nom)
    {
      TStringList *List;
            List = new TStringList();
            Chart->Refresh();
            Chart->SaveToBitmapFile(Nom);
            List->Add(IntToStr(uiPde));
            List->Add(IntToStr(uiPfin));
            List->Add(IntToStr(uiPdiff));
            List->SaveToFile( Nom + ".txt");
            delete List;
    }
    //---------------------------------------------------------------------------
    Donc pour L'exportation qui est la chose la plus importante j'exporte directement la courbe avec la fonction du TChart qui a l'air de fonctionné tous le temps. Et quand jai des int a sauvegardé je les met dans un fichier TXT en ajoutant simplement .txt ceut qui me permetra de réouvir facilement une courbe et son fichier txt pour une réimpression.

    Voici le code qui imprime en automatique :

    C'est dans un thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
            while(Form1->bFinThread)
            {
     
                //GESTION COURBE TEMPERATURE FILTRE 1
                    if(AccesDataRead(4010,2)==1)       //Effacement des valeur
                            Form3->Series1->Clear();
                    if(AccesDataRead(4011,2)==1  &&  Form1->TabFrontPourImpression[cTempFiltre1] == 0)
                    {
                            //exportation de la courbe  et impression
                            uiTmp1 = StrToInt(Form3->PanelPdTF1->Caption);
                            uiTmp2 = StrToInt(Form3->PanelPfTF1->Caption);
                            uiTmp3 = StrToInt(Form3->PanelDiffTF1->Caption);
                            ImprimerFormImpre(Form3);
                            ExporterCourbe(Form3->Chart1, uiTmp1, uiTmp2, uiTmp3, "TempFiltre1/TF1"+FormatDateTime("ddmmyy'_'hhmm",Now())+".bmp");
                            //FormImpre->Panel2->Visible = false;
                            Form1->TabFrontPourImpression[cTempFiltre1] = 1;
                    }
                    if(AccesDataRead(4011,2)==0 && Form1->TabFrontPourImpression[cTempFiltre1] == 1)
                            Form1->TabFrontPourImpression[cTempFiltre1] = 0;
     
                    //Gestion Test D'intégrité Filtre 1
                    Form3->PanelPdTF1->Caption = AccesDataRead(4107);
                    Form3->PanelPfTF1->Caption = AccesDataRead(4108);
                    Form3->PanelDiffTF1->Caption = AccesDataRead(4109);
     
                    //GESTION COURBE TEMPERATURE Tireuse 1
                    if(AccesDataRead(4012,4)==1)
                            Form9->Series1->Clear();  //Effacement des valeur
                    if(AccesDataRead(4014,4)==1  &&  Form1->TabFrontPourImpression[cTempT1] == 0)
                    {
                            ImprimerFormImpre(Form9);
                            ExporterCourbe(Form9->Chart1, "TempTireuse1/TT1"+FormatDateTime("ddmmyy'_'hhmm",Now())+".bmp");
                            Form1->TabFrontPourImpression[cTempT1] = 1;
                    }
                    if(AccesDataRead(4014,4)==0  &&  Form1->TabFrontPourImpression[cTempT1] == 1)
                            Form1->TabFrontPourImpression[cTempT1] = 0;
     
                    //GESTION COURBE TEMPERATURE TIREUSE 2
                    if(AccesDataRead(4015,1)==1)
                            Form15->Series1->Clear();  //Effacement des valeur
                    if(AccesDataRead(4015,0)==1  &&  Form1->TabFrontPourImpression[cTempT2] == 0)
                    {
                            ImprimerFormImpre(Form15);
                            ExporterCourbe(Form15->Chart1, "TempTireuse2/TT2"+FormatDateTime("ddmmyy'_'hhmm",Now())+".bmp");
                            Form1->TabFrontPourImpression[cTempT2] = 1;
                    }
                    if(AccesDataRead(4015,0)==0  &&  Form1->TabFrontPourImpression[cTempT2] == 1)
                            Form1->TabFrontPourImpression[cTempT2] = 0;
     
                    Sleep(TempsSleepThreadSecondaire);
            }
    de temps en temps quand lautomate pase un bit a un, limpression ne s'effectue pas correctement en ouvrant utilitaire d'impression je voie que la taile du fichier a imprimé sarréte a environ 860 octec , pour une taile normal quand sa se pase bien de 1,28 Mo


    Encore une petite chose, quand une tache d'impression est lancé, l'utilisation de l'UC grimpe beaucoup, et quand je clique sur un bouton de c'est comme si l'application planté, mais en fait jai juste l'impression que c'est la mise a jour de l'affichage qui s'arrete parceque j'arrive toujous a lancé des impression vie l'automate et la com avec l'automate fonctionne toujours.
    Mais si j'appuie sur un bouton une fois que l'impression est fini sa fonctionne bien.
    C'est peut etre du a la lenteur du PC surlequel l'application tourne ? c'est possible ?

    vala vala
    Vous en pensez quoi

    Merci encore a tous, particulierement a enderson, qui maide bien

    Cordialement Baxter
    Tous Probleme a sa solution. Sinon il a le bouton magique : . Et surtous :
    Et ne pas oublier :

  20. #20
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !
    L'idée que j'ai donnée avec les pixels ne se résume pas à mettre un delai.
    Le delai sert à fixer une vitesse pour scanner le résultat (donc on scan tant que... toutes les n ms).
    En fait... ce n'est pas une bonne idée puisque l'on dispose pour l'objet TChart d'un événement OnAfterDraw qui est précisément là pour indiquer que le dessin est terminé !

    Graphics::TBitmap *Temp = new Graphics::TBitmap;
    Temp->Assign(Form->GetFormImage());
    while (( GetTickCount() - Start ) < 100) // 100 ms ou plus ???
    {
    //pour ne pas bloquer l'appli
    Application->ProcessMessages();
    }
    La bonne méthode est celle donnée au départ (sans quoi on bouffe la mémoire) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Graphics::TBitmap *Temp = Form->GetFormImage();
    //...
    delete Temp;
    Le fait que l'exportation fonctionne correctement ne m'étonne pas puisque dans ce cas, c'est le TChart qui s'occupe de tout (il sait de facto à quel moment le dessin est terminé... puisque c'est lui qui dessine donc quand c'est fait, il l'exporte) !

    Je pense que la solution est d'utiliser des sémaphores parce que si j'ai bien compris, on a deux process indépendants : l'un a besoin pour démarrer sa tâche d'impression que l'autre ait terminé le dessin.
    Or on sait quand le dessin est terminé, grâce au OnAfterDraw !!!!

    A plus !

Discussions similaires

  1. [XL-2003] exporter une form en jpg
    Par theos37 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/11/2009, 15h51
  2. Améliorer la qualité d'impression d'une form
    Par akabane dans le forum Delphi
    Réponses: 2
    Dernier message: 08/07/2006, 13h31
  3. [VB6] position de l'impression d'une form sur une feuille
    Par cisnake dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 22/05/2006, 01h06
  4. Impression d'une form avec controle MSHFlexGrid
    Par felix14 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 10/01/2006, 17h59
  5. [VBA-E]Impression d'une form
    Par preverse dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 13/10/2005, 14h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo