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. #1
    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 [BCB6]Complémenté automatiquement une saisie
    Bonjour tout le monde,
    Je suis en train de me faire une nouvelle application et je me heurte à une difficulté.
    Lorsque je saisie du code au format HTML dans un Memo, j'aimerais que si on tape une phrase avec des caractères spéciaux, au simple fait de taper une "&", un menu apparait me proposant directement la suite du code genre "é" pour le caractère "é". Si on viens en revanche à taper "&e" il sera en mesure d'isolé plusieurs groupe de possibilité. En outre le menu doit se présenté sous la forme:

    É É
    &Ecric; Ê
    Ë Ë
    etc...
    Si une sélection est prise soit par la touche "entrée" soit par le clique de la souris, elle réaliser le complément du "&" en "é".
    Dreamweaver sait faire cela oui mais la je travaille hors logiciel d'édition externe à mon programme.

    Un petit point à rajouté et après quelques recherches.
    Si j'utilise le onEvent du TMemo, je peux faire un test sur la saisie en cours à savoir le "&" et afficher un menu à ou se trouve le curseur ?
    Si oui alors comment réaliser le test et comment faire le menu ?

    J'espère que mon post ne sera pas trop compliqué à comprendre.
    J'aimerais vraiment comprendre comment réalisé cela avec BCB6.
    Cordialement.

  2. #2
    Membre régulier Avatar de Poilou
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 59
    Points : 70
    Points
    70
    Par défaut
    Bonjour,

    Concernant le test, je propose de créer un liste (TStringList) de toutes les possiblités de code é,è,ë,ê etc...

    Ensuite,je pense que l'evènement OnkeyUp du TMemo est approprié, il va se déclencher à chaque touche de clavier.
    Tu peux, par exemple, tester si le caractere "&" est frappé, stocker les caracteres suivnats (si il y en a) et tester avec le contenu de la stringlist.

    Pour l'affichage du menu, je pense que tu vas trouver des exemples dans la faq et sur le forum

    Bon courage

  3. #3
    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
    Bonjour,
    Comment créer une TStringList ?
    Par ce qu'à ce moment la, ca pourrais devenir interressant de voir le code qu'il faudrais généré pour mettre en oeuvre cette fonction.
    Cordialement.

  4. #4
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Pour creer un TStringList c'est simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TStringList *list = new TStringList() ;
    Pour ajouter des élements à la liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    list->Add ("Element1" );
    list->Add ("Element2" );
    list->Add ("Element3" );
    ou alors en chargeant depuis un fichier qui contient toutes les lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list->LoadFromFile( "D:\\MonFichier.txt" ) ;
    Important, ne pas oublier de liberer (détruire) l'objet quand tu n'en a plus besoins :


  5. #5
    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
    Dans le cas ou ca serais un fichier externe, comment serais t il organisé ?
    Je vais parraître un peu noob, je m'en excuse, mais il faut bien que je comprene comment cela fonctionne pour m'améliorer.
    Cordialement.

  6. #6
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Tu a raison de poser des questions...

    La méthode LoadFromFile() charge un fichier par ligne. Chaque ligne de ton fichier sera dans un élement de ta TStringList.

    Par exemple si tu a un fichier texte comme ça :
    aaaaaa
    bbbbbb
    cccccc
    dddddd
    Et que tu utilise la methode list->LoadFromFile("D:\\fichier.txt" ); pour charger ce fichier, se sera équivalant à faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    list->Clear() ;
    list->Add( "aaaaaa" ) ;
    list->Add( "bbbbbb" ) ;
    list->Add( "cccccc" ) ;
    list->Add( "dddddd" ) ;
    Donc chaque ligne de fichier texte = un élément dans ta StringList .

    Ensuite pour accéder aux éléments de ta StringList tu fais :

    i est la position dans la liste (en sachant que le premier élément est a la position 0)

    Pour bien comprendre, créer un texte de quelques lignes et essai :

    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
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    //création de la TStringList
      TStringList *list = new TStringList() ;
     
    //Chargement du fichier
      list->LoadFromFile( "D:\\essai.txt" ) ;
     
    //Affichage de chaque ligne de la TStringList
      for( int i =0; i< list->Count; i++ )
      {
        ShowMessage( list->Strings[i] );
      }
     
    //Libération du TStringList
      delete list ;
    }

  7. #7
    Membre régulier Avatar de Poilou
    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 59
    Points : 70
    Points
    70
    Par défaut
    Si tu pars d'un fichier, il va créer autant de ligne dans la StringList qu'il y en a dans le fichier.

    N'hésite à utiliser l'aide de builder. Pour ce genre de question, elle remplit parfaitement son rôle
    Description

    La méthode LoadFromFile remplit la liste de l'objet TStrings avec le contenu du fichier spécifié par FileName. Chaque ligne du fichier (séparée par des caractères retour chariot et/ou passage à la ligne) est ajoutée comme une chaîne de la liste
    Aprés, si tu as besoin d'aide sur l'organisation et "l'articulation" de code, il y a le forum

    EDIT : Grillé par la fraicheur

  8. #8
    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
    Ah oui... Je comprend mieux.
    En fait, je ne sait pas ce que va saisir l'utilisateur du coup je ne peux pas faire une liste à l'arache. D'où mon autre question.

    Si je fais le test sur la saisie, autant partir du "é" ou "è" ou "ù" etc... pour en faire des &eacute; etc ....
    Comment alors faire un fichier et une commande sur la saisie pour que celà remplace directement ? Du coup on aurais plus de menu à affiché
    Cordialement.

  9. #9
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Est ce que j'ai bien compris :

    En gros l'utilisateur écris dans le Memo, et lorsque qu'il appuis sur & ton programme regarde le dernier caractère entré et si c'est un caractère prédéfini il ajoute automatiquement la fin du mot.

  10. #10
    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
    Voila c'est exactement cela. Ou il commence par un "&" auquel cas on a un menu, ou il tape un caractère spécial (un caractère avec accent par exemple) et la conversion se fait directement
    C'est ce principe que j'aimerais obtenir.

  11. #11
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Est ce que la liste des possibilités est longue?

    Combien d'éléments souhaite tu pouvoir auto-compléter?

    Est ce que tu souhaite afficher le '&' ou c'est juste pour auto-compléter?

  12. #12
    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
    Citation Envoyé par sat83 Voir le message
    Est ce que la liste des possibilités est longue
    Oui car il s'agit de tout les caractères spéciaux utilisable en HTML.

    Citation Envoyé par sat83 Voir le message
    Combien d'éléments souhaite tu pouvoir auto-compléter?
    L'enssemble.

    Citation Envoyé par sat83 Voir le message
    Est ce que tu souhaite afficher le '&' ou c'est juste pour auto-compléter?
    Si l'utilisateur commence à saisir une & alors on complémente, sinon on remplace dès que la lettre est saisie.

    &->eacute;->&eacute; //Cas ou c'est en autocomplation par menu.
    é->&eacute; //Cas ou l'on remplace car on connais la lettre à remplacé, sans menu.

    Tout simplement.

  13. #13
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Et en nombre ça représente combien de possibilités? 20? 100? 1000?

    Est-ce qu'il peut y avoir des conflits? (mots commençant de la même façon)

  14. #14
    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
    En fait je me réfère au tableau suivant http://www.net-pratique.fr/apprendre/carachtml.html .
    Donc celà fais déjà pas mal de cas à voir.

  15. #15
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Ok, j'ai enfin compris ce que tu voulais faire!

    Juste une question : est ce qu'il faut forcément remplacer les caractères spéciaux au cours de la frappe, ou alors tu peux le faire en globale à la fin?

  16. #16
    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
    L'idéale serais de changer en cours de saisie

  17. #17
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    Par défaut
    Le problème c'est que le TMemo n'affiche même pas tous les caractères spéciaux de la liste que tu as donné...

    Ton projet me semble quand même bien compliqué, même si sûrement réalisable...

    Voilà quelques fonction qui pourront peut etre t'aider :

    Fonction permettant de retrouver la position du curseur dans un TMemo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void GetCursorPosition( int &X, int &Y, TMemo *memo )
    {
      X  =  SendMessage(memo->Handle,EM_LINEFROMCHAR,memo->SelStart,0);
      Y  =  memo->SelStart - SendMessage(memo->Handle,EM_LINEINDEX,X,0);
    }
    Fonction permettant de trouver le mot juste avant une position donné dans un TMemo:

    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
    AnsiString GetLastWord( int y, int x, TMemo *memo )
    {
       AnsiString ligne = memo->Lines->Strings[y] ;
       AnsiString resultat = "" ;
     
       for( int i = x; i>0; i-- )
       {
         if (ligne[i] == ' ')
         {
            resultat = ligne.SubString(i+1,x+1) ;
            break;
         }
     
         if( i == 1)
         {
            resultat = ligne.SubString(1,x+1) ;
            break;
         }
       }
       return( resultat ) ;
    }
    Petit exemple d'utilisation de ces deux fonctions dans le OnKeyPress d'un TMemo:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void __fastcall TForm1::Memo1KeyPress(TObject *Sender, char &Key)
    {
      if( Key == '&' )
      {
         int posX, posY ;
         GetCursorPosition( posX, posY, Memo1 ) ;
         AnsiString str = GetLastWord( posX, posY );
         ShowMessage( str ) ;
         Key = 0 ;
      }
    }
    Ces quelques fonctions ne te seront pas utile tel quel, mais ca peut etre un debut de piste pour ce que tu veux faire.

    Ce que je ferais ensuite c'est creer une classe simple permettant de contenir un caractère et sa correspondance html :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class TCodeHTML : public TObject
    {
      public:
        char        Fcaractere ;
        AnsiString  FhtmlCode ;
     
        TCodeHTML( char c, AnsiString html_code ) ;
     
      __published :
     
      __property char         caractere = { read=Fcaractere, write=Fcaractere };
      __property AnsiString   HTML_Code = { read=FhtmlCode, write=FhtmlCode };
    };
    Ensuite tu Creer un TObjectList une liste d'objet TCodeHTML qui contient l'ensemble des caractère et leurs correspondance HTML (eventuellement chargée depuis un fichier texte).

    Ensuite pour chaque caractère préssé dan le TMemo, tu regarde si celui ci est present dans ta liste, et si oui, tu le remplace par la correspondance.

    Ca fais beaucoup d'infos en même temps, et je suppose que tu ne comprend pas forcément tous ce que je viens de te dire. Je te laisse don digéré tous ca et essayé d'avancer de ton coté en t'inspirant (ou non) des quelques pistes que je t'ai donné.

    Bon courage.

  18. #18
    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
    Il faudrait faire une liste déroulante à la position du curseur quand on tape "&" sans les guillemets bien sur
    C'est pour cela que je pense que tu est limité.
    Personnellement, le Memo ne me sert que pour saisir mon texte HTML.

  19. #19
    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,

    J'ai fait un petit test, mais avec un TRichEdit.
    Cela donnerais ceci, en tout cas pour avoir la liste déroulante:

    .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private:
    		TPoint CurPoint;
    		int idx_line;
    .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
     
    void __fastcall Tfrm_cm::Rich_cibleChange(TObject *Sender)
    {
    GetCaretPos(&CurPoint);
    }
    //---------------------------------------------------------------------------
     
    void __fastcall Tfrm_cm::Rich_cibleEnter(TObject *Sender)
    {
    GetCaretPos(&CurPoint);
    }
    //---------------------------------------------------------------------------
     
    void __fastcall Tfrm_cm::Rich_cibleClick(TObject *Sender)
    {
    GetCaretPos(&CurPoint);
    }
    //---------------------------------------------------------------------------
     
    void __fastcall Tfrm_cm::Rich_cibleKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
    	switch(Key)
    	{
    	case 54:
    		if (GetAsyncKeyState(VK_SHIFT) || GetAsyncKeyState(VK_CAPITAL) || ((GetKeyState(VK_CAPITAL) & 1) == 1))
    		{
    			idx_line = SendMessage( Rich_cible->Handle, EM_LINEFROMCHAR, Key, 0);
    			frm_cm->PopCompletion->Popup(ClientToScreen(CurPoint).x, ClientToScreen(CurPoint).y);
    		Key = NULL;
    		}
    	break;
    	}
    }
    On suppose (dans ce cas) que le TPopupMenu (PopCompletion) n'est pas crée dynamiquement mais dans l'éditeur, ce qui ne changerais pas grand chose de toute facons...
    Par rapport a la configuration de mon clavier, je fais un test dans le OnKeyDown du RichEdit afin de savoir si la touche maj est enfoncée, etc ... mais ceci est particulier a mon clavier.

    En espérant t'aider pour ce point, il ne reste "que" l'insertion du texte sélectionné dans le PopupMenu a la position en cours.
    NB que tu peut relier tous les "OnClick()" des items de ton PopupMenu en déclarant une fonction dans le .h (en published), telle que:

    .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    published:
    void __fastcall ItemsPopClick(TObject *Sender);
    Dans l'inspecteur d'objet, pour chacun de tes items du Popup, du désigne alors cette fonction pour l'évènement OnClick().
    Rappel, pour récupérer le Caption du MenuItem ayant appellé cette "fonction" (le Sender):
    .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void __fastcall Tfrm_cm::ItemsPopClick(TObject *Sender)
    {
       ((TMenuItem*)Sender)->Caption;
    //etc
    }
    Bon, il ne reste plus qu'a l'inserer dans le texte de la bonne ligne, a la bonne position ...

    @+

  20. #20
    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 bien d'accord qu'avec RichEdit, cette méthode peut s'appliquer. Mais voila un RichEdit ne fais pas ce qui faut quand j'enregistre sous... tout deviens incompréhensible, voir d'autre post à ce sujet !
    Du coup je me contenterais d'un modeste TMemo.
    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