wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

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

Valid XHTML 1.0 Transitional

Valid CSS2

Menu Snippets (navigation):
Pages: 1    Accueil » Snippets » Contrôles
» [wxGrid] : Valider une cellule et déplacer le curseur avec les flèches
Détails du snippet : [wxGrid] : Valider une cellule et déplacer le curseur avec les flèches
Informations sur l'auteur de ce snippet :


Hors ligne
Xaviou (Administrateur)
Lieu: Annecy (74)
Inscrit le : 27-08-2007
Messages: 1390
Snippets: 25
Tutoriels: 6
Introduction / Description :
Bonjour à tous.

Voici une méthode pour permettre à une wxGrid de se comporter comme sous les tableurs classiques (Excel, OpenOffice.org Calc).
En effet, lorsqu'une cellule est en cours d'édition dans une wxGrid, il n'est pas possible de valider les changements par un simple appui sur les touches fléchées, ce qui aurait également pour effet de déplacer le curseur dans le sens souhaité.

Qu'à cela ne tienne, nous allons voir qu'avec un minimum de code (une classe dérivée de wxGrid), c'est tout à fait faisable.

Le principe est d'intercepter la création du contrôle d'édition d'une cellule, et de connecter ce contrôle (qui est un wxTextCtrl) à une méthode analysant chaque touche pressée dans ce contrôle.

Lorsqu'une touche fléchée est pressée, il ne reste plus qu'à indiquer à la wxGrid de déplacer le curseur dans la direction voulue.
Contenu du snippet :
Le header de notre classe "MyGridCtrl" (fichier MyGridCtrl.h)

Code wxWidgets:

#ifndef MYGRIDCTRL_H_INCLUDED
#define MYGRIDCTRL_H_INCLUDED
 
#include <wx/wx.h>
#include <wx/grid.h>
 
class MyGridCtrl : public wxGrid
{
public:
    MyGridCtrl(wxWindow *parent, wxWindowID id);
private:
    // La méthode qui sera appelée à la création du contrôle d'édition
    void OnEditorCreated(wxGridEditorCreatedEvent &event);
    // La méthode à connecter à ce contrôle
    void OnEditorKeyPressed(wxKeyEvent &event);
    DECLARE_EVENT_TABLE();
};
 
#endif // MYGRIDCTRL_H_INCLUDED
 


L'implémentation de notre classe "MyGridCtrl" (fichier MyGridCtrl.cpp)

Code wxWidgets:

#include "MyGridCtrl.h"
 
BEGIN_EVENT_TABLE(MyGridCtrl,wxGrid)
    EVT_GRID_EDITOR_CREATED(MyGridCtrl::OnEditorCreated)
END_EVENT_TABLE()
 
MyGridCtrl::MyGridCtrl(wxWindow *parent, wxWindowID id)
: wxGrid(parent,id)
{
    // Constructeur de la classe MyGridCtrl
}
 
void MyGridCtrl::OnEditorCreated(wxGridEditorCreatedEvent &event)
{
    // On récupère le pointeur vers le contrôle d'édition
    wxTextCtrl *editor=(wxTextCtrl*)event.GetControl();
    // Que l'on connecte avec notre méthode pour vérifier les touches pressées
    editor->Connect(wxEVT_KEY_DOWN,wxKeyEventHandler(MyGridCtrl::OnEditorKeyPressed),NULL,this);
}
 
void MyGridCtrl::OnEditorKeyPressed(wxKeyEvent &event)
{
    // Suivant la touche qui est pressée
    switch(event.GetKeyCode())
    {
        case WXK_RIGHT:
            MoveCursorRight(false);
            break;
        case WXK_LEFT:
            MoveCursorLeft(false);
            break;
        case WXK_UP:
            MoveCursorUp(false);
            break;
        case WXK_DOWN:
            MoveCursorDown(false);
            break;
        default:
            // Sinon, on laisse l'éditeur traiter normalement
            event.Skip();
    }
}
 
Explications finales :
Voilà, c'est tout.

Vous aurez sans doute remarqué la méthode "Connect(.........)", qui sert à connecter dynamiquement un contrôle à la table des événements.

Si vous avez besoin de plus d'informations, n'hésitez pas...

@+
Xav'
Commentaires
Gandi (Gourou de la secte)
Lieu: Clermont-Ferrand
Inscrit le : 10-10-2007
Messages: 222
Snippets: 5
Tutoriels: 0
Site web
Hors ligne
Pourquoi il n'y a pas de disconnect ?
----------
Pour ma question, je répond , il n'y a pas de OnEditorDelete .
sinon je propose cette ligne à la place de la correspondante.   

Code wxWidgets:

 
event.GetControl()-&gt;Connect(wxEVT_KEY_DOWN,wxKeyEventHandler(MyGridCtrl::OnEditorKeyPressed),NULL,this);
 

GetControl renvoi un wxControl qui dérive de wxEvtHandler donc il possède déjà le Connect. Mais si il aurait fallu caster j'aurais plutôt essayé ça

Code wxWidgets:

 wxTextCtrl* aControl = wxDynamicCast( event.GetEventObject(), wxTextCtrl ) ;


Autre petite remarque:
Si vous essayer de récupérer l'event ENTER de cette façon vous n'y arriverez pas ( du moins j'y suis pas arrivé). La grille appel wxEVT_GRID_CELL_CHANGE quand on fait entré dans une cellule.( ce qui est plutôt appréciable que de se retrouver avec un évènement cellchange à chaque ajout de caractère. )

Dernière modification par Gandi (22-01-2008 23:33:07)


"Les ordinateurs ne remplaceront jamais les livres. Vous ne pouvez pas vous mettre sur une pile de disquettes pour atteindre le haut de votre armoire" ( Sam Ewing )
Menu Snippets (navigation):
Pages: 1    Accueil » Snippets » Contrôles
» [wxGrid] : Valider une cellule et déplacer le curseur avec les flèches