Création d'un tableau modulable dans une boite de dialogue

Signaler
Messages postés
55
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
11 décembre 2008
-
Messages postés
55
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
11 décembre 2008
-
Je souhaite ouvrir une boite de dialogue dans laquelle il y aurait un tableau d'une vingtaine de colonne. Le problème c que le nombre de ligne (et donc le nombre de variable associé au tableau) dépendra du nombre d'enregistrement fait dans un fichier texte (sachant qu'un enregistrement prend une ligne dans le fichier texte). Il faudrait donc qu'après avoir fait un tri dans ses données je puisse afficher dans le tableau les enregistrements que j'aurais selectionné et (accessoirement pouvoir récupérer les données de l'une des lignes du tableau lorsque cela s'avèrerait utile).

20 réponses

Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Quel sera l'objet graphique qui contiendra les lignes de ton tableau, une list view ?

Kaid - kaid.fr.st
Messages postés
55
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
11 décembre 2008

Je ne me suis pas encore atteler à cette tache donc je suis encore libre de choisir l'objet graphique mais si tu as une solution avec une list view alors ce sera mon objet...
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Regardes les sources déposées sur le site, la dernière traite des listviews.

Kaid - kaid.fr.st
Messages postés
55
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
11 décembre 2008

effectivement ca correspond tout à fait à ce que je recherchais mais g un pb d'init. je définis:
static HPWND hwnd;

mais la manière dont on pointe la list view dans le source (cad hwnd=GetDlgItem(hDlg, IDC_LISTVIEW) avec hDlg de type HWND) ne passe pas à la compilation. g donc essayé de passer par un pointeur comme je le ferai pour une combo ou uns list box mais rien à faire. La seule chose qui passe à la compilation c:
hwndListView=(HWND)GetDlgItem(IDC_LIST);
et c donc sans grande surprise que je me retrouve avec un list view vide à l'execution.
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Mais qu'est ce que 'HPWND' ?

Kaid - kaid.fr.st
Messages postés
55
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
11 décembre 2008

Le type associé à une fenetre windows (ou alors g rien compris)...
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

HWND alors pas HPWND.
Tu as copié tout le code comme dans la source ? InitCommonControls(), création des colonnes, ajout de lignes, ... .

Kaid - kaid.fr.st
Messages postés
55
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
11 décembre 2008

non pas exactement, d'abord parceque ma boite de dialogue est deja ouverte quand je la rempli et ensuite parceque j'avais des erreurs de compilation avec ce qui avais été fait (remarque si c du .net c peu etre normal!!)
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

C'est pas du tout du .NET, simplement du pur Win32. Tu as bien mis les headers ainsi que la librairie pour le link ?
Bizarre ton problème, tu vois au moins les colonnes dans ta listview ?

Kaid - kaid.fr.st
Messages postés
55
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
11 décembre 2008

tu vois ce que c blanc? ben encore plus... et oui g bien mis les bibliothèque (g vérifié au moins 10 fois) et puis si ct un pb comme ca je pourrais pas executer...
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Tu peux copier-coller ici le code de gestion de ta boite de dialogue ? Enfin la function de gestion des messages.

Kaid - kaid.fr.st
Messages postés
55
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
11 décembre 2008

voila le code sachant que cette boite de dilaogue est ouverte à partir d'une autre et que le programme ressemble plus à une base de données qu'à autre chose.

// carte_sorties.cpp : implementation file
//

#include "stdafx.h"
#include "recap_test_carte.h"
#include "carte_sorties.h"
#include "recap_test_carteDlg.h"
#include "chemin.h"

CFile f_sortie;
CFile f_sortie2;
CFileException e_sortie;
CString essai_sortie;
CString essai_sortie2;
char buflect_sortie[TAILLE];
static CString Jour;
static CString Mois;
static CString An;
static CString OF;
static CString Ref;
static CString Sigle;
static CString ID;
static int empl=0;//variable qui donne l'emplacement d'un champs dans l'enregistrement
static HWND hwndListView;

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// carte_sorties dialog

carte_sorties::carte_sorties(CWnd* pParent /*=NULL*/)
: CDialog(carte_sorties::IDD, pParent)
{
//{{AFX_DATA_INIT(carte_sorties)
//}}AFX_DATA_INIT
}

void carte_sorties::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(carte_sorties)
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(carte_sorties, CDialog)
//{{AFX_MSG_MAP(carte_sorties)
ON_LBN_SELCHANGE(IDC_carte_sortie, OnSelchangecartesortie)
ON_BN_CLICKED(IDC_Suppr, OnSuppr)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// carte_sorties message handlers

BOOL carte_sorties::OnInitDialog()
{
CDialog::OnInitDialog();
carte_sorties::Init_list();

return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}

void carte_sorties::Init_list()
{
CString Sortie;
CString Sortie2;
int j=0;
int n=carte_sorties::Nbr_enr(chemin_OF);
//CListBox* m_carte_sortie= (CListBox*) GetDlgItem(IDC_carte_sortie);

/*//Effacer les valeurs déjà inscrite dans la listbox
m_carte_sortie->ResetContent();
ASSERT(m_carte_sortie->GetCount() == 0);*/
UpdateData(false);
MessageBox("");
for(int i=0;i<n;i++)
{
essai_sortie=carte_sorties::Extrait(i, chemin_OF, 26);//extraction du champs réparation

//ajouter les valeurs dans la listbox
if ((atoi(essai_sortie))==1)
{
Sortie="";
Sortie2="";

//Date
Sortie+=carte_sorties::Extrait(i, chemin_OF, 6);
Sortie+="/";

Sortie+=carte_sorties::Extrait(i, chemin_OF, 5);
Sortie+="/";

Sortie+=carte_sorties::Extrait(i, chemin_OF, 7);

hwndListView = (HWND)GetDlgItem(IDC_LIST_Rep);//Selon moi la ligne qui est fausse (pb d'initialisation)
strcpy(buflect_sortie,Sortie);
carte_sorties::InitListView(hwndListView,buflect_sortie);

//Les parties avec Sigle, Sigle,Num_OF et Indice sont aussi à inserer dans la list box
/*
for(j=strlen(Sortie); j<TAILLE;j++)
{
Sortie+=" ";
}
Sortie2+=Sortie;
Sortie="";

//Sigle
Sortie=carte_sorties::Extrait(i, chemin_OF, 1);
for(j=strlen(Sortie); j<TAILLE;j++)
{
Sortie+=" ";
}
Sortie2+=Sortie;
Sortie="";

//Sigle
Sortie+=carte_sorties::Extrait(i, chemin_OF, 2);
for(j=strlen(Sortie); j<TAILLE;j++)
{
Sortie+=" ";
}
Sortie2+=Sortie;
Sortie="";

//Num_OF
Sortie+=carte_sorties::Extrait(i, chemin_OF, 0);
for(j=strlen(Sortie); j<TAILLE;j++)
{
Sortie+=" ";
}
Sortie2+=Sortie;
Sortie="";

//Indice
Sortie+=carte_sorties::Extrait(i, chemin_OF, 3);
for(j=strlen(Sortie); j<TAILLE;j++)
{
Sortie+=" ";
}
Sortie2+=Sortie;
Sortie="";

//ID
Sortie+=carte_sorties::Extrait(i, chemin_OF, 4);
for(j=strlen(Sortie); j<TAILLE;j++)
{
Sortie+=" ";
}
Sortie2+=Sortie;
Sortie="";

Sortie2.Format(_T(Sortie2), i);
m_carte_sortie->AddString( Sortie2);
UpdateData(false);*/
}
}
}

void carte_sorties::OnSelchangecartesortie()
{
UpdateData(true);

OF="";
char Sortie_val[6*TAILLE];
strcpy( Sortie_val,m_carte_sortie);

int i=0;

for(i=(3*TAILLE); i<(6*TAILLE);i++)
{
if(strcmp((CString)Sortie_val[i]," ") && i<(4*TAILLE))
{
OF+=Sortie_val[i];
}
else
{
if(strcmp((CString)Sortie_val[i]," ") && i>=(5*TAILLE))
{
ID+=Sortie_val[i];
}
}
}
}

void carte_sorties::OnSuppr()
{
int n=carte_sorties::Nbr_enr(chemin_OF);

for(int i=0; i<n;i++)
{
essai_sortie2= carte_sorties::Extrait(i,chemin_OF, 4);//extraction du champs ID
essai_sortie= carte_sorties::Extrait(i,chemin_OF, 0);//extraction du champs num_OF

if(!strcmp(essai_sortie, OF) && !strcmp(essai_sortie2,ID))
{
carte_sorties::Extrait(i,chemin_OF, 26);//extraction du champs repar pour connaitre son emplacement dans le fichier
if( !f_sortie.Open( chemin_OF,CFile::modeWrite , &e_sortie ) )
{
#ifdef _DEBUG
afxDump << "Fichier introuvable" << e_sortie.m_cause << "\n";
MessageBox("Erreur de lecture");
#endif
}
else
{
f_sortie.Seek(empl, CFile::begin);
f_sortie.Write("0",1);
f_sortie.Close();

i=n;
}
carte_sorties::Init_list();
}
}
}

int carte_sorties::Nbr_enr(char* chemin)
{
int nbr=0;
int i=0;
if( !f_sortie.Open( chemin,CFile::modeRead , &e_sortie ) )
{
#ifdef _DEBUG
afxDump << "Fichier introuvable" << e_sortie.m_cause << "\n";
MessageBox("Erreur de lecture");
#endif
}
else
{
int fin=f_sortie.SeekToEnd();

for(i; i<fin;i++)
{
f_sortie.Seek(i, CFile::begin);
f_sortie.Read(buflect_sortie, 1);
essai_sortie=buflect_sortie[0];

if(!strcmp(essai_sortie, "\n"))
{
nbr++;
}

}

f_sortie.Close();
}

return nbr;
}

CString carte_sorties::Extrait(int i,char* chemin, int champ)
{
int nbr=0;
int nbr2=0;
int esp=0;

if( !f_sortie2.Open( chemin,CFile::modeRead, &e_sortie ) )
{
#ifdef _DEBUG
afxDump << "Fichier introuvable" << e_sortie.m_cause << "\n";
MessageBox("Erreur de lecture");

#endif
}
else
{
int fin=f_sortie2.SeekToEnd();//Calcul de la taille du fichier

for(int j=0; j<fin;j++)
{
char buflect_sortie[TAILLE];

f_sortie2.Seek(j, CFile::begin);
f_sortie2.Read(buflect_sortie, 1);
essai_sortie=buflect_sortie[0];

if(!strcmp(essai_sortie,"\n"))//Si on trouve le caractère de séparation d'enregistrement
{

nbr++;
esp=j+1;
}
else
{
if(nbr==i)
{
if(!strcmp(essai_sortie,";"))//Si on trouve le caractère de séparation d'enregistrement
{
nbr2++;
if(nbr2==champ)
{
esp=j+1;//garder l'emplacement du début du champs à extraire
}
else
{
if(nbr2==(champ+1))
{
essai_sortie="";
empl=f_sortie2.Seek(esp, CFile::begin);//se caler sur le début du champs à extraire
esp=j-esp;//Calcule de la longueur du champs
f_sortie2.Read(buflect_sortie,esp);
for (int buf=0;buf<esp;buf++)
{
essai_sortie+=buflect_sortie[buf];
}
j=fin;
}
}
}

}
}
}
f_sortie2.Close();
}
return essai_sortie;
}

// ajoute un item a un ListView
void carte_sorties::InitListView(HWND hwnd,char *text)
{
LV_ITEM lvi;

// initialisation des champs de la structure
lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE;
lvi.state = 0;
lvi.stateMask = 0;
lvi.cchTextMax = strlen(text);
lvi.pszText = text;
lvi.iImage = 0;
lvi.iItem = 0;
lvi.iSubItem = 0;

ListView_InsertItem(hwnd,&lvi);
}
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

La ligne suivante est fausse, c'est évident
hwndListView = (HWND)GetDlgItem(IDC_LIST_Rep):

Tu utilises une méthode de la classe CDialog alors que tu n'est pas dans une classe dérivée de CDialog. De plus, elle renvoit un pointeur vers un objet CWnd et non un HWND (MFC obligent).

En général, on n'essaye de séparer un programme comme suit:
- Les classes qui gérent l'applicatif,
- Les classes qui s'occupent de l'affichage.

Tous les traitements qui ne sont pas graphiques devraient être fait dans les classes applicatives, ces dernières ne se préoccupant pas du tout de l'affichage, ne savent même pas si c'est un programme graphique MFC, Win32 ou en mode console. Evidémment si tu dois recommencer ton projet au début, tu ne voudras certainement pas mettre en place cette solution.

Kaid - kaid.fr.st
Messages postés
55
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
11 décembre 2008

Techniquement je suis bien dans une classe dérivée de Cdialogue, le code que j'ai envoyé correspond au méthode d'une classe directement dérivée de Cdialogue (puisque la base de cette classe est une boite de dialogue). C d'ailleurs pour ca que je gère l'affichage dans le code mais je retiens tes conseils si je vois que g le temps je mettrais les fonstion de tri (qui sont souvent les meme dans les différant s fichier .cpp) dans un fichier commun. Et koi qu'il en soit je te remercie de m'avoir accorder du temps meme si en definitive ca ne regle pas mon pb.
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Mais est-ce que tu as testé ca:

hwndListView = GetDlgItem(IDC_LIST_Rep)->GetSafeHwnd();


Kaid - kaid.fr.st
Messages postés
55
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
11 décembre 2008

maintenant c fait...snif
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Euh mais si ta liste en en mode report, tu dois y insérer des colonnes et je ne le vois pas dans ton code.

Kaid - kaid.fr.st
Messages postés
55
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
11 décembre 2008

c vrai mais pour l'intant j'essayais juste avec une colonne c pour ca que je mùe suis pas encore soucié d'en ajouter d'autres.
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Tu es obligé d'ajouter une colonne même si tu ne veux en utiliser qu'une seule.

Kaid - kaid.fr.st
Messages postés
55
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
11 décembre 2008

g touvé la solution (meme si ca ressemble plus à du bricolage qu'à de la programation):
void carte_sorties::Init_list()
{

//HWND hDlg;

CString Sortie;
int j=0;
int nbr=0;
int n=carte_sorties::Nbr_enr(chemin_OF);
CString tab_Sortie[7];

CListCtrl* pClistCtrl= (CListCtrl*) GetDlgItem(IDC_LIST);

for(int i=0;i<n;i++)
{
essai_sortie=carte_sorties::Extrait(i, chemin_OF, 26);//extraction du champs réparation

//ajouter les valeurs dans la list view
if ((atoi(essai_sortie))==1)
{

tab_Sortie[0]="";

//Date
tab_Sortie[0]+=carte_sorties::Extrait(i, chemin_OF, 6);
tab_Sortie[0]+="/";

tab_Sortie[0]+=carte_sorties::Extrait(i, chemin_OF, 5);
tab_Sortie[0]+="/";

tab_Sortie[0]+=carte_sorties::Extrait(i, chemin_OF, 7);

//Sigle
tab_Sortie[1]="";
tab_Sortie[1]=carte_sorties::Extrait(i, chemin_OF, 1);

//Ref
tab_Sortie[2]="";
tab_Sortie[2]+=carte_sorties::Extrait(i, chemin_OF, 2);

//Num_OF
tab_Sortie[3]="";
tab_Sortie[3]+=carte_sorties::Extrait(i, chemin_OF, 0);

//Indice
tab_Sortie[4]="";
tab_Sortie[4]+=carte_sorties::Extrait(i, chemin_OF, 3);

//ID
tab_Sortie[5]="";
tab_Sortie[5]+=carte_sorties::Extrait(i, chemin_OF, 4);

/////////////////////////////////////

int nColumnCount = 7;

nbr=0;
for (int j=0;j <nColumnCount;j++)
{

// Insert the item, select every other item.
pClistCtrl->InsertItem( LVIF_TEXT|LVIF_STATE, nbr,
tab_Sortie[j], 6, LVIS_SELECTED,
0, 0);

// Initialize the text of the subitems.

tab_Sortie[j].Format(TEXT(tab_Sortie[j]), nbr, j);
pClistCtrl->SetItemText(nbr, j, tab_Sortie[j]);
nbr++;
}
}
}
}