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

Lazarus Pascal Discussion :

Première lettre d'une cellule d'un StringGrid en majuscule [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre confirmé Avatar de winow
    Inscrit en
    Novembre 2004
    Messages
    668
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Novembre 2004
    Messages : 668
    Points : 628
    Points
    628
    Par défaut Première lettre d'une cellule d'un StringGrid en majuscule
    Bonjour

    Comment mettre la première lettre d'une cellule d'un stringgrid en majuscule.
    pendant la frappe de la chaîne de caractère de cette cellule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringGrid1.Cell[1,1] := ' Majuscule ' ;
    j'ai recherché un début de solution sur le net mais rien n'y fait ?

    merci
    .
    Why
    .
    //------------------

  2. #2
    Membre confirmé Avatar de winow
    Inscrit en
    Novembre 2004
    Messages
    668
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Novembre 2004
    Messages : 668
    Points : 628
    Points
    628
    Par défaut
    j'ai fait ce code qui le fait mais est ce bien ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm1.StringGrid1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
      if Length(StringGrid1.Cells[1,1])<=1 then 
        begin
           StringGrid1.Cells[1,1]:=upcase(StringGrid1.Cells[1,1]);
      end;
    end;
    .
    Why
    .
    //------------------

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 458
    Points
    15 458
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Je ferais plutôt comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: char);
    begin
      with StringGrid1 do
      begin
        if (Cells[Col, Row] = '') and (Key in ['a'..'z']) then
          Key := UpCase(Key);
      end;
    end;
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #4
    Membre confirmé Avatar de winow
    Inscrit en
    Novembre 2004
    Messages
    668
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Novembre 2004
    Messages : 668
    Points : 628
    Points
    628
    Par défaut
    bonjour et merci Roland Chastain pour la réponse

    le code va bien mais je suis obligé d’écrire deux fois le mot pour
    qu'a la deuxième fois la première lettre du mot soit en majuscule ?

    fois 1 = grenoble
    fois 2 = Grenoble

    je suis sous Linux Ubuntu
    .
    Why
    .
    //------------------

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 458
    Points
    15 458
    Billets dans le blog
    9
    Par défaut
    C'est curieux, chez moi (Lazarus 1.2.6, Windows 8) ça fonctionne parfaitement. Y aurait-il une différence de comportement entre Windows et Linux ? Ou bien d'une version de Lazarus à l'autre ?

    Êtes-vous sûr d'avoir bien retranscrit le code que j'ai posté ? Remarquez bien que j'ai utilisé l'événement OnKeyPress (et non pas OnKeyUp) ?
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #6
    Membre confirmé Avatar de winow
    Inscrit en
    Novembre 2004
    Messages
    668
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Novembre 2004
    Messages : 668
    Points : 628
    Points
    628
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    C'est curieux, chez moi (Lazarus 1.2.6, Windows 8) ça fonctionne parfaitement. Y aurait-il une différence de comportement entre Windows et Linux ? Ou bien d'une version de Lazarus à l'autre ?

    Êtes-vous sûr d'avoir bien retranscrit le code que j'ai posté ? Remarquez bien que j'ai utilisé l'événement OnKeyPress (et non pas OnKeyUp) ?
    oui, j'ai fait un copier/coller du code que tu ma donné que j'ai collé dans OnKeyPress du StringGrid
    .
    Why
    .
    //------------------

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 458
    Points
    15 458
    Billets dans le blog
    9
    Par défaut
    Je n'ai pas d'explication.

    Voici une autre possibilité. Cette fois la modification se fait au moment où on valide le contenu de la cellule :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.StringGrid1EditingDone(Sender: TObject);
    begin
      with StringGrid1 do
        Cells[Col, Row] :=
          UpCase(Copy(Cells[Col, Row], 1, 1)) +
          Copy(Cells[Col, Row], 2, Length(Cells[Col, Row]) - 1);
    end;
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  8. #8
    Membre confirmé Avatar de winow
    Inscrit en
    Novembre 2004
    Messages
    668
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Novembre 2004
    Messages : 668
    Points : 628
    Points
    628
    Par défaut
    celui la fonctionne parfaitement sous Linux, je vais essayer de l'adapter a mon cas.
    merci Roland Chastain
    .
    Why
    .
    //------------------

  9. #9
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 859
    Points : 11 303
    Points
    11 303
    Billets dans le blog
    6
    Par défaut
    Bizarre !
    Ce code met en majuscule dès la seconde frappe :
    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
    procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: char);
    var
      iCol, iRow: integer;
      Grid: TStringGrid;
      S: string;
    begin
      Exit;
      Grid := Sender as TStringGrid;
      iCol := Grid.Col;
      iRow := Grid.Row;
      case Length(Grid.Cells[iCol, iRow]) of
       0 : Key := UpCase(Key);
       1 : begin
             S := Grid.Cells[iCol, iRow];
             Grid.Cells[iCol, iRow] := UpCase(S[1]);
           end;
      else Key := Key;
      end;
    end;
    On peut aussi utiliser le OnValidateEntry en fin de saisie, qui est déclenché aussi en cas de copier/coller.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  10. #10
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 458
    Points
    15 458
    Billets dans le blog
    9
    Par défaut
    Bonsoir tourlourou !

    Merci pour le code. Je ne connaissais pas le coup du Sender as TStringGrid. Bien noté aussi ce que tu dis sur l'événement OnValidateEntry : ça peut servir.

    Citation Envoyé par tourlourou Voir le message
    Ce code met en majuscule dès la seconde frappe :
    Chez moi, la majuscule apparaît dès la première frappe !

    Au fait, tu as laissé traîner un Exit.

    Et encore une chose, cette ligne, elle ne sert trop à rien, non ?

    Encore qu'elle soit satisfaisante pour l'esprit.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  11. #11
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 859
    Points : 11 303
    Points
    11 303
    Billets dans le blog
    6
    Par défaut
    Bonsoir Roland,

    J'ai laissé traîner l'Exit pour avoir fait de nombreux tests afin de comprendre, sous Ubuntu.
    Dès la première frappe sous Windows => cellule vide et reconnue comme telle, ce qui n'est pas le cas sous Ubuntu, puisque ne se produit qu'à la deuxième frappe !
    Différence étonnante...

    J'ai regardé ici et joué avec le OnKeyDown : pas mieux ; avec le texte du InplaceEditor : pas mieux, etc.

    Le plus beau (ou énervant), c'est que si on récupère le contenu dans une chaîne locale, elle apparaît bien vide en débogage, mais ça ne fonctionne pas comme ça devrait... Comme si l'éditeur ne tenait pas compte du caractère modifié par l'événement OnKeyPress (vérifié dans le OnKeyDown en affectant une constante : au total, la saisie n'est pas faite : ni celle frappée, ni le caractère modifié !).

    Bref, comportement attristant tant qu'on ne tient pas l'explication...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  12. #12
    Membre confirmé Avatar de winow
    Inscrit en
    Novembre 2004
    Messages
    668
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Novembre 2004
    Messages : 668
    Points : 628
    Points
    628
    Par défaut
    merci Tourlourou

    pareil pour moi, a la deuxième frappe la majuscule est prise en compte, bizarre quand même.
    .
    Why
    .
    //------------------

  13. #13
    Membre confirmé Avatar de winow
    Inscrit en
    Novembre 2004
    Messages
    668
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Novembre 2004
    Messages : 668
    Points : 628
    Points
    628
    Par défaut
    j'ai modifié les option du stringgrid et avec le code de Tourlourou
    maintenant la majuscule est prise en compte dès la première frappe.

    par contre je sais pas laquelle car maintenant n'importe quoi que je fasse dans les options
    pour voir ce qui a décoincé le truc, la saisie affiche direct la majuscule a la première frappe ???

    mes options sont :
    goAlwaysShowEditor, goAutoAddRows, goColMoving, goColSizing,
    goEditing, goRowMoving, goSelectionActive, goTabs.
    .
    Why
    .
    //------------------

  14. #14
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonsoir,

    et avec l'événement OnSetEditText, cela marche-t-il sous Linux ? du genre...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: string);
    var
      S: string;
    begin
        if Length(Value) > 0 then
        begin
            S:= StringGrid1.Cells[ACol,ARow];
            S[1]:= UpCase(S[1]);
            StringGrid1.Cells[ACol,ARow]:= S;
        end;
    end;
    Cordialement
    Thierry

    Edit: pas vu le dernier message

  15. #15
    Membre confirmé Avatar de winow
    Inscrit en
    Novembre 2004
    Messages
    668
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Novembre 2004
    Messages : 668
    Points : 628
    Points
    628
    Par défaut
    Citation Envoyé par ThWilliam Voir le message
    Bonsoir,

    et avec l'événement OnSetEditText, cela marche-t-il sous Linux ? du genre...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol, ARow: Integer; const Value: string);
    var
      S: string;
    begin
        if Length(Value) > 0 then
        begin
            S:= StringGrid1.Cells[ACol,ARow];
            S[1]:= UpCase(S[1]);
            StringGrid1.Cells[ACol,ARow]:= S;
        end;
    end;
    Cordialement
    Thierry

    Edit: pas vu le dernier message
    oui ca fonctionne mais le curseur est toujours placé un caractère avant le dernier caractère,
    c'est a dire :
    frappe 1 = D
    frappe 2 = D.d
    frappe 3 = Dd.d
    frappe 4 = Ddd.d etc...
    (le point représente le curseur de souris)
    .
    Why
    .
    //------------------

  16. #16
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 732
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 732
    Points : 15 137
    Points
    15 137
    Par défaut
    Salut,

    sous Linux ce code (ton premier) fonctionne très bien :
    Citation Envoyé par winow Voir le message
    j'ai fait ce code qui le fait mais est-ce bien ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm1.StringGrid1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    begin
      if Length(StringGrid1.Cells[1,1])<=1 then 
        begin
           StringGrid1.Cells[1,1]:=upcase(StringGrid1.Cells[1,1]);
      end;
    end;
    Un peu optimisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.StringGrid1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      with StringGrid1 do
        if Length(Cells[Col,Row]) = 1 then Cells[Col,Row] := upcase(Cells[Col,Row]);
    end;
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  17. #17
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 458
    Points
    15 458
    Billets dans le blog
    9
    Par défaut
    Sous Windows également, la version corrigée du code fonctionne bien.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  18. #18
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 859
    Points : 11 303
    Points
    11 303
    Billets dans le blog
    6
    Par défaut
    Pas testé, mais ce qui n'est pas satisfaisant, c'est que le paramètre Key est en var, mais sans effet si on le change...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  19. #19
    Membre confirmé Avatar de winow
    Inscrit en
    Novembre 2004
    Messages
    668
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Novembre 2004
    Messages : 668
    Points : 628
    Points
    628
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Salut,

    sous Linux ce code (ton premier) fonctionne très bien :


    Un peu optimisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.StringGrid1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
      with StringGrid1 do
        if Length(Cells[Col,Row]) = 1 then Cells[Col,Row] := upcase(Cells[Col,Row]);
    end;
    Avec Ubuntu/Lazarus :
    mon code ne met que la majuscule que sur la cellule 1,1
    Ton code met la majuscule sur toutes les cellules avec ubuntu/lazarus.
    .
    Why
    .
    //------------------

  20. #20
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonsoir,

    Je pense que la meilleure solution pour toi est de modifier le texte à la sortie de la cellule (comme Roland l'a d'ailleurs suggéré).
    La solution avec KeyUp fonctionne mais à condition que la longueur du texte soit = 1.
    Donc tu n'auras plus la première lettre en majuscule si :
    - l'utilisateur repositionne le curseur au début pour modifier la première lettre.
    - l'utilisateur fait un coller.

    Teste ceci sous Linux.
    Remarque : j'ai adapté la mise en majuscule convenant à l'UTF8 (L'unité LazUTF8 est à déclarer): la première lettre passera en majuscule même pour un caractère accentué.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.StringGrid1EditingDone(Sender: TObject);
    var
      S: string;
    begin
       with StringGrid1 do S:= Cells[Col, Row];
       if Length(S) > 0 then
       begin
           S:= UTF8UpperCase(UTF8LeftStr(S, 1)) + UTF8Copy(S, 2, Length(S));
           with StringGrid1 do Cells[Col, Row]:= S;
       end;
    end;
    Cordialement
    Thierry

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. [XL-2007] Lire les 3 premières lettres d'une cellule
    Par nioko dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 17/12/2012, 17h04
  2. [XL-2007] Comment vérifier la première lettre d'une cellule?
    Par mentat dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 31/01/2010, 21h28
  3. Réponses: 2
    Dernier message: 16/10/2008, 12h06
  4. Extraire les deux dernieres lettres d'une cellule
    Par SybVicious dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 03/09/2006, 11h54
  5. Récupérer les deux premières lettres d'une chaine
    Par moscovisci dans le forum ASP
    Réponses: 3
    Dernier message: 10/01/2006, 14h53

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