tanguy_laverdure
Messages postés34Date d'inscriptionmercredi 19 novembre 2003StatutMembreDernière intervention12 mai 2004
-
13 févr. 2004 à 16:21
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 2006
-
24 févr. 2004 à 00:08
Bonjour,
Dans une fenetre de dialogue, j'insere un activeX (MicroSoft MapPoint Control 11.0) par la commande Insert ActiveX Control.
Lorsque je click OK, le controle est insére dans ma fenetre.
Lorsque je lance mon application, je ne voir pas le controle active X que je vien d'inserer.
tanguy_laverdure
Messages postés34Date d'inscriptionmercredi 19 novembre 2003StatutMembreDernière intervention12 mai 2004 17 févr. 2004 à 11:58
Merci,
En fait il faut installer completement l'activX de mappoint, c'est a dire dans le MFC class Wizzard, cree une donnee membre (une instance du control mapPoint).
A ce moment la, dans la methode OnInitDialog de ma boite de dialogue, je peux faire
_variant_t tVar;
short Var = 2;
tVar = Var;
m_MapPoint.NewMap(tVar);
bien sur il faut passe un _variant_t en arguement et la non plus c'est pas simple (ajout de #include "map.h" et #include "comutil.h" dans la cpp) et ajouter comme ressource COMSUPP.lib
Apres cela ca compile et ca fonctionne ... enfin presque.
Car la carte s'affiche bien dans ma fenetre de dialogue mais si je bouge la souris dessus, j'ai un debug assertion failed
dans le fichier occcont.cpp a la ligne 385
je sais pas trop se qui fait , regarde si le controle est active, le desactive ...
SetCapture();
// ouverture nouvelle carte
VARIANT var;
var.vt = VT_INT;
var.intVal = 2; //geoMapEurope
CMap1 map = m_pMappointCtrl->NewMap(var);
// bidouille nécessaire pour éviter un plantage (problème d'activation du contrôle)
m_pCtrlCont->OnUIDeactivate(m_pMappointCtrl->GetCtrlSite());
m_pCtrlCont->OnUIActivate(NULL);
SetFocus();
ReleaseCapture();
normalement ça devrait aller (attention, le fichier MappointCtrl'h est regénéré à chaque fois que tu touche à projet->Insérer un contrôle activeX)
tanguy_laverdure
Messages postés34Date d'inscriptionmercredi 19 novembre 2003StatutMembreDernière intervention12 mai 2004 19 févr. 2004 à 10:54
J'ecris une appli qui lit un fichier texte contenant plusieurs centaines de villes et qui interroge MapPoint pour connaitre la distance entre chacune de ces villes.
En considerant que la distance de A à B et la même que celle de B à A, j'ai quand même n²/2 calcul de distance a faire.
Y a t il moyen de supprimer l'affichage des routes pendant le calcul des distances (ce qui devrait reduire le temps qui aest de 24 heures aujourd'hui pour 320 villes)
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 20 févr. 2004 à 18:01
Tu as quoi dans ton fichier pour les repérer ?
Si c'est les coordonnées géographiques, il vaut mieux calculer la distance toi-même.
sinon, je suppose que tu importe le fichier dans MapPoint.
importe tes villes sous forme de pushpin et réalise les calculs à partir des objets location.
tanguy_laverdure
Messages postés34Date d'inscriptionmercredi 19 novembre 2003StatutMembreDernière intervention12 mai 2004 23 févr. 2004 à 09:19
void CDISComMapPointPjtDlg::OnButton1()
{
// TODO: Add your control notification handler code here
// Met a jour les variables des controles
UpdateData(TRUE);
int iArretApplication=0;
// Ouverture et lecture du fichier source
//---------------------------------------
ifstream fichierSource;
if (m_fichierSource != "")
{
fichierSource.open(m_fichierSource,ios::in);
}
else
{
MessageBox("Le nom du fichier source n'est pas valide");
return;
}
while (fichierSource.getline(buf,1000) && fichierSource.good() && !fichierSource.eof())
{
char *cbuf = strdup(buf);
string sbuf(buf);
int ibufLength = sbuf.length();
string sLegendeDepartement = "DEPARTEMENT: ";
int iLegendeDepartementLenght = sLegendeDepartement.length();
int iPosition=0;
// Decodage du nom du departement
if ((iPosition=sbuf.find(sLegendeDepartement)) >= 0)
{
sDepartement = sbuf.substr(iPosition+iLegendeDepartementLenght,ibufLength);
continue;
}
// Creation du fichier liste de ville et correspondance des numeros
//-----------------------------------------------------------------
fstream fichierCorrespondances;
if (m_fichierCorrespondances == "")
{
CString fichier;
fichier+="Correspondances";
fichier+=sDepartement.c_str();
if (m_fichierCorrespondances != "")
{
fichierCorrespondances.open(m_fichierCorrespondances,ios::out);
}
else
{
MessageBox("Le nom du fichier de corespondance n'est pas valide");
return;
}
// Ecriture dans le fichier
if (fichierCorrespondances.good())
{
for (int i=1; i<=Liste_Ville.size()-1; ++i)
{
fichierCorrespondances << i << " " << Liste_Ville[i].c_str() << endl; // ecrit "i nom de ville "
}
fichierCorrespondances.close ();
}
// Creation du fichier des chemins les plus courts en Km entre les villes
//-----------------------------------------------------------------------
_cMap.ZoomOut();
m_fichierCheminsPlusCourts = CString(fichierComplet);
}
if (m_fichierCheminsPlusCourts != "")
{
fichierCheminsPlusCourts.open(m_fichierCheminsPlusCourts,ios::out);
}
else
{
MessageBox("Le nom du fichier des chemins les plus courts n'est pas valide");
return;
}
// Creation du fichier des chemins les plus rapide en Km entre les villes
//-----------------------------------------------------------------------
fstream fichierCheminsPlusRapides;
if (m_fichierCheminsPlusRapides == "")
{
CString fichier;
fichier+="CheminsPlusRapides";
fichier+=sDepartement.c_str();
if (m_fichierCheminsPlusRapides != "")
{
fichierCheminsPlusRapides.open(m_fichierCheminsPlusRapides,ios::out);
}
else
{
MessageBox("Le nom du fichier des chemins les plus rapides n'est pas valide");
return;
}
//----------------------------------------
//--- recherche de la route la plus rapide
//-----------------------------------------
wStartPoint.SetSegmentPreferences(2);
wStartPoint2.SetSegmentPreferences(2);
cWaypoints.Optimize();
cRoute.Calculate();
cWaypoints.Optimize();
//----------------------------------------
//--- recherche de la route la plus courte
//-----------------------------------------
wStartPoint.SetSegmentPreferences(1);
wStartPoint2.SetSegmentPreferences(1);
cWaypoints.Optimize();
cRoute.Calculate();
cWaypoints.Optimize();
//----------------------------------------
//--- mise à jour information interface et fichiers
//-----------------------------------------
m_cheminPlusRapide = distance;
m_cheminPlusCourt = distance2;
// Met a jour les variables des controles
UpdateData(FALSE);
// Stop de l'application en cas de click sur le bouton d'arret d'urgence
if (_bArretApplication)
{
fichierCheminsPlusRapides.close();
fichierCheminsPlusCourts.close();
break;
}
} // fin boucle en j
// Stop de l'application en cas de click sur le bouton d'arret d'urgence
if (_bArretApplication)
{
fichierCheminsPlusRapides.close();
fichierCheminsPlusCourts.close();
break;
}
Le bout de code ci-dessus s'arrete au bout d'un certain temps car il n'y a plus assez de memoire. Que puis je faire pour verifier les fuites de memoire dans VC++ ?
Y a t il quelque chose qui n'est aps fait correctement dans ce bout de code ?
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 23 févr. 2004 à 17:06
Si j'ai bien compris, tu lis dans un fichier N villes puis tu veus calculer les distance 2 à 2 entre les villes.
Dans un premier temps, tu devrait rechercher les villes avant de faire le calcul (dans ton code tu recherche émormément de fois les même ville). Stocke les dans un tableau de CLocation ou CPushpin ou LPDISPATCH, peu importe (la valeur retournée par FindAddressResults puis GetItem.
Comme cela tu pourra déjà repérer les villes non trouvées (en mettant un NULL et en testant dans ta boucle).
Ensuite, je pense qu'il faut faire un clear de la route avant chaque calcul, et récupérer le tableau de Waypoints et y ajouter les 2 villes actuelles.
Dans ta boucle actuelle, j'ai l'impression que tu ajoute au fur et à mesure les villes sur la route, ce qui fait qu'il calcule des distances déjà connue. (à moins que tu souhaite connaître par exemple la distance entre A et B en passant par C, ce que je ne croit pas être le cas.)
Sinon sous VC++ pour détecter les fuites de mémoires avec les MFC, c'est simple.
lance le prog en debug( même s'il n'y a pas de point d'arrêt, c'est pas grave -> commande F5 je crois).
Ensuite, utilise ton prog et quitte-le.
regarde maintenant la fenêtre output, tu doit avoir la liste des modules chargés et les fuites de mémoires (s'il y en a avec le module qui a appelé new).
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 24 févr. 2004 à 00:08
Normalement après avois lancer un prog par le debugger, dans la fenêtre output il doit y avoir un onglet "Debug" avec ce que le prog a fait (chargement des dlls et symbole, messages TRACE, et memory leak éventuels). Les memory leak n'aparaissent qu'avec les MFC.
mais dans ton cas je croit que c'est pas ça le prb : je pense qu'il doit falloir faire un Release sur les LPDISPATCH retournés ou bien utiliser les classes fournies par l'activeX (qui se charge de le faire à la destruction de l'objet).