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 :

Optimisation deverrouilleur VBE


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Optimisation deverrouilleur VBE
    Bonjours
    Mon code pour deverrouiller un programme VBEa ete optimise mais j'ai encore deux soucis.
    1 - j'ai quatre temporisations d'attente avant le chargement des boites de dialogue.
    2 - je dois mettre un teste au cas ou le programme ne serait pas verrouille
    Le code:
    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
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include <utilcls.h>
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    Variant vMSExcel, vXLWorkbooks, vXLWorkbook, vWorksheet;
    Variant vWorksheets;
    vMSExcel = Variant::CreateObject("Excel.Application");
    vMSExcel.OlePropertySet("Visible", true);
    Variant vFileName, vNotUsed;
    vNotUsed = Unassigned;
    vFileName = "C:\\test2_Word.xls";
    vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
    vXLWorkbook = vXLWorkbooks.OleFunction("Open", vFileName, vNotUsed,
    vNotUsed, vNotUsed);
    vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", 1);
     // ici on va ouvrir la fenetre Visual Basic pour Excel
    Variant vbProj = vXLWorkbook.OlePropertyGet("VBProject");
    vMSExcel.OlePropertyGet("VBE").OlePropertyGet("ActiveVBProject") = vbProj;
    vMSExcel.OlePropertyGet("VBE").OlePropertyGet("MainWindow").OlePropertySet("Visible", true);
     // ici la fenetre Visual Basic pour Excel est ouverte
    HWND h = FindWindow("wndclass_desked_gsk", NULL);
    HWND h3 = FindWindowEx(h, NULL, "MsoCommandBarDock", "MsoDockTop");
    HWND h5 = FindWindowEx(h3, NULL, "MsoCommandBar", "Barre de menus");
     // on selectionne la Barre de menus
    SetForegroundWindow(h5);
     // on active le premier element de la Barre de menus pour cela on simule "Alt"
    PostMessage(h5, WM_KEYDOWN, VK_MENU, 0);
    PostMessage(h5, WM_KEYUP, VK_MENU, 0);
     // on simule la fleche vers la droite pour se deplacer dans le menu
    for (int i = 1; i <= 8; i++)
    {
       PostMessage(h5, WM_KEYDOWN, VK_RIGHT, 0); // touche enfoncee
       PostMessage(h5, WM_KEYUP, VK_RIGHT, 0); // touche relachee
    }
     // on simule la fleche vers le bas pour derouler le menu selectionne
    for (int i = 1; i <= 5; i++)
    {
       PostMessage(h5, WM_KEYDOWN, VK_DOWN, 0); // touche enfoncee
       PostMessage(h5, WM_KEYUP, VK_DOWN, 0); // touche relachee
    }
     // on simule la touche entree pour afficher la boite de dialogue
    PostMessage(h5, WM_KEYDOWN, VK_RETURN, 0); // touche enfoncee
    PostMessage(h5, WM_KEYUP, VK_RETURN, 0); // touche relachee
     // ici la boite de dialogue entrez le mot de passe est ouverte
     // on recupere le Handle de la boite de dialogue
    Sleep(500); // temporisation de stabilisation
    // ici il manque un teste au cas ou le programme ne serait pas verrouille
    HWND h66 = FindWindow("#32770", "VBAProject Mot de passe");
    HWND h77 = FindWindowEx(h66, NULL, "Edit", NULL);
    HWND h88 = FindWindowEx(h66, NULL, "Button", "OK");
     // mot de passe
    String MPassWord = "jp";
     // on selectionne le TEdit Mot de passe
    SendMessage(h77, WM_SETTEXT, 0, (LPARAM) MPassWord.c_str());
    Sleep(500); // temporisation de stabilisation
    // ici on valide par OK
     // le programme est deverrouille
     // on donne le Focus au Boutton "OK"
    SetForegroundWindow(h88);
     // on simule la touche entree
    keybd_event(VK_RETURN,0,0,0);
    keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
    Sleep(500); // temporisation de stabilisation
    HWND h6 = FindWindow("#32770", "VBAProject - Propriétés du projet");
    HWND h7 = FindWindowEx(h6, NULL, "#32770", NULL);
     // temporisation de stabilisation du changement de page
    Sleep(500);// temporisation de stabilisation
    HWND h12 = FindWindowEx(h6, NULL, "Button", "OK");
     // on donne le Focus au Boutton "OK"
    SetForegroundWindow(h12);
     // on simule la touche entree
    keybd_event(VK_RETURN,0,0,0);
    keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
     // le programme est deverrouille mais si on le ferme la protection
     // n'est pas retiree et le programme se reverrouille
    //---
    // on ferme le dossier
    vXLWorkbook.OleProcedure("Close", false);
    // fermeture d'excel
    vMSExcel.OleFunction("Quit");
    // liberation memoire
    vMSExcel = Unassigned;
    Y a t'il une solution plus propre que mes temporisations?
    Comment mettre en oeuvre le teste afin d'eviter de planter le programme?

  2. #2
    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
    Bonjours
    J'ai vu dans l'aise qu'il y avait une commande nommee "Synchronize" est ce que je pourrais l'utiliser dans le programme afin de supprimer mes temporisations?

  3. #3
    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
    J'ai trouve comment supprimer tois temporisations sur quatres
    Application->ProcessMessages();
    Dans ce cas ca ne fonctionne pas?
    // on simule la touche entree pour afficher la boite de dialogue
    PostMessage(h5, WM_KEYDOWN, VK_RETURN, 0); // touche enfoncee
    PostMessage(h5, WM_KEYUP, VK_RETURN, 0); // touche relachee
    // ici la boite de dialogue entrez le mot de passe est ouverte
    // on recupere le Handle de la boite de dialogue
    Application->ProcessMessages(); // je ne peu pas enlever la temporisation?
    Sleep(200); // temporisation de stabilisation
    Si quelqu'un a une idee

  4. #4
    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
    J'ai remplace "PostMessages" par "keybd_event" la fonction semble plus rapide.
    Application->ProcessMessages();
    // on simule la touche entree pour afficher la boite de dialogue
    // PostMessage(h5, WM_KEYDOWN, VK_RETURN, 0); // touche enfoncee
    // PostMessage(h5, WM_KEYUP, VK_RETURN, 0); // touche relachee
    keybd_event(VK_RETURN,0,0,0);
    keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
    //Sleep(50);
    // ici la boite de dialogue entrez le mot de passe est ouverte
    // on recupere le Handle de la boite de dialogue
    Application->ProcessMessages();
    La le programme a vraiment gagne en rapidite.
    Il me reste le probleme d'erreur si le code n'est pas verrouille,

  5. #5
    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
    La je pense que je suis parvenu a mes fin le programme tourne correctement chez moi sur Excel 2003, il a gagne en rapidite, le teste si le programme est verrouille ou non fonctionne.
    Le code:
    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
    98
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include <utilcls.h>
    #include "deverou_VBE.h" // deverou_VBE est le nom du programme
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    Variant vMSExcel, vXLWorkbooks, vXLWorkbook, vWorksheet;
    Variant vWorksheets;
    vMSExcel = Variant::CreateObject("Excel.Application");
    vMSExcel.OlePropertySet("Visible", true);
    Variant vFileName, vNotUsed;
    vNotUsed = Unassigned;
    vFileName = "C:\\test2_Word.xls";
    vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
    vXLWorkbook = vXLWorkbooks.OleFunction("Open", vFileName, vNotUsed,
    vNotUsed, vNotUsed);
    vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", 1);
     // ici on va ouvrir la fenetre Visual Basic pour Excel
    Variant vbProj = vXLWorkbook.OlePropertyGet("VBProject");
    vMSExcel.OlePropertyGet("VBE").OlePropertyGet("ActiveVBProject") = vbProj;
    vMSExcel.OlePropertyGet("VBE").OlePropertyGet("MainWindow").OlePropertySet("Visible", true);
     // ici la fenetre Visual Basic pour Excel est ouverte
    HWND h = FindWindow("wndclass_desked_gsk", NULL);
    HWND h3 = FindWindowEx(h, NULL, "MsoCommandBarDock", "MsoDockTop");
    HWND h5 = FindWindowEx(h3, NULL, "MsoCommandBar", "Barre de menus");
     // on selectionne la Barre de menus
    SetForegroundWindow(h5);
     // on active le premier element de la Barre de menus pour cela on simule "Alt"
    PostMessage(h5, WM_KEYDOWN, VK_MENU, 0);
    PostMessage(h5, WM_KEYUP, VK_MENU, 0);
     // on simule la fleche vers la droite pour se deplacer dans le menu
    for (int i = 1; i <= 8; i++)
    {
       PostMessage(h5, WM_KEYDOWN, VK_RIGHT, 0); // touche enfoncee
       PostMessage(h5, WM_KEYUP, VK_RIGHT, 0); // touche relachee
    }
     // on simule la fleche vers le bas pour derouler le menu selectionne
    for (int i = 1; i <= 5; i++)
    {
       PostMessage(h5, WM_KEYDOWN, VK_DOWN, 0); // touche enfoncee
       PostMessage(h5, WM_KEYUP, VK_DOWN, 0); // touche relachee
    }
    Application->ProcessMessages(); // temporisation de stabilisation 
     // on simule la touche entree pour afficher la boite de dialogue
    keybd_event(VK_RETURN,0,0,0); // touche enfoncee
    keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0); //touche relachee
     // ici la boite de dialogue entrez le mot de passe est ouverte
     // on recupere le Handle de la boite de dialogue
    Sleep(50);
    Application->ProcessMessages(); // temporisation de stabilisation
    HWND h66 = FindWindow("#32770", "VBAProject Mot de passe");
    HWND h77 = FindWindowEx(h66, NULL, "Edit", NULL);
    HWND h88 = FindWindowEx(h66, NULL, "Button", "OK");
    // on teste si le programme est verrouille
    // s'il ne l'est pas le Handle est NULL
    if (h66 != NULL)
    {
     // mot de passe
    String MPassWord = "jp";
     // on selectionne le TEdit Mot de passe
    SendMessage(h77, WM_SETTEXT, 0, (LPARAM) MPassWord.c_str());
    Application->ProcessMessages(); // temporisation de stabilisation
     // ici on valide par OK
     // le programme est deverrouille
     // on donne le Focus au Boutton "OK"
    SetForegroundWindow(h88);
     // on simule la touche entree
    keybd_event(VK_RETURN,0,0,0); //touche enfoncee
    keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0); //touche relachee
    }
    HWND h6 = FindWindow("#32770", "VBAProject - Propriétés du projet");
    HWND h7 = FindWindowEx(h6, NULL, "#32770", NULL);
    HWND h12 = FindWindowEx(h6, NULL, "Button", "OK");
     // on donne le Focus au Boutton "OK"
    SetForegroundWindow(h12);
    Application->ProcessMessages(); // temporisation de stabilisation
            // on simule la touche entree
    keybd_event(VK_RETURN,0,0,0);
    keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
     // le programme est deverrouille mais si on le ferme la protection
     // n'est pas retiree et le programme se reverrouille
    //---
    // on ferme le dossier
    vXLWorkbook.OleProcedure("Close", false);
    // fermeture d'excel
    vMSExcel.OleFunction("Quit");
    // liberation memoire
    vMSExcel = Unassigned;
    }
    //---------------------------------------------------------------------------

  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
    Par défaut
    Je suis interresse par l'avis de personnes qui on teste le programme et sur quelle version d'Excel.
    Je laisse donc le post ouvert.

Discussions similaires

  1. Optimisation de votre SGBDR et de vos requêtes...
    Par SQLpro dans le forum Langage SQL
    Réponses: 35
    Dernier message: 11/01/2013, 11h49
  2. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 4
    Dernier message: 05/02/2003, 08h54
  3. [VB6] [BDD] Optimisation de l'accès aux données
    Par LadyArwen dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 30/01/2003, 13h27
  4. [langage]Problème de temps de lecture, optimisation
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 08/01/2003, 08h47
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

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