Salut,
alors histoire de vérifier tout de suite que j'ai pas fait de grosses boulettes, je voudrais soumettre mon code à vos yeux aguerris...
Je tiens à préciser que ce code fonctionne bien tel quel. Ce que je veux juste savoir, c'est s'il ne fonctionnerait pas malgré quelques (?) erreurs dont je n'aurais pas conscience...
Tout commence avec la déclaration des structures:
Code :
- struct ContenuUneStatUnXML
- {
- AnsiString NomStat;
- vector<int> VecUneStatUnXML; //Contient chaque Frame
- };
- struct ContenuTtesStatUnXML
- {
- AnsiString PathXML;
- vector<ContenuUneStatUnXML> VecTtesStatUnXML;
- };
|
Ensuite voilà seulement les fonctions concernées:
Code :
- void __fastcall TListeMatchesForm::CreerClipClick(TObject *Sender)
- {
- bool AUnParent = false;
- vector<int> VecSelectedIndex;
- vector<int> VecSelectedStats;
- VecSelectedIndex.clear();
- VecSelectedStats.clear();
- if (ListeMatches->Selected->Parent)
- AUnParent = true;
- //On remplit VecSelectedIndex avec l'index de chacun des fichiers sélectionnés
- if (AUnParent)
- VecSelectedIndex.push_back(ListeMatches->Selected->Parent->Index);
- else
- for (unsigned int i=0; i < ListeMatches->SelectionCount; i++)
- VecSelectedIndex.push_back(int(ListeMatches->Selections[i]->Index));
- //On remplit VecSelectedStats avec l'index de chacune des stats choisies
- for (int i=0; i < ListeStats->Items->Count; i++)
- if (ListeStats->Selected[i])
- VecSelectedStats.push_back(i);
- if (MakeClip(VecSelectedIndex,VecSelectedStats))
- ShowMessage("Le clip est réalisé" );
- }
|
Code :
- bool __fastcall TListeMatchesForm::MakeClip(
- vector<int> &VecSelectedIndex,
- vector<int> &VecSelectedStats)
- {
- NomSelectionne = "";
- //Si on a choisi une équipe, EquipeChoisie = true, sinon false
- EquipeChoisie = true;
- if (EquipeChoisie = (ListeJoueurs->ItemIndex == -1))
- NomSelectionne = ListeEquipes->Items->Strings[ListeEquipes->ItemIndex];
- else
- NomSelectionne = ListeJoueurs->Items->Strings[ListeJoueurs->ItemIndex];
- //On va créer VecTtesStatsTsXML qui contiendra toutes les données
- vector<ContenuTtesStatUnXML> VecTtesStatsTsXML;
- VecTtesStatsTsXML.clear();
- for (unsigned int i=0; i < VecSelectedIndex.size(); i++)
- {
- int IndexDsContenu = VecSelectedIndex[i];
- //On enregistre le path du XML qui va être analysé
- AnsiString PathXML = VecListeMatches[IndexDsContenu].PathFichierStats;
- //On va chercher dans les fichiers de stats choisis les données
- //pour le clip vidéo
- if (!RemplirVecTSTX(VecTtesStatsTsXML,VecSelectedStats,PathXML))
- return false;
- }
- return true;
- }
|
Code :
- bool __fastcall TListeMatchesForm::RemplirVecTSTX(
- vector<ContenuTtesStatUnXML> & VecTtesStatsTsXML,
- vector<int> & VecSelectedStats,
- AnsiString PathXML)
- {
- //On crée une nouvelle structure qui contiendra le nom de la stat et les
- //frames correspondantes pour un fichier
- ContenuUneStatUnXML CUSUX;
- //On crée une nouvelle structure qui contiendra le path du fichier stat
- //et une structure CUSUX pour chaque stat choisie
- ContenuTtesStatUnXML CTSUX;
- //On place le path du XML des stats pour pouvoir le distinguer des autes
- //CTSUX
- CTSUX.PathXML = PathXML;
- XMLStats->FileName = PathXML;
- XMLStats->Active = true;
- if (!XMLStats->Active)
- return false;
- _di_IXMLNode PtrContenu = XMLStats->DocumentElement;
- //On scanne dans l'ordre:
- // * les équipes
- int NbreJoueurs = PtrStaff->ChildNodes->GetCount();
- int NbreStatsChoisies = VecSelectedStats.size();
- int NbreStats = PtrStatGlob->ChildNodes->GetCount();
- for (int i=0; i < 2; i++)
- {
- _di_IXMLNode PtrEquipe = PtrContenu->ChildNodes->GetNode(i);
- AnsiString NomEquipe = PtrEquipe->GetAttribute("Equipe" );
- _di_IXMLNode PtrStaff = PtrEquipe->ChildNodes->GetNode(0);
- //On remet à zéro la liste des frames
- CUSUX.VecUneStatUnXML.clear();
- // * les joueurs
- for (int j=0; j < NbreJoueurs; j++)
- {
- _di_IXMLNode PtrJoueur = PtrStaff->ChildNodes->GetNode(j);
- AnsiString NumNomJoueur = PtrJoueur->GetAttribute("Nom" );
- char * NomJoueur = NumNomJoueur.c_str();
- NomJoueur = strchr(NomJoueur,' ') + 1;
- //Si on a choisi un joueur, on arrête la boucle si on n'a
- //pas choisi une équipe et si le nom scanné correspond
- //au joueur choisi
- if (EquipeChoisie || (AnsiString(NomJoueur) == NomSelectionne))
- {
- //On remet à zéro la liste des stats déjà scannées
- CTSUX.VecTtesStatUnXML.clear();
- // * les categories de stats
- for (unsigned int k=0; k < NbreStatsChoisies; k++)
- {
- _di_IXMLNode PtrStatGlob = PtrJoueur->ChildNodes->GetNode(VecSelectedStats[k]);
- //On ajoute à CUSUX le nom de la stat
- //pour la distinguer
- CUSUX.NomStat = pListeStats[VecSelectedStats[k]];
- // * les stats individuellement
- for (int l=0; l < NbreStats; l++)
- {
- _di_IXMLNode PtrStat = PtrStatGlob->ChildNodes->GetNode(l);
- int FrameStat = PtrStat->GetNodeValue();
- //On ajoute au vecteur de CUSUX la
- //Frame actuelle
- CUSUX.VecUneStatUnXML.push_back(FrameStat);
- }
- //On ajoute au vecteur de CTSUX la catégorie
- //de stat scannée juste avant
- CTSUX.VecTtesStatUnXML.push_back(CUSUX);
- }
- }
- }
- //Si on a choisi une équipe, on arrête la boucle quand le nom
- //scanné correspond au nom choisi
- if (EquipeChoisie && (NomEquipe == NomSelectionne))
- break;
- }
- //On ajoute au vecteur qui contient toutes les données le résultat du scan
- //de ce fichier XML de stats...
- VecTtesStatsTsXML.push_back(CTSUX);
- return true;
- }
|
Si vous pouviez me dire quoi, notamment au niveau des passages par référence, notamment pour la dernière fonction RemplirVecTSTX:
Je déclare CUSUX et CTSUX dans cette fonction... hors, après l'appel à cette fonction dans MakeClip, je dois récupérer tout ce qui a été enregistré dans ces structures...
Que vaut-il mieux que je fasse:
Comme maintenant, et après l'appel à RemplirVecTSTX redéclarer CUSUX et CTSUX? J'ai essayé, ça fonctionne, mais je ne sais pas si c'est la manière de procéder...
Ou bien déclarer CUSUX et CTSUX avant d'appeller RemplirVecTSTX, et passer ces deux structures par référence?
J'attends vos avis...
Merci d'avance!!
---------------
Another .Net Blog