Membres inscrits :313
Membres en ligne : 0
Invités en ligne : 2


|
| Conversation : Excel : quelle logique ? |
mick009 (Membre de la secte)
Inscrit le : 03-04-2008
Messages: 122
Snippets: 3
Tutoriels: 0
Hors ligne |
Bonjour à tous et à toutes, Mes questions sont relatives au logiciel Excel. Je commence donc par celle-ci :
- J'ai un programme (qui contient wxGrid) et j'ai une fonction qui permet de mettre en gras toutes les cases (sans en oublier une) en gras, en italique, en souligner, ou en barré. Cependant, je n'ai pas pu m'empêcher de remarquer que si je sélectionnais TOUTES les cases et que j'utilisais la fonction, cela durait un laps de temps assez considerable (et que pour 1000 carreaux sur 60) en opposition avec Excel qui en contient bien plus que j'ai et qui seulement que quelques secondes à s'accomplir ! Alors comment procède ce logiciel pour mettre en gras toutes les cases sélectionnées sans que celui-ci se fige et s'éxècute "à la vitesse de la lumière" pour toutes les cases sélectionnées ?
Moi, ma méthode c'est de sélectionner toutes les cases et d'appliquer une par une la caractéristique adéquate.
- Avez-vous une petite idée de comment pourrais-je faire le système des adresses relatifs et absolues ? Comme dans Excel ? (c'est-à-dire que la valeur d'une case va en dépendre d'une autre)
Je pense que j'avais d'autres questions mais on va dire qu'il est tard et que j'ai des "fuites de mémoire" ^^ Merci d'avance pour chaque réponse qui me sera donnée
| |
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 969
Snippets: 23
Tutoriels: 6
Site web
Hors ligne |
mick009 a écrit:Moi, ma méthode c'est de sélectionner toutes les cases et d'appliquer une par une la caractéristique adéquate. C'est à dire : tu sélectionnes réellement chaque case ? Voilà pourquoi ça prend du temps. Essayes de faire la même chose sous excel en VBA, et tu verras le temps que ça va prendre. Par contre, tu dois pouvoir modifier le style d'une "cellule" sans forcément la sélectionner.
mick009 a écrit:Avez-vous une petite idée de comment pourrais-je faire le système des adresses relatifs et absolues ? Comme dans Excel ? (c'est-à-dire que la valeur d'une case va en dépendre d'une autre) Il te faut créer une classe perso que tu associes à chaque cellule quand elle n'est pas vide. Cette classe pourra tenir une liste des cellules dépendantes d'elle. Quand, dans une cellule, tu ajoutes une formule qui contient un référence vers une autre cellule, tu l'ajoutes à la liste. Quand tu modifies le contenu de la cellule, tu dis à toutes celles qui en dépendent de se mettre à jour.
Enfin, c'est une piste : je ne sais pas si je me suis bien fait comprendre 
Bonne chance en tout cas. @+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà...
|
mick009 (Membre de la secte)
Inscrit le : 03-04-2008
Messages: 122
Snippets: 3
Tutoriels: 0
Hors ligne |
En VBA c'est quoi ? Comment faudrait-il que je fasse ? (je ne parle pas du code mais plutôt de comment réagir, la logique de ce que je dois faire).
Ensuite, je n'ai pas totalement compris le coup de la "liste" ! Tu veux dire une liste comme un wxArrayInt ou Coords ?
| |
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 969
Snippets: 23
Tutoriels: 6
Site web
Hors ligne |
VBA : Visual Basic pour Applications. C'est juste pour que tu puisse faire l'essai directement et que tu voies que modifier cellule par cellule n'est pas la même chose que modifier toutes les cellules d'un coup.
Pour l'histoire de la liste : oui, comme un wxArrayInt ou autre. En fait, un wxArrayInt pourrait même faire l'affaire si tu n'as pas trop de cellules à gérer : la première partie du nombre correspond à la colonne, et l'autre à la ligne. Donc, quand le contenu d'une cellule change, on regarde dans cette liste et on appelle une mathode "Update" pour toutes les cellules auxquelles ça fait référence.
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà...
|
mick009 (Membre de la secte)
Inscrit le : 03-04-2008
Messages: 122
Snippets: 3
Tutoriels: 0
Hors ligne |
Euh, je ne vois pas l'option VBA sur Excel !!!! Comment c'est ? Et qu'est-ce qu'il faudrait que je fasse finalement ?
De plus Excel, lui permet d'avoir un cellule en gras ou autres, mais aussi une certaine partie du texte de la case...
Comment est-ce qu'ils ont fait ?
| |
|
xxltux (Membre)
Lieu: Montpellier
Inscrit le : 07-10-2007
Messages: 546
Snippets: 0
Tutoriels: 0
Site web
Hors ligne |
VBA est un langage de scripts pour faire mumuse avec les celules en gros
|
Itérer est humain, récurser est divin
|
mick009 (Membre de la secte)
Inscrit le : 03-04-2008
Messages: 122
Snippets: 3
Tutoriels: 0
Hors ligne |
Ahh d'accord ! Mais personne n'a une idée de comment fait Excel pour gérer les formats des cellules sans prendre énormément de temps ?
| |
|
xxltux (Membre)
Lieu: Montpellier
Inscrit le : 07-10-2007
Messages: 546
Snippets: 0
Tutoriels: 0
Site web
Hors ligne |
Non, mais tu peux tj chercher sur le code de openoffice lol
|
Itérer est humain, récurser est divin
|
mick009 (Membre de la secte)
Inscrit le : 03-04-2008
Messages: 122
Snippets: 3
Tutoriels: 0
Hors ligne |
C'est un projet open Source ?
| |
|
xxltux (Membre)
Lieu: Montpellier
Inscrit le : 07-10-2007
Messages: 546
Snippets: 0
Tutoriels: 0
Site web
Hors ligne |
Oui : fr.openoffice.org
|
Itérer est humain, récurser est divin
|
mick009 (Membre de la secte)
Inscrit le : 03-04-2008
Messages: 122
Snippets: 3
Tutoriels: 0
Hors ligne |
Il y a énormement de fichier !! Je en sais même pas où est la fonction main() !!!
| |
|
xxltux (Membre)
Lieu: Montpellier
Inscrit le : 07-10-2007
Messages: 546
Snippets: 0
Tutoriels: 0
Site web
Hors ligne |
Oui, c'est pas un Hello world lol
|
Itérer est humain, récurser est divin
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 969
Snippets: 23
Tutoriels: 6
Site web
Hors ligne |
Bon, par exemple, pour mettre toutes les cellules sélectionnées en gras. On utilise la fonction de ton snippet afin d'obtenir un wxGridCellCoordsArray que je vais appeler selectedCells.
Il suffit de fair une boucle sur cet array, et pour chaque entrée, on récupère la police actuelle, on met sur "gras" et on applique la police :
Code wxWidgets: int iCol,iRow; wxFont fnt; for (int i=0;i<selectedCells.GetCount();i++) { iCol=selectedCells[i].GetCol(); iRow=selectedCells[i].GetRow(); fnt=m_Grid->GetCellFont(iRow,iCol); fnt.SetWeight(wxFONTWEIGHT_BOLD); m_Grid->SetCellFont(iRow,iCol,fnt); }
Après, si tu veux quelque chose de plus évolué, il va falloir que tu crées ta propre classe dérivée de wxGridTableBase, pour pouvoir gérer le contenu de chaque cellule comme avec un RichTextCtrl.
@+ Xav'
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà...
|
mick009 (Membre de la secte)
Inscrit le : 03-04-2008
Messages: 122
Snippets: 3
Tutoriels: 0
Hors ligne |
Oui voilà, c'est exactement ce que j'ai fait ! L'ennui si je prends toute les cellules (sélectionner tout) ou si j'en prends une par une (mais beaucoup) et que je mets en gras, et ben le programme se fige : il va très vite pour faire le code (je le vois avec les cout qui défilent à la vitesse de la lumière) mais ce ne va pas assez vite pour éviter que mon programme se fige !
| |
|
xxltux (Membre)
Lieu: Montpellier
Inscrit le : 07-10-2007
Messages: 546
Snippets: 0
Tutoriels: 0
Site web
Hors ligne |
Par contre generalement les cout ralentissent bcp le code, surtout quand c'est dans une boucle
|
Itérer est humain, récurser est divin
|
mick009 (Membre de la secte)
Inscrit le : 03-04-2008
Messages: 122
Snippets: 3
Tutoriels: 0
Hors ligne |
Oui mais même si ce je ne le mets pas, cela se fige quand même. Excel, lui ça le fait en éclair... De plus dans la boucle, je veux tester, si la case n'est pas déjà en gras. Si elle l'est, alors je lui enlève, sinon je le lui mets. ---------- J'ai peut-être une idée : et si je captais le changement d'une cellule et que la fonction marque dans un wxGridCellCoordsArray (un attribut par exemple) tous les coordonnées. Par contre, il faudrait une fonction pour éviter que le programme se bloque, comme gtk_main_iteration (); en GTK+ ) Ensuite quand l'utilisateur met en gras, le programme n'aura pas besoin de calculer toutes les cellules sélectionnées puisque ce sera déjà fait.
Dernière modification par mick009 (15-04-2008 14:58:18)
| |
|
gbdivers (Membre)
Inscrit le : 05-03-2008
Messages: 91
Snippets: 2
Tutoriels: 0
Hors ligne |
Bonjour à tous
2 remarques concernant ton problème :
- si ton programme se fige, utilise les threads : dans ta gestion d'event pour mettre en gras, tu lances un thread qui modifie toutes les cellules puis tu selectionnes les cellules visibles à l'écran (normalement moins d'une centaine), tu modifies chacune de ces cellules puis tu réaffiche ta fenêtre ; le programme sera disponnible pendant que le thread travail. Remarque : faire attention que le thread ait fini avant de lancer une autre manip, sinon risque de conflit
- pour ce genre de fonction, le plus simple est de travailler avec des styles hérités (comme font word et excel je pense) : explication : tu définis un style de base (par exemple "base = arial 12px"), des sytles optionnels hérités pour les lignes et les colonnes (par exemple "ligne xx = gras", "colonne yy = italique") et des sytles optionnels hérités pour les cellules (par exemple "cellule xx:yy = couleur rouge") Pour modifier le style de toutes les cellules (ou d'une colonne ou d'une ligne...), tu modifies simplement le style de base (ou le style de la colonne ou le style de la ligne...) Pour afficher ton tableau, ta recalcules les styles de chaque cellule affichée (pas nombreuses donc rapide) en fonction du style de base, des styles de la colonne et de la ligne et du style de la cellule (style cellule xx:yy = style de base + style colonne yy + style ligne xx + style cellule xx:yy) Petite remarque : wxGrid n'est (peut être) pas adapté pour faire un tableur mais juste pour gérer l'affichage de quelques cellules. Pistes : Utiliser une type de données abstraite pour les cellules en mémoire et wxGrid que pour les cellules visibles ou utiliser une extension plus puissante (par exemple : wxSheet http://wxcode.sourceforge.net/showcomp.php?name=wxSheet)
Dernière modification par gbdivers (15-04-2008 19:57:31)
| |
|
mick009 (Membre de la secte)
Inscrit le : 03-04-2008
Messages: 122
Snippets: 3
Tutoriels: 0
Hors ligne |
Je veux bien utiliser wxSheet, il m'a l'air pas mal !! Cependant, est-ce que tu sais comment l'installer ? (je préfère le faire en *.lib et d'inclure les headers, mais je en sais pas comment faire !) De plus, est-ce que tu n'aurais pas un lien avec les méthodes que je peux utiliser ?
Merci d'avance !
| |
|
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 969
Snippets: 23
Tutoriels: 6
Site web
Hors ligne |
mick009 a écrit:Oui mais même si ce je ne le mets pas, cela se fige quand même. Effectivement, j'ai fait un essai avec une grille de 150x100 (soit, 15000 cellules), et ça rame sévère pour tout passer en gras. mick009 a écrit:Excel, lui ça le fait en éclair... Re-effectivement, pour le même nombre de cellules, sous Excel et OpenOffice.org, c'est instantané. mick009 a écrit:De plus dans la boucle, je veux tester, si la case n'est pas déjà en gras. Si elle l'est, alors je lui enlève, sinon je le lui mets. Ça, par contre, c'est une fonctionnalité non présente dans les tableurs classiques.
mick009 a écrit:J'ai peut-être une idée : et si je captais le changement d'une cellule et que la fonction marque dans un wxGridCellCoordsArray (un attribut par exemple) tous les coordonnées. Par contre, il faudrait une fonction pour éviter que le programme se bloque, comme gtk_main_iteration (); en GTK+ ) Ça ne changera rien. Ce n'est pas la fonction qui "liste" les cellules sélectionnées qui rame : même avec 15000 cellules, elle est quasi-instantanée. Le problème vient de la modification du style des cellules (donc, la boucle que je t'ai filé un peu plus haut). Plus précisément, à mon avis, c'est le fait de récupérer la wxFont, de la modifier, et de la ré-appliquer à chaque cellule qui fait que ça rame comme ça. Il faudrait pouvoir accéder directement à la wxFont de chaque cellule grâce à un pointeur, mais je n'ai rien trouvé qui permette de le faire sans passer par un mode de gestion des cellules plus avancé.
|
Le nouveau portail wxWidgets francophone : www.wxdev.fr Ben en fait, vous y êtes déjà...
|
mick009 (Membre de la secte)
Inscrit le : 03-04-2008
Messages: 122
Snippets: 3
Tutoriels: 0
Hors ligne |
Hmmmm et en ce qui concerne le wxSheet, qu'est-ce que j'aurais en plus que du wxGrid ? Je pourrais faire les cellules en gras et tout ça ?
Merci d'avance pour vos réponses !
| |
|
xxltux (Membre)
Lieu: Montpellier
Inscrit le : 07-10-2007
Messages: 546
Snippets: 0
Tutoriels: 0
Site web
Hors ligne |
Faut a mon avis que les données (le style et tout) et l'affichage soit separé : Si il met a jour l'affichage de cellules que tu affiches pas en ce moment ca sers pas a grand chose
|
Itérer est humain, récurser est divin
|
mick009 (Membre de la secte)
Inscrit le : 03-04-2008
Messages: 122
Snippets: 3
Tutoriels: 0
Hors ligne |
Oui c'est ce qu'à proposer gbdivers, mais cela peut entraîner des problèmes si la boucle n'a pas terminé et qu'on en recommence une autre (si on fait en sorte que le programme ne se fige pas avec les wxThreads)
| |
|
xxltux (Membre)
Lieu: Montpellier
Inscrit le : 07-10-2007
Messages: 546
Snippets: 0
Tutoriels: 0
Site web
Hors ligne |
Tu peux tj voir si c'est plus rapide avec wxSheet
|
Itérer est humain, récurser est divin
|
mick009 (Membre de la secte)
Inscrit le : 03-04-2008
Messages: 122
Snippets: 3
Tutoriels: 0
Hors ligne |
Oui mais justement, j'aimerais savoir qu'est-ce qu'il faut faire pour l'installer (avec un *.lib et inclure les headers), l'ennui je ne m'y connait pas assez pour savoir comment compiler une *.lib ... Et ensuite je ne sais même pas s'il y a une méthode puisque je ne vois nul part de documentation (excepté dans un fichier TXT que j'essayerais de lire demain)
| |
|
gbdivers (Membre)
Inscrit le : 05-03-2008
Messages: 91
Snippets: 2
Tutoriels: 0
Hors ligne |
le plus simple est d'inclure les .cpp et les .h directement dans ton projet (ca augmente légèrement le temps de compilation) Sinon pour créer des lib, tu crées un nouveau projet avec code blocks (en espérant que tu utilises cet IDE) de type "Dynamic link library" (crée un .dll), "Shared library" (crée un .lib) ou "Static library" (crée un .a)
EDIT:
Pour utiliser wxSheet avec wx 2.8.7, j'ai modifié quelques points :
* copier le contenu du répertoire "wxSheet/wx/sheet" dans "WXDIR/include/wx/sheet/"
* dans "sheetedt.cpp", après la ligne 33, ajouter : #include "wx/combobox.h"
* dans "sheetspt.cpp", remplacer la ligne 50 : WX_DELEGATE_TO_CONTROL_CONTAINER(wxSheetSplitter); par : WX_DELEGATE_TO_CONTROL_CONTAINER(wxSheetSplitter, wxWindow);
Pour tester wxSheet, crée un nouveau projet wx, include les 3 fichiers "sheetdemo.*" du répertoire "samples/sheet" et les fichiers .cpp du répertoire "src". Ca compile sans problème
Dernière modification par gbdivers (16-04-2008 10:44:20)
| |
|
|