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

 Delphi Discussion :

RichEdit: Insertion char sur selection


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Par défaut RichEdit: Insertion char sur selection
    Bonjour,

    Mon but est de simuler le CTRL+SHIFT+I/U de Delphi dans mon TRichEdit
    Voila mon code:

    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
     if (Shift = [ssAlt]) and (Key = 73) then
     begin
     
       length := RichEdit1.SelLength;
       RichEdit1.SelLength := 0;
     
       start := RichEdit1.SelStart;
       i := RichEdit1.SelLength;
       last := RichEdit1.CaretPos.Y;
     
       RichEdit1.SelText := '  ';
       while ( i <> length+start ) do
       begin
     
         if ( last = RichEdit1.CaretPos.Y ) then
         begin
           RichEdit1.SelStart := RichEdit1.SelStart+1;
         end
         else
         begin
           RichEdit1.SelText := '  ';
         end;
         RichEdit1.Refresh;
         i := i+1;
       end;
     
     end;
    Bon pour le moment j'ai mis sur Alt+I, sa c'est un autre problème j'y viendrais à la fin lol
    Donc mon problème, je fais une boucle et j'augmente ma position petit à petit pour en gros détecter la nouvelle ligne et donc insérer le double espace ....
    Le problème est qu'au bout de la ligne, le SelStart n'augmente plus ... donc le CaretPos non plus
    Je m'y prend mal à quel moment ?

    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Par défaut
    Bon j'ai trouver
    J'incrémente de deux au lieu d'un ... le retour à la ligne prend 2char, et bizarrement il veut pas faire le SelStart entre les deux ...

    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
       length := RichEdit1.SelLength;
       RichEdit1.SelLength := 0;
       start := RichEdit1.SelStart;
       last := RichEdit1.CaretPos.Y;
     
       i := 0;
       count := 0;
       RichEdit1.SelText := '  ';
       if length = 0 then Exit;
     
       while ( i < length/2 ) do
       begin
     
         if ( last = RichEdit1.CaretPos.Y ) then
         begin
           RichEdit1.SelStart := RichEdit1.SelStart+2;
         end
         else
         begin
           RichEdit1.SelText := '  ';
           count := count+1;
         last := RichEdit1.CaretPos.Y;       
         end;
         i := i+1;
       end;
     
       RichEdit1.SelStart := start;
       RichEdit1.SelLength := length+4*count;

  3. #3
    Membre Expert

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Par défaut
    Bon tu veux pouvoir ajouter des espaces dans ton TRichEdit ... OK

    Ben t'as qu'a faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i:=1 to RichEdit1.Lines.Count do
      RichEdit1.Lines[i]:='  '+RichEdit1.Lines[i];
    Ensuite, pour tester l'état de touches, t'as qu'a te servir de GetAsyncKeyState ou GetKeyState (je ne connais pas la différence), c'est tres simple.

    Enfin, tu as mis Key=73, je pense que ca serait mieux de mettre Key=Ord(I) je pense (je ne me souviens pas de la syntaxe)

    Je n'ai jamais réussi a me servir du SelLength, SelStart ... bizarre

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 47
    Par défaut
    Pas mal ta méthode, mais sur une sélection et non un texte entier ... comment tu récupère la première ligne de sélection ainsi que la dernière?

  5. #5
    Membre Expert

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Par défaut
    HAHAAAA d'accord ...

    Ben sert toi quand meme de ce code, mais en plus, sert toi du SelStrat et du SelLength (t'as l'air de savoir t'en servir ...). Je précise que je n'ai jamais réussi a le faire marcher (je n'ai pas essayé longtemps faut dire ...).

    Faudrait te faire une fonction qui renvoie la ligne en fonction du numéro de caractere A PARTIR DU DEBUT : Genre comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function TrouveLigne (Position :integer) :integer;
    var Somme, NoLigne :integer;
    begin
      Somme:=0;
      NoLigne:=0;
      While Somme <= Position do 
      begin
        Somme:=Somme+Length(Memo1.Lines[NoLigne])+2; //Caracteres de fin de ligne
        inc(NoLigne);
      end;
      TrouveLigne:=NoLigne-1;
    end;
    Ensuite,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i:=TrouverLigne(PosDebut) to TrouverLigne(PosDebut+LongueurSel) do
      RichEdit1.Lines[i]:='  '+RichEdit1.Lines[i];

    Je pense meme que cette fonction TrouverLigne existe déja, par contre je ne la connais pas ...
    Je répete, c'est fait vraiment vite fait ....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [INSERT][SELECT] insert avec un select imbriqué
    Par narmataru dans le forum SQL
    Réponses: 11
    Dernier message: 06/03/2013, 03h04
  2. [AC-2003] insert into avec select sur colonne suivante
    Par nawakbling dans le forum VBA Access
    Réponses: 1
    Dernier message: 12/10/2010, 19h44
  3. [Res]Procédure stockée qui fait un insert basé sur un select
    Par wonderliza dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 22/12/2005, 18h25
  4. pb d'insertion avec un SELECT sur une autre table
    Par epeichette dans le forum Requêtes
    Réponses: 3
    Dernier message: 03/01/2005, 22h58
  5. question sur SELECT ...WHERE...IN
    Par danseur dans le forum Requêtes
    Réponses: 3
    Dernier message: 23/01/2004, 15h23

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