Borland C++ Builder: minimisation/restauration d'une appli - Programmation
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)
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!
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
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.
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? :-)
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
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();
}
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
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' ?
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 ! )
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 !!
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.
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
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...
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
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é
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