Passage de parametres avec concatenation a une fonction qui attend string
develdelphi
Messages postés97Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention20 avril 2009
-
3 oct. 2006 à 05:06
develdelphi
Messages postés97Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention20 avril 2009
-
10 oct. 2006 à 17:00
Bonjour,
Je vais vous enoncer mon probleme et je tiens a vous remercier de prendre le temps de lire tous ce code.
Je suis dans la fonction OnDestroy() d'une boite de Dialog
(IDD_CFGHARDWARE)
et apres avoir modifier une zone Edit Control (IDC_EHARDWAREA)dont la variable
est m_iBestCamA (variables
entier contenant 6 chiffres)
je voudrais passer cette variable entiere a une fonction pour ecrire dans la
base de registre les modification, cette fonction a pour classe CInit :
<!--[endif]-->
Code
:
int CInit::Set_Params_Hardware_Config_Init_CamA(CString cstrFileInitA)
{
m_Register.Write_HKey_Local_Machine
(INIT_HARDWARE_CONFIG,"InitA",cstrFileInit);
return(0);
}
Donc lorsque je sauve mes parametres je veux mettre ces changements dans le
registre grace a cette fonction en fesant comme suit
(MyInit.Set_Params_Hardware_Config_Init_CamA() )
<!--[endif]-->
Code :
void CVIewCfgHardware::OnDestroy()
{
CFormView::OnDestroy();
UpdateData(true);
// TODO: Add your message handler code here
if(IsModify())
{
int iMessage;
iMessage=MessageBox("Voulez vous sauver les paramètres ?","Sauver paramètres",MB_YESNO);
1)Comment dois-je passer mes variables m_IBestCamA et m_IBestCamB qui sont des entiers alors que la fonction attend un string? dois je utiliser atoi , si oui comment ?
2)Encore une question qui vient, c'est d'appeler le chemin qui se trouve dans une
autre Dialog (IDD_REPERTOIRE) sous un Edit Control (IDC_EINITCAMERA)
et dont la variable est m_cstrInitCamera vous l'aurais compris ici c'est deja du string donc je viendrais concatener avec un + mais pour appeler cette variable pourrais remplacer, dans cette instruction "chemin" par : GetDlgItemText( IDD_REPERTOIRE, IDC_EINITCAMERA,
pointstr, Maxcount )
<!-- BEGIN TEMPLATE: bbcode_code -->
Code :
LPTSTR pointstr; // par exemple ?
int Maxcount = 6;// par exemple ?
........
........
MyInit.Set_Params_Hardware_Config_Init_CamA(GetDlgItemText(
IDD_REPERTOIRE, IDC_EINITCAMERA,
pointstr, Maxcount )+"BestCamHardware_"+m_IBestCamA+".ini");
........
.........
<!-- END TEMPLATE: bbcode_code -->
Est ce que la methode est envisageable je ne connais pas bien cette fonction?
BunoCS
Messages postés15475Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention23 avril 2024103 3 oct. 2006 à 16:49
Salut,
1. Si tu regarde la classe CString, tu verras qu'elle contient une méthode Format() qui s'utilise comme un sprintf() classique:
CString cstrInteger;
int i=12;
cstrInteger.Format("%d",i);
2. Tu peux évidemment récupérer ton chemin qui vient d'une boite de dialogue, pour peu qu'elle ne soit pas détruite mais, pour construire le chemin de ton fichier, il fau tle faire par étapes:
CString cstrRepertoire, cstrFichier;
GetDlgItemText(IDC_EDIT_REPERTOIRE,cstrRepertoire);
cstrFichier.Format("%s\\BestCamHardware_%s.ini",cstrFichier,m_IBestCamA);
En espérant que cela t'aidera...
NB: Evites de récupérer tes paramètres dans la méthode OnDestroy(). Fais le plutôt dans la fonction OnOK()...
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
Je crois que c'est bon par contre le %d veut dire qu'il s'agit d'un entier tout simplement ?
Pour la reponse 2 :
ici par contre ce n'est pas très clair:
////
("chemin"+"BestCamHardware_"+
////
"chemin" correspond à ce qu'il y a dans le control Dialogue (IDD_REPERTOIRE) la variable m_cstrInitCamera
"BestCamHardware_" correspond à une chaine constante qui viendra s'ajouter au chemin. Dialog (IDD_CFGHARDWARE) la variable m_iBestCamA
Car je n'ais pas bien compris 'cstrRepertoire' correspond t-il a '%s\\BestCamHardware_%s.ini' ? et comment implemeter
les valeurs obtenues par les differentes etapes à l'instruction :
Dans un second temps, comme tu peux le voir le code a changé (reponse 1), en fait je dois changer le principe de programmation pour eviter certaines confusions, Je m'explique en fait la manière dont je t'avais dit c'était de mettre sur la meme cle de registre une fois uniquement (si on est dans le Dialogue (IDD_CFGHARDWARE) le numéro m_iBestHardwareA convertit en string. Et une autre fois (si on est dans le Dialogue IDD_REPERTOIRE) le chemin complet ( chemin+ le fichier + le numero de la camera) du repertoire ou se trouve le fichier ini de la camera.
Bref ca devient complexe, autant avoir trois clés de regsitre:
-la première pour les deux cameras, par exemple "Directory Hardwares" devant avoir comme valeur le seul repertoire par defaut. Dans ce repertoire il ya les fichiers .ini des deux cameras.
-la seconde une pour chaque caméra, par exemple "Num A" devant avoir comme valeur le numero de série de la camera fournit par la DLL de la camera.
-la troisième une pour chaque caméra, sera la clé actuelle "InitA" ou on mettra comme valeurs le chemin complet ( le répertoire par defaut + le nom du fichier (BestCamHardware_) au quel on concatenera le numero de série de la camera et le .ini )
Et donc quand il le faudra on mettra dans dans le registre à la clé "InitA" pour la caméra A les données nécessaires afin qu'elle puisse bien s'initialiser.
Pour le moment je réalise les differents fonctions mais j'airais besoin de comprendre la question 2 car je devrais faire justement des concatenations avec des variables se trouvant dans differents endroits, pourrais tu m'aider a cet effet là?
BunoCS
Messages postés15475Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention23 avril 2024103 4 oct. 2006 à 10:31
Oups, je vois que je t'ai enduis d'erreurs... Je vais essayer d'y remédier.
Pour la partie 1, le "%d" signifie effectivement que tu vas lui donner un entier. %f pour un flottant, %s pour une chaine de caractères.
J'en viens donc à la partie 2, la concaténation de chaines pour avoir le chemin complet. Si j'ai bien compris, il y a 4 parties dans cette chaine, dont 2 fixes:
- le répertoire par défaut que tu récupères dans une boite de dialogue: GetDlgItemText(IDC_EDIT_REPERTOIRE,cstrRepertoire);
- le nom du fichier qui est fixe, à savoir "BestCamHardware_"
- le numéro de série de la caméra, qui est variable et que tu as au format entier et non string (dis moi si je me trompe)
- l'extension du fichier fixe, à savoir ".ini"
Donc, pour reconstituer ton chemin complet, il faut faire la même manip que dans la 1ère partie, cad créer ta chaine à partir de morceaux fixes (que tu écris tels quels) et de morceaux variables (que tu spécifie avec des %):
CString cstrCheminComplet;
cstrCheminComplet.Format("%s\\BestCamHardware_%d.ini",cstrRepertoire,m_iBestHarwareA);
Est-ce plus clair?
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
develdelphi
Messages postés97Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention20 avril 2009 5 oct. 2006 à 16:41
Salut,
Désolé pour ce retard à repondre, en effet je devais avance sur d'autres parties du programme.
Merci beaucoup, c'est plus clair comme ça j'ai ceci maintenant qui marche bien:
En fait tu as pu voir que pour fournir j'ai utilisait un string au lieu d'un entier pour les numeros.
De plus, je n'ai pas employe ta fonction GetDlgItemText car avec ceci :
Apparement ma classe ne le connaisait pas et qu'il falait la declarer (pourquoi ?) et ca devient pas tres propre au niveau du programme
qui est un programme lourd avec bcp de classes et multithreads.
Enfin c'est pas ca le plus important car pour le moment je dois faire d'urgence une conversion de int vers string
pour initialiser un objet BestCamHardware avec un if else et mettre comme parametre à la paranthese de BestCamHardware(); le numero
cette portion de code:
////////test constructeur avec boleen
CHardware::CHardware(bool bver)
{
m_bver=bver;
m_pHardware=0;
m_pHardware = new BestCamHardware();
TRACE("Début tache Hardware\n");
}
////////
Et je me demande comment je pourrais mieux le faire, avec la fonction atoi() peut etre ?
Comme ceci:
////////test constructeur avec boleen
CHardware::CHardware(bool bver)
{
m_bver=bver;
int temp;
if(m_bver==0)
temp = int atoi (m_Init.Get_Params_Hardware_Config_FileInit_NumA());
else
temp = int atoi (m_Init.Get_Params_Hardware_Config_FileInit_NumB());
m_pHardware=0;
m_pHardware = new BestCamHardware(temp);
TRACE("Début tache Hardware\n");
}
//////
Je sais pas si c'est l'idéal de mettre des if() dans le constructeur ?
Mais sinon est ce que le programme est juste?
Encore merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
BunoCS
Messages postés15475Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention23 avril 2024103 5 oct. 2006 à 16:58
atoi() te permet, comme son nom l'indique de passer d'une chaine de caractères vers un entier (ASCII To Integer). Or, tu veux le contraire si j'ai bien compris.
Utilise donc sprintf() qui te permet de convertir "n'importe quoi" en chaine de caractères.
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
develdelphi
Messages postés97Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention20 avril 2009 6 oct. 2006 à 00:41
Salut,
en fait c'est bien ce que j'ai dit cette fois je veux l'inverse que ce que je t'avais demande au depart.
En effet je veux convertir du string en integer car c'est vrai je te l'ai pas dit pour instancier l' objet de la classe BestCamHardware
il a besoin qu'on lui passe un integer comme argument (temp) dans cette instruction:
////
m_pHardware = new BestCamHardware(temp)
////
La je suis sur c'est bien du string vers l'integer que je veux convertir par contre je me demande si je dois pas mettre
(LPCTSTR) dans la fonction atoi comme j'avais fait pour mon premier probleme: strFile=string((LPCTSTR)(m_Init.Get_Params_Hardware_Config_FileInit()+"BestCamHardware"+m_Init.Get_Params_Hardware_Config_FileInit_NumA()+".ini"));
BunoCS
Messages postés15475Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention23 avril 2024103 6 oct. 2006 à 09:27
Ok, on va y arrivé
Bon. Tu as le numéro de ta caméra dans une string strNumeroCamera.
Tu veux récupérer ce numéro dans un entier.
Effectivement, il faut utiliser atoi()...avec une petite subtilité: atoi() attend en paramètre un char *. Or tu as une string. Il faut donc convertir ta string en char *: strNumeroCamera.c_str().
string strNumeroCamera="13";
int iNum = atoi(strNumeroCamera.c_str());
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
develdelphi
Messages postés97Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention20 avril 2009 10 oct. 2006 à 17:00
Bonjour,
Je voudrais afficher dans une List Box, les problèmes rencontrés lors de l'initialisations
des caméras (Hardwares) ( il y en a deux maximum).
-Je vous explique generalement le prorgamme:
Mon programmme travaille en Multithreads. Tout d'abord, j'ai quelques petits soucis car
l'affichage des erreurs tarde à venir mais ça je pense que c'est du au fait que j'utilise une fonction
'Ontimer(UINT nIDEvent)' durant la phase d'affichage des erreurs à l'initialisations. Mais bon ce problème je le traiterai
après.
Maintenant au niveau de l'affichage, il est question de 2 caméras et il faut
les initialiser et afficher leurs erreurs d'init ( mauvais fichier chargé pour les caméras ou caméra débranchées)
Au depart je n'avais qu'une seule caméra et l'affichage se fesait très bien,
actuellement j'en utilise deux et donc je suis amener à changer les fonctions.
J'ai une classe 'CViewSYSInitialisation' dont la fonction 'Ontimer(UINT nIDEvent)'
fait appel à une autre fonction d'une autre classe générale CMy99090DOC' cette derinere
fonction renvoit les instanciations des 2 caméras (m_pThreadHardware1 et m_pThreadHardware2)
qu'elle aura recuperer de la classe Hardware cette dernière classe
enregistrera, avec sa fonction 'Init()', l'initialisation des caméras et enregistrera donc des erreurs d'init des
chaques instances des caméras dans leurs variables 'm_initHardwarestatus'.
-Après ces explications, mes questions:
En effet j'ai dans ma fonction 'isProblemHardware()' qui est apellée par cette
variable ''initHardwarestatus' de la fonction 'Ontimer(UINT nIDEvent)'
un retour d'un entier. Ce entier retourné est évaluée dans la fonction appellante par un switch
puis en fonction des différents case: je fais un Addstring sur ma liste box.
La fonction tel que je l'ai fait marche mais n'est pas très professionnelle
car elle renvoit les erreurs d'init que d'une des cameras ( celle qui se serait initialisée la
première) comment puis-je savoir lors de l'appel de cette fonction quelle instanciation donner
à la fonction appellante?
-Codes:
On peut dire que les codes se divisent en 2 parties : - INITIALISATIONS HARDWARES
- AFFICHAGES DES PROBLEMES D'INIT HARDWARE
Les principales instances et variables : - m_initHardwarestatus
- m_pThreadHardware1
- m_pThreadHardware2
int CMy99090Doc::Process(unsigned int uiProcess)
{
try
{
CString cstrFichier=m_Init.Get_Params_ACDAS_File();
if(cstrFichier.Compare ("")==0)
return 1;
switch (uiProcess)
{
case PROCESS_DIVERS_ACQUISITION: // autre process
......... (codes inutiles)
case PROCESS_SYS_AUTOMATIQUE: // notre process
if(m_Init.Get_Params_SYS_Config_Securiy() & LEVEL_4) // securité et niveau dans lequel on travaille
{
m_pThreadHardware1= new CThreadHardware(0); // Thread initalisation de la caméra 1
TRACE("Début tache BestCam principale1\n");
m_pThreadHardware1->CreateThread(NULL,0);
if(m_pThreadDispatcher) // Thread qui dispatche les autres Threads
{
m_pThreadDispatcher->Thread_Stop();
delete m_pThreadDispatcher;
TRACE("fin tache Dispatcher case ACDASSYSautom\n");//4
m_pThreadDispatcher=0;
}
m_pThreadDispatcher= new CThreadDispatcher
( m_Init.Get_Params_ACDAS_File(),
this,
m_pThreadWago1, // pour la comminication avec differents peripheriques
m_pThreadWago2,
m_pThreadHardware1, // camera 1
m_pThreadHardware2, // camera 2
THREAD_ACQUISITION | THREAD_TRAITEMENT
| THREAD_AUTOMATIQUE
);
TRACE("Début tache Dispatcher case ACDASSYSautom\n");//4
m_pThreadDispatcher->CreateThread(NULL,0);
int CThreadHardware::Init_BestCam()
{
m_initHardwarestatus=m_pHardware->Init();
if(m_initHardwarestatus)
{
int CHardware::Init() ///////inittialisations avec les differents erreurs possible
{
try
{
FSRetVal tmp;
string strFile;
CInit m_Init;
if(m_bver==0) ////testali mettre appel du this ?
strFile=string((LPCTSTR)(m_Init.Get_Params_Hardware_Config_FileInit()+"BestCamHardware_"+m_Init.Get_Params_Hardware_Config_FileInit_NumA()+".ini"));
else
strFile=string((LPCTSTR)(m_Init.Get_Params_Hardware_Config_FileInit()+"BestCamHardware_"+m_Init.Get_Params_Hardware_Config_FileInit_NumB()+".ini"));
-----------------------------------------------
-----------------------------------------------
AFFICHAGES DES PROBLEMES D'INIT HARDWARE
-----------------------------------------------
-----------------------------------------------
void CViewSYSInitialisation::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
unsigned int uiSecurity;
CString strDatalist; // pour afficher dans la list box
uiSecurity=m_Init.Get_Params_SYS_Config_Securiy();
// Vérifie le mode de fonctionnement
if(nIDEvent==ID_CLOCK_SYS)
{
KillTimer(ID_CLOCK_SYS);
CMy99090Doc *pDoc= (CMy99090Doc *) GetDocument();
-------------------------------------------------
int CMy99090Doc::isProblemeHardware() /////a savoir kel camera deconne
{
/* code depart
int ireturn=0;
m_pThreadHardware2->m_initHardwarestatus;
if(m_pThreadHardware1==0 && m_pThreadHardware2==0 )
return 0;
if(m_pThreadHardware1==0 || m_pThreadHardware2==0 )
if (m_pThreadHardware1==0)
{if (m_pThreadHardware2->isProbleme())
ireturn =m_pThreadHardware2->m_initHardwarestatus;
}
else
if (m_pThreadHardware1->isProbleme())
ireturn =m_pThreadHardware1->m_initHardwarestatus;
return ireturn;
*/
// m_initHardwarestatus pour avoir le numero de l'erreur, deja defini grace a int CHardware::Init()
int ireturn=0;
if(m_pThreadHardware1->m_initHardwarestatus==0 && m_pThreadHardware2->m_initHardwarestatus==0)
return 0;
if (m_pThreadHardware1->m_initHardwarestatus!=0 || m_pThreadHardware2->m_initHardwarestatus!=0)
//if (m_pThreadHardware1->m_initHardwarestatus!=0)
//if(m_bfront==0)
//if(CHardware::m_pHardware->m_bver==0) // ici j'ai des erreurs m_bver non connu alors que je met la classe devant ?
if (m_pThreadHardware1->isProbleme())
ireturn= m_pThreadHardware1->m_initHardwarestatus ;
if (m_pThreadHardware2->isProbleme())
ireturn= m_pThreadHardware2->m_initHardwarestatus ;
Comme vous pouvez le voir je ne peu initialiser en même temps les deux Hardware ensemble car la fonction isProblemeHardware()
ne renvoit qu'un seul entier.
Pourrais-je eventuellement passer un argument à la fonction et si oui quel type d'argument et comment ?
pourrais-je utiliser un this et comment?