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 :

C++ Builder COM PDFCreator


Sujet :

C++Builder

  1. #21
    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
    Par défaut
    Je ne suis pas sur mais je pense que ceci permet de tester si l'imprimante n'est pas occupee
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    vPDFC.OleProcedure("cPrintFile",WideString(FileS));
    while((Timer1->Enabled) || (Printer()->Printing))
            Application->ProcessMessages();

  2. #22
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    523
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 523
    Par défaut
    TQRPDFDocumentFilter n'existe sauf erreur de ma part qu'à partir de Quick Report 4. J'en suis moi à la version 3.0.9.
    C'est effectivement une solution que d'acquérir la licence pro 5, mais c'est une solution commerciale et non technique...
    Merci tout de même

  3. #23
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    523
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 523
    Par défaut
    Citation Envoyé par blondelle Voir le message
    Je ne suis pas sur mais je pense que ceci permet de tester si l'imprimante n'est pas occupee
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    vPDFC.OleProcedure("cPrintFile",WideString(FileS));
    while((Timer1->Enabled) || (Printer()->Printing))
            Application->ProcessMessages();
    Bonjour

    J'ai essayé cela mais il semble que la structure TPrinter ignore ce que fait PDFCreator.

    Voici le bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    PDFCreator->cPrintFile(FileS);
    int t1=Prntr->Printing;
     
    Timer1->Enabled; // réglé sur 10s
     
    while ((Prntr->Printing) && (Timer1->Enabled))
            Application->ProcessMessages();
     
    int t2=Prntr->Printing;
     
    PDFCreator->cClose();   // Dans la liste des tâches PDFCreator reste présent malgré cette instruction
    La boucle While est immédiatement quitté car Prntr->Printing vaut toujours zéro. Ce qui est mis en évidence en captant les valeurs en t1 et t2

  4. #24
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    523
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 523
    Par défaut
    Ca commence à prendre forme. la nouveauté : pour détecter la fin de la tâche d'impression j’utilise .cOutputFilename qui cesse d'être nul quand le document est converti en PDF.
    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
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    WideString Parameters="/NoProcessingAtStart";
    TCOM_clsPDFCreatorOptions Opt;
    WideString FileS;
    TPrinter *Prntr = Printer();
    bool Ret;
    AnsiString DefaultPrinter;
     
    Label1->Caption="";
    Label2->Caption="";
     
    DefaultPrinter=Prntr->Printers->Strings[Prntr->PrinterIndex];
     
    OpenDialog1->InitialDir=GetCurrentDir();
     
    if (!OpenDialog1->Execute())
            return;
     
    FileS=OpenDialog1->FileName;
     
    PDFCreator = CoclsPDFCreator::Create();
     
    if (!PDFCreator->cStart(Parameters,Ret))        {
            MessageDlg("Le serveur PDF ne peut être démarré",
                   mtInformation, TMsgDlgButtons() << mbOK, 0);
            return;
            }
     
    if (!FileExists(FileS)) {
            MessageDlg("Fichier absent",
                   mtInformation, TMsgDlgButtons() << mbOK, 0);
            return;
            }
     
    if (!PDFCreator->cIsPrintable(FileS))   {
            MessageDlg("Fichier non imprimable",
                   mtInformation, TMsgDlgButtons() << mbOK, 0);
            return;
            }
     
    Opt=CoclsPDFCreatorOptions::Create();
    Opt=PDFCreator->cOptions;
    Opt->set_AutosaveDirectory(WideString(ExtractFilePath(FileS)));
    Opt->set_AutosaveFilename(WideString(ChangeFileExt(ExtractFileName(FileS),"")));
    Opt->set_AutosaveFormat(0);
    Opt->set_UseAutosave(1);
     
    PDFCreator->set_cVisible(0);
     
    PDFCreator->_set_cOptions(Opt);     //PDFCreator->cOptions=Opt; écriture équivalente
     
    PDFCreator->set_cDefaultPrinter(WideString("PDFCreator"));
    PDFCreator->cClearCache();
     
    PDFCreator->cPrintFile(FileS);
    PDFCreator->set_cPrinterStop(false);    // il parait que cela libère la file d'attente
     
    Timer1->Enabled=true; // l’événement OnTimer le disable
     
    while ((PDFCreator->cOutputFilename==WideString("")) && (Timer1->Enabled)) {
            Label1->Caption=PDFCreator.cOutputFilename;
            Application->ProcessMessages();
            Sleep(500);
            }
     
    if (!Timer1->Enabled)
                    Label1->Caption="Timer expiré";
            else
                    Label1->Caption=Format("%s",ARRAYOFCONST((PDFCreator->cOutputFilename)));
     
    PDFCreator->set_cDefaultPrinter(WideString(DefaultPrinter));
     
    PDFCreator->cClose();   // Dans la liste des tâches PDFCreator reste présent malgré cette instruction
     
    Timer1->Enabled=true;
     
    while ((!PDFCreator->get_cIsClosed()) && (Timer1->Enabled)) {   //Attendre le déchargement de PDFCreator
            Sleep(500);
            Application->ProcessMessages();
            }
     
    delete PDFCreator;
     
    if (!Timer1->Enabled)
                    Label2->Caption="Timer expiré";
            else
                    Label2->Caption="PDFCreator fermé";
     
    }
    Tout ceci fonctionne bien à un détail près, cela ne fonctionne bien qu'une seule fois. Ensuite, si on exécute à nouveau la procédure (et principalement si le fichier converti est un *.TXT) les options autosave semblent perdues; C'est à dire que PDFCreator réclame un emplacement et un nom. Curieusement si je convertis plusieurs RTF ou ODT à la suite ça fonctionne presque toujours. Seuls les TXT posent problème systématiquement.

    Je suppose qu'il y a une lacune de restauration du contexte initial. Mais par ailleurs je suis étonné que PDFCreator reste dans liste des tâches même quand PDFCreator->get_cIsClosed() retourne Vrai.

Discussions similaires

  1. PDFCreator et COM, imprimer une seule page
    Par Papy214 dans le forum API, COM et SDKs
    Réponses: 0
    Dernier message: 14/02/2013, 18h15
  2. Gérer port com virtuel en builder 5
    Par phil2fer dans le forum C++
    Réponses: 9
    Dernier message: 28/09/2012, 09h33
  3. Matlab COM Builder
    Par poisson16 dans le forum MATLAB
    Réponses: 1
    Dernier message: 17/06/2007, 21h29
  4. Outils, cours et NOUVEAUX tutoriels pour Borland C++Builder
    Par hiko-seijuro dans le forum C++Builder
    Réponses: 10
    Dernier message: 12/03/2006, 23h33
  5. Réponses: 2
    Dernier message: 21/03/2002, 00h01

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