Borland C++ Builder: minimisation/restauration d'une appli

Borland C++ Builder: minimisation/restauration d'une appli - Programmation

Marsh Posté le 22-11-2001 à 20:52:58    

J'aimerais faire en sorte que l'on ne puisse lancer l'appli que je suis en train de dévellopper qu'une seule fois et que si on essaye de la relancer celà rappel l'instance précédente.
J'y suis presque arrivé mais quand je restaure la fenettre de l'instance précédente je ne peux plus la minimiser (le système semble tjrs la considére comme minimiser alors qu'elle ne l'est plus) et je n'arrive pas à la mettre au premier plan

Reply

Marsh Posté le 22-11-2001 à 20:52:58   

Reply

Marsh Posté le 22-11-2001 à 21:48:58    

Bleh?
 
Utilise un mutex pour limiter ton application... A la limite regarde dans mon BUPack (sur mon site), y a un compo pour le faire en Delphi, il doit pouvoir compiler sous Builder (et non, c plus shareware, c open source, mais eux ils feront jamais de version pour Builder)


---------------
Vendredi c'est Buitoni
Reply

Marsh Posté le 22-11-2001 à 22:02:46    

bon alors pour ceux qui suivent pas: le problème n'est pas dans la detection de l'instance précédente mais dans le fait qu'elle ne se restaure pas comme il faut!

Reply

Marsh Posté le 22-11-2001 à 22:03:39    

Ouai mais ca n'a aucune incidence la dessus... Et si c'est ta méthode de detection (pour toi) qui foire, utilise un mutex...  
 
Dis tout de suite que je sais pas lire :)


---------------
Vendredi c'est Buitoni
Reply

Marsh Posté le 22-11-2001 à 22:13:34    

buitoni a écrit a écrit :

Ouai mais ca n'a aucune incidence la dessus... Et si c'est ta méthode de detection (pour toi) qui foire, utilise un mutex...  
 
Dis tout de suite que je sais pas lire :)  




 
Non ça doit être moi qui suis pas clair, alros on va clarifier: la détection de l'instance ça marche, la récupératino du handle de l'instance précédente ça marche, c quand je la restaure qu'il y a un problème, la fnetre apparait mais impossible de la reminimiser, si je clic avec le bouton droit sur son icone dans la barre des tache ça me propose de la restaurer et pas de la minimiser, de plus je n'arrive pas à la faire passer devant toutes les fenetres.
 
J'ai essayé deux méthodes les résultats sont identiques.

Reply

Marsh Posté le 22-11-2001 à 22:16:32    

Et t'esperes que qqn t'aide sans que tu files le moindre morceau de code? :-)


---------------
Vendredi c'est Buitoni
Reply

Marsh Posté le 22-11-2001 à 22:23:05    

Ok c ma faute.
 
Voici la fonction winmain de mon prog:
 
 
 
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
        try
        {
                 Application->Initialize();
                 CreateMutex(NULL,TRUE,"testmutex" );
                 if(GetLastError() != ERROR_ALREADY_EXISTS)
                  {
                     try
                      {
                         Application->Icon->LoadFromFile("CDIcon.ico" );
                      }
                     catch(...)
                      {
                      }
 
                     Application->ShowMainForm=false;
                     Application->CreateForm(__classid(TMyDivPlayerByLetoAtISIMA), &MyDivPlayerByLetoAtISIMA);
                 Application->CreateForm(__classid(TFirstWindow), &FirstWindow);
                 Application->Run();
                  }
                 else
                  {
                     HANDLE test=FindWindow("TMyDivPlayerByLetoAtISIMA",NULL);
                     /*ShowWindow(test,SW_RESTORE);
                     SetForegroundWindow(test);*/
                     
                     SendMessage(test,MYWM_NOTIFY,1,1);
 
                     //BringWindowToTop(test);
 
 
                  }
 
 
        }
        catch (Exception &exception)
        {
                 Application->ShowException(&exception);
        }
        return 0;
}
 
 
 
 
 
 
la fonction qui répond au message MYWM_NOTIFY:
 
void __fastcall TMyDivPlayerByLetoAtISIMA::MyNotify(TMessage& msg)
{
    //ShowWindow(Handle,SW_SHOWNORMAL);
    //BringWindowToTop(Handle);
    //SetFocus();
    WINDOWPLACEMENT test;
    RECT test2;
    test2.left=Left;
    test2.right=Left+Width;
    test2.top=Top;
    test2.bottom=Height+Top;
    test.showCmd=SW_SHOWNORMAL;
    test.length=sizeof(WINDOWPLACEMENT);
    test.rcNormalPosition=test2;
    SetWindowPlacement(Handle,&test);
 
    SetForegroundWindow(Handle);
 
}
 
vous pouvez voir passé en commentaires les autres essai infructueux

Reply

Marsh Posté le 23-11-2001 à 07:20:02    

bon alors comme ça marche mieu mais lorsque la fenetre n'est pas minimisée je n'arrive toujours pas à la faire passer au premier plan
 
 
 
void __fastcall TMyDivPlayerByLetoAtISIMA::MyNotify(TMessage& msg)
{
     
    Application->Restore();
    Show();
    Activate();
    Application->BringToFront();
}

Reply

Marsh Posté le 23-11-2001 à 09:53:57    

Bon chuis super desole, je viens "squatter" votre topic pour poser ma question car ça concerne BC++ directement.
 
En fait, un copain m'affirme que dans un switch, il n'est pas necessaire de mettre un break a la fin de chaque case, que le compilo le rajoute tout seul. C vrai ? parcve que c un peu debile, si tu as deux cas ou tu veux faire la meme chose, t obligé d'ecrire le truc 2 fois ???
 
merci et desole  :jap:

Reply

Marsh Posté le 23-11-2001 à 12:43:21    

swtich ( c)
{
 case 1 : cout<<"1\n";
 case 2 : cout<<"2\n";
 case 3 : cout<<"3\n";
};
 
dans cet example si c == 1 alors ça va ecrire  
1
2
3
 
si c == 2 alors ça va ecrire  
2
3
 
Donc tu vois l'interret du 'break' ?  ;)

Reply

Marsh Posté le 23-11-2001 à 12:43:21   

Reply

Marsh Posté le 23-11-2001 à 14:38:24    

En VB, on met rien, en BC, on met un break en général, sauf si on veut continuer au case suivant.
Mais si on a un return en dernière commande, le break sert à rien.
 
switch (c)  
{  
case 1 : return 1;
case 2 : return 2;
case 3 : return 3;
};
return 4;  
 
(C'est juste un exemple, on peut faire plus direct ! :D)

Reply

Marsh Posté le 23-11-2001 à 15:23:21    

Merci !  
je connaissais l'interet du break , et justement mon pote me disais que c'etait pas obligatoire de le mettre, qu'ensuite le compilo le rajouter. Donc justement je trouvais ça nul, dans le cas ou plusieurs case font la meme action !!

Reply

Marsh Posté le 23-11-2001 à 15:31:59    

C'est peut-être une plaisanterie, pour créer des bugs dans les softs de son pote... :)  
 
Heureusement que le compilo n'ajoute rien de ce genre, ça serait un truc à s'arracher les cheveux.
 
Je ne sais plus le nom de l'utilitaire du VC qui permet de créer un projet automatiquement (VisualStudio ?). Les break sont automatiquement mis après les case. Y a plus qu'à les ôter si pas besoin.

Reply

Marsh Posté le 23-11-2001 à 17:22:15    

Ouai mais ça m'aide pas trop là!

Reply

Marsh Posté le 24-11-2001 à 20:18:47    

Bon on va recentrer un peu le débat: je suis arrivé à restaurer ma fenetre minimisé, mais quand elle n'est pas minimisée je n'arrive pas à la faire passer au premier plan

Reply

Marsh Posté le 24-11-2001 à 21:42:28    

Benh tu as tout essaye?
 
Application->BringToFront()
FormBidule->BrintToFront()
 
 
sinon tu la fous en stay on top et tu le desactives de suite!
Au moins t'en es sur la...

Reply

Marsh Posté le 25-11-2001 à 21:47:13    

En générale quand je poste un message ici c'est que j'ai essayé toutes les solutions évidentes, mais c'est peut être que je m'y prend mal je vais réessayer d'une autre façon

Reply

Marsh Posté le 25-11-2001 à 22:07:28    

Bon j'ai trouvé, si ça intéresse qqn je posterai le code

Reply

Marsh Posté le 25-11-2001 à 22:34:47    

LetoII a écrit a écrit :

En générale quand je poste un message ici c'est que j'ai essayé toutes les solutions évidentes, mais c'est peut être que je m'y prend mal je vais réessayer d'une autre façon  




 
Ouai mais y a toujours qqchose auquel on a pas pensé  :ange:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed