Afficher une grille [Résolu]

Messages postés
16
Date d'inscription
jeudi 19 octobre 2006
Dernière intervention
24 juillet 2009
- 19 oct. 2006 à 17:59 - Dernière réponse :
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Dernière intervention
23 janvier 2016
- 31 oct. 2006 à 19:53
salut à tous, j'ai un tableau a deux dimmensions et j'aimerais afficher se tableau dans une fenetre.

J'ai pensé à une Listview, mais le probleme est que dans les tutos que j'ai vu, on ne pouvais pas gerer case par case(voir groupe de case).

Voila mon probleme est la.

Je code en C sous visual studio.

Thx
Afficher la suite 

Votre réponse

23 réponses

Meilleure réponse
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Dernière intervention
23 janvier 2016
- 20 oct. 2006 à 17:54
3
Merci
Bien sur, si ça peut t'aider.

Tu dois ajouter à ta boite à outils VStudio le controle activeX
MS-hierarchicalFlexGrid Version 6. (Component gallery pour c++6 ou objets COM pour .net), ensuite tu le fait glisser sur un dialog et tu ajoute une var membre comme pour un bouton ou autre. VStudio va générer une classe wrapper (.h et .cpp), puis tu utiliseras les méthodes et constantes du wrapper.

EX :

//Dans ta class dialog.h
#include "msflexgrid1.h"

CMsflexgrid1 m_flexgrid;

// Dans onDraw() par exemple

int nbrChamp;
int nbrLigne;


// Cela sert pour des données exemples
// peut provenir d'un tab ou base de données ect....
int i;
int posSepar = 0;
int ancienPos = 0;int nDebutLigne 0, nFinLigne 0;
CString sLigne(_T(""));
CString extract(_T(""));


// Données exemples
CString header[4] = {_T("idHeader"),_T("ChampTexte"),
                               _T("ChampFloat"),_T("ChampDate")};
CString sResultat(_T("100|texte 1|125.25|28/06/2004 01:12:00|\r\n")
                          _T("200|texte 2|100.55|10/02/2001 10:02:00|\r\n")
                          _T("300|texte 3|110.10|NULL|\r\n"));


m_flexgrid.Clear();

// nombre de lignes fixe à la création, donc modifiées ici


m_flexgrid.put_Rows((long)nbrLigne+1);


// Ecrit les entêtes du flexgrid, largeur & alignement gauche
for(i=0; i<nbrChamp; i++)
{
 m_flexgrid.put_TextMatrix(0, i, header[i]);
 m_flexgrid.put_ColAlignment(i, CMsflexgrid1::flexAlignLeftCenter);
 m_flexgrid.put_ColWidth(i, 1400L);
   
}


// Extrait les données par ligne et champs


for(i=0; i<nbrLigne; i++)
{
 posSepar  = 0;
 ancienPos = 0;
 nFinLigne = sResultat.Find("\r\n", nDebutLigne);
 sLigne = sResultat.Mid(nDebutLigne, nFinLigne-nDebutLigne);
 nDebutLigne = nFinLigne + 2;
  
 for(int k=0; k<nbrChamp; k++)
 {
  // BackColor ligne paires plus foncées
  if( i%2 == 0 )
  {
   m_flexgrid.put_Row((long)i+1);
   m_flexgrid.put_Col((long)k);
   m_flexgrid.put_CellBackColor((unsigned long)RGB(240,240,240));
  }


  // déformate val & insère dans colonnes
  if( (posSepar = sLigne.Find('|', ancienPos)) != -1 )
  {
   extract = sLigne.Mid(ancienPos, (posSepar-ancienPos));
   ancienPos = posSepar + 1;
   m_flexgrid.put_TextMatrix(i+1, k, (LPCTSTR)extract);
  }
  else
  {
   m_flexgrid.put_TextMatrix(i+1, k, _T("NULL"));
  }
 }
}

// Les fausses données sont séparés par des '|' car c'est un morceau de code que j'utilise moi meme, mais tu peux faire plus simple en ne mettant que des données numériques.

Merci yann_lo_san 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 85 internautes ce mois-ci

Commenter la réponse de yann_lo_san
Meilleure réponse
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Dernière intervention
14 novembre 2014
- 20 oct. 2006 à 22:04
3
Merci
Quand la ListView est cliquée, la procédure de la fenêtre mère reçoit le message  WM_NOTIFY. lParam contient un pointeur sur une structure NMITEMACTIVATE. Cette structure contient le type de clic, l'Item et le sous-Item cliqué. Pour que seules les cellules désirées soient sélectionnées en changeant leurs couleurs, la ListView doit avoir le style  LVS_OWNERDRAWFIXED. Le dessin de la ListView se fait pendant le traitement du message WM_DRAWITEM. Certaines fonctions permettent de récupérer le RECT de chaque cellule.

Merci racpp 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 85 internautes ce mois-ci

Commenter la réponse de racpp
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Dernière intervention
23 janvier 2016
- 19 oct. 2006 à 20:20
0
Merci
le microsoft hierarchical flexgrid est magnifique pour ça, couleur des case et lignes, evenements cellules, affichage très rapide pour des milliers de lignes, ect...

c'est un controle activeX.

sinon y'a GDI, le dessin d'une grille et de texte peut faire l'affaire assez facilement.

salut.
Commenter la réponse de yann_lo_san
Messages postés
16
Date d'inscription
jeudi 19 octobre 2006
Dernière intervention
24 juillet 2009
- 20 oct. 2006 à 13:56
0
Merci
Salut et merci pour l'info

alors mon probleme a évolué, j'ai trouvé cet article :

http://www.cppfrance.com/code.aspx?ID=29171

que j'ai trouvé tres interressant, mais voila mon nouveau probleme

Toutes les docs que j'ai trouvé (ou presque) concernant le controle activeX flexgrid sont données pour du visual basic.

Si tu pouvais me donner un dernier coup de main :)
Commenter la réponse de igloobuster
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Dernière intervention
23 janvier 2016
- 20 oct. 2006 à 17:59
0
Merci
J'ai oublié d'initialiser les 2 premieres var
int nbrChamp = 4; //logique vue les fausses données
int nbrLigne = 3;   // idem
Commenter la réponse de yann_lo_san
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Dernière intervention
14 novembre 2014
- 20 oct. 2006 à 20:55
0
Merci
Salut,
Normalement une ListView devrait suffire. Qu'est-ce que tu veux faire exactement?
Le FlexGrid est un Activex pour VB. Ton programme ne tournera sur les autres PCs qu'après avoir installé cet Activex.
Commenter la réponse de racpp
Messages postés
16
Date d'inscription
jeudi 19 octobre 2006
Dernière intervention
24 juillet 2009
- 20 oct. 2006 à 21:19
0
Merci
Merci à yann_lo_san, je testerais demain :)

J'ai un tableau de char* (je precise char* car je ne suis pas en c++ pour x raison)

le but est d'avoir une vue un peu comme une feuille excel, que l'on puisse selectionner case par case.

le probleme de la listview (enfin le mien) est que je n'arrive pas a dissocier une case d'une ligne à ses soeurs.


Voilà :P
Commenter la réponse de igloobuster
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Dernière intervention
23 janvier 2016
- 20 oct. 2006 à 23:04
0
Merci
racpp, un activeX n'est pas fait pour un langage en particulier, si on a la license VisualStudio, on à le droit de mettre l'OCX dans l'installeur, si c'était fait que pour VB, on aurait plus de controle diagramme graphique, carte cliquable, compteur de perfrormances, tous les controle WEB ASP activeX ect... et VC++ ne serait plus qu'un faiseur de programme console.
Commenter la réponse de yann_lo_san
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Dernière intervention
14 novembre 2014
- 21 oct. 2006 à 00:15
0
Merci
yann_lo_san >> Je parle uniquement des controles Activex qui sont installés dans le système par  Visual Basic. Ils sont donc fait uniquement pour les applications faites en VB. C'est leur seule raison d'être. Le FlexGrid en est un exemple. Avec le C il est préférable de l'éviter pour ne pas avoir de dépendance à cet Activex et avoir à le mettre  dans l'installeur. La ListView permet de tout faire et en mieux. Ca fonctionne du premier coup sur tous les PCs.
Commenter la réponse de racpp
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Dernière intervention
23 janvier 2016
- 21 oct. 2006 à 15:29
0
Merci
Je comprend, mais selon Visual C++ 6 de Mickey Williams (campus presse), le controle Flex Grid est livré avec VC++ et pour VC++, dans le but de créer des tableurs simples.
Mais ceci n'est quant même pas très important !
On aime bien se contredire quant on est passionné...
Bonne continuation.
Commenter la réponse de yann_lo_san
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Dernière intervention
23 janvier 2016
- 21 oct. 2006 à 23:08
0
Merci
PS : J'ai essayé de construire un mini flexgrid avec un listView et c'est un bordel sans nom, l'enfer sur terre ! On voit vraiment que ce n'est pas fait pour ça. Même avec WinDev utiliser une table est le b-A-bA, etonnant qu'il faille coder des heures une listView pour un résultat proche d'une table mémoire !
Commenter la réponse de yann_lo_san
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Dernière intervention
14 novembre 2014
- 22 oct. 2006 à 03:51
0
Merci
Salut,
Je ne connais pas Mickey Williams mais il parait qu'il traite des MFC dans son livre. Tout le monde sait que les MFC est une catastrophe. Tous ces Activex sont fournis avec Visual Studio 6 mais certains ne sont installés que si VB est installé. J'ai déjà vécu ce genre d'expérience.
Pour profiter des possibilités d'une ListView il faut savoir bien l'utiliser dans le code. C'est vrai que ce n'est pas très facile mais c'est ça ce qu'on appelle la programmation. On n'a besoin de programmer notre ListView qu'une seule fois dans la vie, ensuite il suffira d'adapter le code pour les nouveaux cas. Ainsi, on a la maitrise totale de la ListView et de notre programme en général car on comprend tout ce qu'on fait. Ce n'est pas le cas avec les MFC ou Windev qui font presque tout le travail de codage à notre place. C'est de la pseudo-programmation.
Chacun choisit la méthode qui lui convient le mieux.
Commenter la réponse de racpp
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Dernière intervention
23 janvier 2016
- 22 oct. 2006 à 18:37
0
Merci
Je ne suis pas d'accord avec toi, apparemment tu es un puriste de la prise de tête, car les MFC ont été faites pour programmer "objet" des structure C/Win32, et c'est un travail énorme et bien aboutit que ces classes. D'ailleur un principe premier du développement n'est il pas de ne pas recréer ce qui à déjà été fait, même si je suis d'accord sur le fait qu'il faille comprendre ce que l'on fait quant on programme. Mais je crois que bien utilisées, les MFC sont adéquates.
Ceci dit, avec le .net et C#, cette discussion n'a plus lieu d'être...
Commenter la réponse de yann_lo_san
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Dernière intervention
14 novembre 2014
- 23 oct. 2006 à 05:09
0
Merci
Le .NET avec C# est pire que les MFC. Ces dernières seront bientôt abandonnées par Microsoft. Tout le monde cherche la simplicité de programmation au détriment du résultat final. Personnellement, je préfère passer quatre mois pour bien affiner une application que de la faire en une semaine en utilisant ce qui existe déjà et qui ne correspond pas totalement à ce qu'on veut faire sans parler du peu de controle qu'on a dessus.
A chacun ses priorités.
 
Commenter la réponse de racpp
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Dernière intervention
23 janvier 2016
- 23 oct. 2006 à 13:28
0
Merci
Et bien ou ton employeur est très ouvert d'esprit ou tu es ton propre patron et là, bien sur que 4 mois sur une appli, c'est du pain béni.
Commenter la réponse de yann_lo_san
Messages postés
16
Date d'inscription
jeudi 19 octobre 2006
Dernière intervention
24 juillet 2009
- 24 oct. 2006 à 16:59
0
Merci
Le probleme quand tu code en C, c'est d'avoir des .cpp =P

ca fait un ptit bout de temps que je me prend la tete la, je crois que le faire à la main me parait etre plus judicieux, a moins que tu ne vois une solution...
Commenter la réponse de igloobuster
Messages postés
16
Date d'inscription
jeudi 19 octobre 2006
Dernière intervention
24 juillet 2009
- 25 oct. 2006 à 10:39
0
Merci
Oups j'ai peut etre un peu mal expliqué ma situation...

Je me suis dis, essayons les controles activeX...

En C++ aucun probleme, c'est meme d'une facilité enfantine !

Mais alors paye ta galere en C !!! Aucun tuto, aucune aide et surtout VS genere des .cpp quand on lui en demande (de l'aide). Pour un programe plain C c'est un peu embetant.

Alors est-ce la mort des activeX ou est-je encore une chance ?

PS : Merci en tout cas de toutes vos réponse :)
Commenter la réponse de igloobuster
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Dernière intervention
23 janvier 2016
- 25 oct. 2006 à 22:24
0
Merci
Ben, en C y'a pas 36 manière de faire, vu que les activeX sont des objets automation, il faut tater du COM à tous va, les CLSID, les QueryInterface, ect... Voir 'Inside COM' dans msdn, y'a un tuto pour de C pur, avec gestion des vtable.
Mais le plus simple reste de demander a VC++ de créer les classe wrapper, ou #import fichier.tbl (biblio de type).
Commenter la réponse de yann_lo_san
Messages postés
16
Date d'inscription
jeudi 19 octobre 2006
Dernière intervention
24 juillet 2009
- 31 oct. 2006 à 16:24
0
Merci
Bon pour conclure, apres avoir abandonné un peu ma gui pour m'intérresser au code important, j'ai été contraint d'y retourner.

Seulement voilà, mes essais activX avait été assez infructueux.

Je ne dis pas que c'est pas la bonne solution, mais en C c'est une véritable vrai galère.

Et j'ai tout compte fait trouvé un bon tuto dur les listview, et il apparait que ce n'est pas si compliqué que ca... il suffit juste de bien comprendre.

Donc pour conclure j'ai opté pour les listview. Voila :)
Commenter la réponse de igloobuster
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Dernière intervention
23 janvier 2016
- 31 oct. 2006 à 19:38
0
Merci
Si t'arrives à faire un mini tableur avec une listView, pourras tu le mettre en source sur ce site ? Cela m'interresse beaucoup.
Merci et bonne continuation...
Commenter la réponse de yann_lo_san

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.