IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

[BCB6]Complémenté automatiquement une saisie [Débutant(e)]


Sujet :

C++Builder

  1. #21
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Oki,

    Deux points:
    . je suis passé a côté de cela puisque cet "impératif" (le TMemo) ne me semble noté nulle part dans le sujet.
    . ces deux objets, TRichEdit et TMemo, semblent dériver tous deux de TCustomMemo. Qu'est ce qui fait que l'un fonctionne pour ce besoin de sauvegarde, et l'autre non ?
    Je n'ai pas vu les autres sujets dont tu parles, je vais essayer de trouver (dés que j'ai le temps nécessaire), sont-ce des posts à toi ?

    ++
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  2. #22
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bonjour,

    Peut être un début de réponse ?
    :

    .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private:
            TPoint CurPoint;
    	int idx_colMemo;
    .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    void __fastcall Tfrm_cm::ZeMemoKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
    	switch(Key)
    	{
    	case 54:
    		if (GetAsyncKeyState(VK_SHIFT) || GetAsyncKeyState(VK_CAPITAL) || ((GetKeyState(VK_CAPITAL) & 1) == 1))
    		{
    		GetCaretPos(&CurPoint);
    			idx_colMemo =  LOWORD(SendMessage(ZeMemo->Handle, EM_CHARFROMPOS, 0, MAKELPARAM(CurPoint.x, CurPoint.y)));
    			frm_cm->PopCompletion->Popup((ClientToScreen(CurPoint).x + ZeMemo->Left + 4), (ClientToScreen(CurPoint).y + ZeMemo->Top + 3));
    		}
    	break;
    	}
    }
     
     
    void __fastcall Tfrm_cm::ItemsPopClick(TObject *Sender)
    {
    String S = ZeMemo->Text;
    	S.Insert(((TMenuItem*)Sender)->Caption, idx_colMemo + 1);
    	ZeMemo->Text = S;
    ZeMemo->SelStart = ZeMemo->Text.Length();
    }
    C'est loin d'être parfait, j'en suis conscient, je n'arrive pas a me débarrasser du '&' (qui est inséré quoi qu'il advienne pour le moment) et le fait de travailler/modifier tout le texte du memo (au lieu de celui d'un ligne uniquement) est pas très beau, mais la gestion de la position dans les lignes du memo est "étrange" dans cet objet.
    Ou je n'ai peut être pas compris, tout simplement ...

    ++
    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  3. #23
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 149
    Points : 77
    Points
    77
    Par défaut
    Mes conaissances sont bien limité pour te répondre par l'afirmative, helas.
    Je pensait au départ que c'etais plus simple et je me rend compte que non!
    A la limite, je vais faire une boite de dialogue ou on sélectionne le caractère et ca encodera directement la ou est placé le curseur.
    Ca me semble le dernier rempart possible pour simplifier le tout.
    Cependant j'aimerais vraiment comprendre le code qui permet de faire une saisie quasi automatique dans un TMemo
    Cordialement.

  4. #24
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Pour commencer je développerais une classe pour mémoriser des expressions.
    Donc un objet sachant organiser ces expressions par ordre alphabétique (Liste de listes) mais aussi les représenter et réagir sur la sélection d'un des items.
    Je ne pense pas forcément à un TPopupMenu... mais plutôt à un objet style ListBox ou bien encore fait main (en dérivant de TCustomControl pour y rajouter des petites fleurs).
    Ceci pour augmenter la fluidité du traitement lorsque l'on demande au programme de faire des propositions de complétion.
    Et pourquoi pas dériver de TMemo... en le dotant de tout ce qu'il faut !

    En ce qui concerne maintenant l'utilisation de la touche [&], soit il s'agit du caractère (suivi d'un espace) soit il s'agit de lancer les propositions (suivi d'un caractère).
    On est donc conscient que moins il y a de caractères et plus il y aura de propositions de complétion.
    Celà suppose donc que l'utilisateur ait toujours la main pour continuer la saisie... puisque plus il saisit de caractères et plus le nombre de propositions diminue pour devenir nul...
    Sans doute qu'à ce moment là, il s'agit d'une nouvelle proposition de complétion à rajouter peut-être aux autres pour la suite... ???

    Je pense qu'on a intérêt à suivre le Caret du TMemo (CaretPos)... également pour ne rien laisser derrière soi !
    On peut malgré tout envisager d’effectuer une vérification avant la sauvegarde du fichier... donc interpeller l'utilisateur à chaque fois qu’une expression incongrue sera détectée !

    Je pense que tout ceci représente quand même une bonne dose de travail !

    A moins que tout ceci ne serve qu’à proposer des caractères spéciaux…

    A plus !

  5. #25
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 149
    Points : 77
    Points
    77
    Par défaut
    Je suis parfaitement d'accord avec ce que tu dit henderson notament pour ce qui suit:

    Citation Envoyé par henderson Voir le message
    Salut !
    Et pourquoi pas dériver de TMemo... en le dotant de tout ce qu'il faut !
    Comment dans ce cas la on peut déjà mettre en ouvre les dérivations du TMemo ?
    Comment le faire évoluer par la suite?

    Je sait que mes connaissances sont parfois limité mais la j'aimerais vraiment apprendre et utiliser ca dans mes programmes. Même si on a l'impression de réinventer la roue, au moins, on aura appri à faire quelque chose. Surtout en matière de dérivé!

    Cordialement.

  6. #26
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Comme j'avais un peu de temps pour y réfléchir, voici un exemple simple qui ne résoud que des propositions simples (caractères spéciaux).

    Pour se donner un peu d'air, j'ai développé sur une unité supplémentaire.
    Son header devra donc être inclu dans l'unité qui fera usage de cette classe.
    Il s'agit donc d'une classe dérivée de TMemo qui gère pour elle-même deux objets supplémentaires :
    - un TListBox pour afficher les propositions
    - un TStatusBar pour afficher la position du caret (lignes / colonnes).
    Notons que la statusBar vient se placer sur la form à condition que la form soit l'Owner de l'objet.

    C'est aussi pour illustrer la possibilité qu'offre BCB de dériver d'une classe connue pour obtenir une classe plus élaborée.
    Concrètement, dériver d'une classe signifie que l'on va se servir de cette classe comme base (on en hérite toutes les propriétés et méthodes) pour lui rajouter d'autres propriétés et d'autres méthodes et donc pour obtenir un objet beaucoup plus élaboré.
    Pour ce que j'ai pu tester, ça semble bien fonctionner... à vous d'aller encore plus loin !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #include <ComCtrls.hpp>
     
    class jMemo : public TMemo
    {
    private :
     
    TListBox *ListBox;
    TStatusBar *StatusBar;
    char *Spec;
    int x;
    int y;
    int key;
    protected :
     
    public :
     
        __fastcall jMemo(TComponent *AOwner);
        __fastcall ~jMemo();
     
        void __fastcall HisKeyDown(TObject *Sender, WORD &Key, TShiftState Shift);
        void __fastcall HisKeyPress(TObject *Sender, char &Key);
        void __fastcall HisKeyUp(TObject *Sender, WORD &Key, TShiftState Shift);
     
        void __fastcall HisClickItem(TObject *Object);
     
        void __fastcall ShowSpec(char *T);
    };
    le .cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
    char Spec_A[] = {192, 193, 194, 195, 196, 197, 198,0};
    char Spec_a[] = {'a', 225, 226, 227, 228, 229, 230,0};
     
    __fastcall jMemo::jMemo(TComponent *AOwner)
        : TMemo(AOwner)
    {
    StatusBar = new TStatusBar(this);
    StatusBar->Parent = this;
    StatusBar->SimplePanel = true;
    StatusBar->SimpleText = "y = 0, x = 0";
     
    ListBox = new TListBox(this);
    ListBox->Parent = this;
    ListBox->Visible = false;
    ListBox->Font->Size = 18;
    ListBox->OnClick = HisClickItem;
     
    if(AOwner->InheritsFrom(__classid(TWinControl)))
        {
        Parent = (TWinControl*)AOwner;
        StatusBar->Parent = (TWinControl*)AOwner;
        ListBox->Parent = (TWinControl*)AOwner;
        }
    OnKeyUp = HisKeyUp;
    OnKeyPress = HisKeyPress;
    }
     
    __fastcall jMemo::~jMemo()
    {
    }
     
    void __fastcall jMemo::HisKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
    {
    }
     
    void __fastcall jMemo::HisKeyPress(TObject *Sender, char &Key)
    {
    //L'astuce consiste à mémoriser la touche ici
    //pour faire la différence entre maj/min
    key = Key;
    }
     
    void __fastcall jMemo::HisKeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
    {
    //On va utiliser la propriété key et non le paramère Key
    x = CaretPos.x;
    y = CaretPos.y;
    StatusBar->SimpleText = "y = " + IntToStr(y) +
                            ", x = " + IntToStr(x);
     
    AnsiString N = Lines->Strings[y];
     
    if(key != '&')
        {
        if(x > 1)
            {
            if(N[x-1] == '&')
                {
                switch(key)
                    {
                    case 'A' :
                    ShowSpec(Spec_A);
                    break;
                    case 'a' :
                    ShowSpec(Spec_a);
                    break;
                    }
                }
            }
        }
    }
     
    //Fonction simple qui va retourner les coordonnées en pixels du caret
    // via une API qu'il ne faut pas confondre avec TCustomMemo::GetCaretPos
    // donc c'est pour cette raison que cette fonction n'est pas membre de jMemo
     
    TPoint GiveCaretPos()
    {
    TPoint P;
    GetCaretPos(&P);
    return P;
    }
     
    void __fastcall jMemo::ShowSpec(char *T)
    {
    Spec = T;
    ListBox->Items->Clear();
    int n = 0;
    while(T[n] != 0)
        {
        ListBox->Items->Add((AnsiString)T[n]);
        n++;
        }
    ListBox->BringToFront();
    // A améliorer... sans doute
    TPoint P = GiveCaretPos(); // << appel à la fonction
    ListBox->SetBounds(Left + P.x,
                       Top + P.y,
                       ListBox->Width,
                       ListBox->Height);
    ListBox->Visible = true;
    }
     
    void __fastcall jMemo::HisClickItem(TObject *Object)
    {
    ListBox->Visible = false;
    AnsiString N = Lines->Strings[y];
    char c = Spec[ListBox->ItemIndex];
    AnsiString A;
    AnsiString B;
    if((x - 2) != 0) A = N.SubString(1, x-2);
    if(x < N.Length()) B = N.SubString(x, N.Length());
    Lines->Strings[y] = A + (AnsiString)c + B;
    SetFocus();
    }
    Donc à l'usage il suffit de déclarer un pointeur :

    Et de créer l'objet dans le constructeur de la form :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Memo = new jMemo(this);
    Memo->Align = alLeft;
    Memo->Width = Width / 2;
    A plus !

  7. #27
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 149
    Points : 77
    Points
    77
    Par défaut
    Waouw c'est super
    Juste une remarque, je trouve celà un peu compliqué.
    En bon débutant, je sait que l'on peut dérivé des composants existant. Mais la, j' avoue... Je vais reprendre cette exemple ce week end, a tête reposé, et essayer de comprendre comment dérivé de TMemo.
    Du coup je pense que je vais laisser ce post ouvert our revenir au sujet quand j'aurais compris comment fonctionne le principe de dérivé d'une fonction.
    Cordialement.

Discussions similaires

  1. Procédures pour une saisie semi automatique
    Par michel71 dans le forum Contribuez
    Réponses: 3
    Dernier message: 15/02/2010, 15h14
  2. [AC-2002] Validation automatique d'une saisie
    Par ROUSSIGNE dans le forum IHM
    Réponses: 2
    Dernier message: 10/11/2009, 10h52
  3. Compléter automatiquement la saisie d'une ville
    Par Dendrite dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 19/10/2009, 10h10
  4. Valider automatiquement après une saisie ?
    Par nd25 dans le forum Débuter
    Réponses: 3
    Dernier message: 05/08/2008, 13h03
  5. Sous-formulaire créer une saisie automatique
    Par Mimi-des-îles dans le forum Access
    Réponses: 2
    Dernier message: 23/02/2006, 14h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo