Afficher une grille [Résolu]

igloobuster 16 Messages postés jeudi 19 octobre 2006Date d'inscription 24 juillet 2009 Dernière intervention - 19 oct. 2006 à 17:59 - Dernière réponse : yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention
- 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 

23 réponses

Répondre au sujet
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 20 oct. 2006 à 17:54
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de yann_lo_san
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 20 oct. 2006 à 22:04
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de racpp
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 19 oct. 2006 à 20:20
0
Utile
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
igloobuster 16 Messages postés jeudi 19 octobre 2006Date d'inscription 24 juillet 2009 Dernière intervention - 20 oct. 2006 à 13:56
0
Utile
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
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 20 oct. 2006 à 17:59
0
Utile
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
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 20 oct. 2006 à 20:55
0
Utile
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
igloobuster 16 Messages postés jeudi 19 octobre 2006Date d'inscription 24 juillet 2009 Dernière intervention - 20 oct. 2006 à 21:19
0
Utile
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
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 20 oct. 2006 à 23:04
0
Utile
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
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 21 oct. 2006 à 00:15
0
Utile
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
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 21 oct. 2006 à 15:29
0
Utile
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
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 21 oct. 2006 à 23:08
0
Utile
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
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 22 oct. 2006 à 03:51
0
Utile
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
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 22 oct. 2006 à 18:37
0
Utile
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
racpp 1910 Messages postés vendredi 18 juin 2004Date d'inscription 14 novembre 2014 Dernière intervention - 23 oct. 2006 à 05:09
0
Utile
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
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 23 oct. 2006 à 13:28
0
Utile
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
igloobuster 16 Messages postés jeudi 19 octobre 2006Date d'inscription 24 juillet 2009 Dernière intervention - 24 oct. 2006 à 16:59
0
Utile
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
igloobuster 16 Messages postés jeudi 19 octobre 2006Date d'inscription 24 juillet 2009 Dernière intervention - 25 oct. 2006 à 10:39
0
Utile
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
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 25 oct. 2006 à 22:24
0
Utile
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
igloobuster 16 Messages postés jeudi 19 octobre 2006Date d'inscription 24 juillet 2009 Dernière intervention - 31 oct. 2006 à 16:24
0
Utile
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
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 31 oct. 2006 à 19:38
0
Utile
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.

afficher une grille - page 2