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

Composants VCL Delphi Discussion :

[TSynEdit] Méthode Undo


Sujet :

Composants VCL Delphi

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [TSynEdit] Méthode Undo
    Bonjour à tous,

    J'utilise un composant TSynEdit pour la saisie de requêtes SQL dans un programme, et il se trouve que le texte ajouté par le programme n'est pas pris en compte par la méthode Undo.

    Voici un extrait du code incriminé (le but étant d'insérer automatiquement les noms et les champs des tables à partir de ListBox/ComboBox sans avoir à les taper manuellement) :
    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
    procedure TMainForm.ListBoxTablesDblClick(Sender: TObject);
    var
      Pre: String;// texte avant le curseur
      Post: String;// texte après le curseur
    begin
      SynEditSQL.SetFocus;
     
      Pre := copy(SynEditSQL.Lines[SynEditSQL.CaretY - 1], 1, SynEditSQL.CaretX - 1);
      Post := copy(SynEditSQL.Lines[SynEditSQL.CaretY - 1], SynEditSQL.CaretX, Length(SynEditSQL.Lines[SynEditSQL.CaretY - 1]));
     
      SynEditSQL.BeginUndoBlock;
      SynEditSQL.Lines[SynEditSQL.CaretY - 1] := Pre + ListBoxTables.Items[ListBoxTables.ItemIndex] + Post;
      SynEditSQL.EndUndoBlock;
     
      SynEditSQL.CaretX := Length(SynEditSQL.Lines[SynEditSQL.CaretY - 1]) + 1;
      SynEditSQL.Modified := True;
    end;
    J'ai essayé de délimiter les modifications avec les propriétés BlockBegin et BlockEnd, sans plus de succès: la méthode Undo efface le texte situé aux endroits saisis manuellement, ignorant les insertions de la procédure ci-dessus.

    Quid ?

  2. #2
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Il ne faut pas travailler sur la propriété Lines ou Lines.Text pour que le Undo soit géré.

    Il ne faut utiliser que les propriété SelStart, SelEnd et SelText.

    Par exempl pour insérer du texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SynEdit1.SelStart := PositionOuJeVeuxInserer;
    SynEdit1.SelText := 'le texte insréré';
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Çà semble tellement simple une fois qu'on a la solution Merci !

    Par contre, pour avoir la valeur de SelStart à partir de la position du curseur, il y a un moyen simple et rapide ? Là j'utilise pos, il y a sûrement mieux

    J'ai bien trouvé cette méthode, mais elle ne semble pas fonctionner (elle reste sur la première ligne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      SynEditSQL.SelStart := SynEditSQL.Perform(EM_LINEINDEX, SynEditSQL.CaretY - 1, 0) + SynEditSQL.CaretX - 1;
      SynEditSQL.SelText := ListBoxTables.Items[ListBoxTables.ItemIndex];

  4. #4
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    A partir de la position du curseur ????

    Mais quand tu cliques dans le SynEdit ou si tu te déplaces avec les flèches, SelStart est automatiquement à jour avec la bonne valeur. Tu n'as donc rien à calculer, juste faire SelText=' le texte à insérer';
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Aïe, c'est dur de reprendre le Delphi après être passé par le C... *se sent bête*

    Merci à toi, c'est impeccable

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

Discussions similaires

  1. [Méthodes]UML vs MERISE Lequel pour quoi ?
    Par Daniel258 dans le forum Méthodes
    Réponses: 5
    Dernier message: 31/03/2003, 11h49
  2. Gros Problème avec DirectShow et la méthode RELEASE
    Par Olivier Delmotte dans le forum DirectX
    Réponses: 3
    Dernier message: 10/03/2003, 18h10
  3. [Singleton] Différences avec méthodes statiques
    Par Franche dans le forum Design Patterns
    Réponses: 1
    Dernier message: 26/02/2003, 17h10
  4. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 14h26
  5. Cryptage en C selon la méthode de césat
    Par shenron dans le forum C
    Réponses: 2
    Dernier message: 31/05/2002, 08h22

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