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 :

Problème avec un TDrawGrid en mode Edition


Sujet :

Lazarus Pascal

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut Problème avec un TDrawGrid en mode Edition
    Bonjour à toutes et à tous,

    Je sèche lamentablement depuis une journée sur un problème de modification en cours de frappe.

    Mon problème : Dans une cellule d'un TDrawGrid que j'ai mis en mode "édition", je voudrais pouvoir modifier au cours de la frappe le contenu de cette cellule. Par exemple, je dois y entrer une valeur numérique et je souhaiterais que lorsque je frappe sur un caractère alpha, celui n'apparaisse pas dans la cellule et ne soit pas pris en compte.

    Je n'y arrive pas, j'ai bien essayé diféentes chose avec les propriétés, les options, les évènement OnKeyPress, OnGetEditText, ... rien n'y fait.

    Peut-être n'est-ce pas possible ?

    Si cela l'est, avez-vous une piste, un exemple à me donner ?

    Merci de votre aide.

    Pierre

  2. #2
    Membre chevronné

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Salut

    A ta place, lors du clic sur la cellule, je placerai un TEdit de la même taille que la cellule, et tu gères tout ce que tu veux avec les évenements du TEdit. Tu peux peut être mettre un TSpinEdit si ca correspond a tes besoins ...

    Bonne chance

  3. #3
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Alors ça, c'est pas c.. . S'il n'y a pas de solution plus directe avec le TDrawGrid, je vais essayer cela.

    Merci beaucoup.

    Pierre

  4. #4
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Je n'y arrive pas, j'ai bien essayé diféentes chose avec les propriétés, les options, les évènement OnKeyPress, OnGetEditText, ... rien n'y fait.
    Bonjour

    Euh, je n'ai peut-être pas bien compris le but, mais si c'est de filtrer la frappe de certains caractères, pourquoi ne pas utiliser l'événement KeyPress de TDrawGrid ?

    Par exemple pour filtrer les touches numériques:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.DrawGrid1KeyPress(Sender: TObject; var Key: char);
    begin
      case Key of
        #0..#31, '0'..'9':
      else
        key:=#0;
      end;
    end;
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

  5. #5
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Merci DOLPat® pour cette solution.

    Je l'avais ébauchée, mais j'avais buté sur le problème du séparateur décimal qui doit :

    - se trouver au moins en deuxième position,
    - n'apparaître qu'une fois.

    Je n'avais pas réussi à gérer cela car avec OnKeyPressed, on ne connaît pas la position du curseur lorsqu'on le déplace.

    Je vais reconsidérer la question.

    Cordialement.

    Pierre

  6. #6
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Je n'avais pas réussi à gérer cela car avec OnKeyPressed, on ne connaît pas la position du curseur lorsqu'on le déplace.
    Une demi-solution est d'interdire l'utilisation des touches VK_Left et VK_Right et de n'autoriser que VK_Back pour les corrections. Il est alors facile de gérer le séparateur décimal.
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 857
    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 857
    Points : 11 291
    Points
    11 291
    Billets dans le blog
    6
    Par défaut
    une autre idée est de gérer le OnChange(Text) de la cellule (s'il existe) ou le KeyPress en testant si la modification conserve la compatibilité avec le format souhaité (sinon, il suffit de l'annuler).

    en utilisant S=Format(S, 'ton masque') ou regexp ou routine ou conversion
    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 !

  8. #8
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    une autre idée est de gérer le OnChange(Text) de la cellule (s'il existe) ou le KeyPress en testant si la modification conserve la compatibilité avec le format souhaité (sinon, il suffit de l'annuler). ...
    OnChange n'existe pas. Le KeyPress tout seul n'est pas gérable. Par contre, il me semble qu'en combinant les données de OnKeyPress et OnSetEditText je devrait y arriver ... Je cherche.

    Cordialement.

    Pierre

  9. #9
    Membre chevronné

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Salut

    Voila, j'ai une solution qui devrait te convenir :

    Le stringgrid de base contient un Edit appelé inplaceEditor. Le truc, c'est d'en créer un qui est plus libre d'utilisation. Tu crées donc une nouvelle classe pour l'InplaceEditor de la Grid, et une nouvelle classe pour la StringGrid.

    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
      TMyInPlaceEdit = class(TInPlaceEdit)
      public
        property OnKeyPress;
        property SelLength;
        property SelStart;
        property SelText;
        property Text;
            //ici, tu ajoutes toutes les propriétés pour ton Edit
      end;
     
      TMyStringGrid = class(TStringGrid)
      protected
        FOnEditorKeyPress : TKeyPressEvent;
     
        function CreateEditor: TInplaceEdit; override;
      public
        property OnEditorKeyPress : TKeyPressEvent read FOnEditorKeyPress write FOnEditorKeyPress;
      end;
     
     
    ...
     
     
    function TMyStringGrid.CreateEditor: TInplaceEdit;
    begin
      Result:=TMyInPlaceEdit.Create(Self);
      (Result as TMyInplaceEdit).Color:=clBlue;
      (Result as TMyInplaceEdit).OnKeyPress:=FOnEditorKeyPress;
        //ici, tu modifies les propriétés de ton composant, et tu ajoutes si nécessaire les évenements.
    end;
    Pour l'utiliser, tu n'as qu'à faire :
    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 TForm1.FormCreate(Sender: TObject);
    var SG : TMyStringGrid;
    begin
      SG:=TMyStringGrid.Create(self);
      SG.Parent:=Self;
      SG.OnEditorKeyPress:=SGEditorKeyPress;
    end;
     
     
    procedure TForm1.SGEditorKeyPress(Sender: TObject; var Key: Char);
    begin
      if (Sender as TMyInPlaceEdit).SelStart>2 then
        Key:='a'
      else
        Key:='b';
    end;
    Un petit souci, utiliser l'évenement OnChange ne fonctionnera pas ... Tu peux donc, comme j'ai fait, te servir du OnKeyPress, avec SelStart, SelText, etc.

    Un autre truc, TInplaceEdit dérive de TMaskEdit, donc tu peux créer un mask pour ton composant.

    En espérant que cela te convienne, bonne chance !

    Mick605

  10. #10
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Merci mick605 pour cette solution. J'ai résolu mon problème autrement mais pas à 100 % (gestion du signe moins). J'essaierai cette solution d'autant plus que le ImplaceEditor existe en Delphi, mais pas en Lazarus.

    Cordialement.

    Pierre

  11. #11
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour,

    Pour info, comment as-tu résolu le problème ?

    Il est sûrement possible de tester très finement avec OnKeyPress et SelStart, mais c'est assez compliqué. On peut aussi très facilement définir un masque de saisie sur la cellule avec OnGetEditMask. Dans les 2 cas, je trouve personnellement que cela donne des résultats peu ergonomiques.

    De mon côté je me contente donc de filtrer les caractères non numériques, virgules ou signe avec le OnKeyPress, mais surtout je valide le texte avant de passer à la cellule suivante ou de sortir, en utilisant le nouveau OnValidate qui est apparu en 0.9.30 (ou autrement, avant).

    La validation finale est toujours indispensable, parce qu'on peut coller un texte à la souris sans le clavier (donc sans OnKeyPress).
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  12. #12
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Voilà ma solution, elle n'est pas très simple :

    Pour le comprendre :

    • MajMan est un SpeedButton qui, lorsqu'il est appuyé autorise la prise en compte de modification,
    • EditC est un boolean pour la saisie de la Cote (valeur numérique qui nous intéresse en colonne 3
    • En colonne 4 c'est la prise en compte d'une date, mais avec un filtre intégré,
    • La procédure met en jeu quatre évènements, la valeur sous forme de chaine est récupérée dans l'évènement "AffValsSetEditText", le filtre de saisie pour la Cote est "AffValsKeyPress" qui analyse la pertinence du nouveau caractère dans la chaîne.



    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
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    procedure TListeVals.AffValsSelectCell(Sender: TObject; ACol,
      ARow: Integer; var CanSelect: Boolean);
    { AffValsSelectCell est appelée en premier à l'entrée d'une cellule. Si on
     vient d'une autre cellule et qu'elle était en cours de saisie, on enregistre
     cette valeur dans la cellule précédente et on initialise ColE et RowE aux
     valeurs de la nouvelle cellule}
    var
      Rect: TRect;
    begin
      if MajMan.Down and ((Acol <> ColE) or (ARow <> RowE)) then
      begin
        if EditC then                                  {Prise en compte de la cote}
        begin
          ValPFs[RowE-1].Val.CoteF:= StrToFloat(TxtCote);
          EditC:= False;
          ColE:= ACol;
          RowE:= Arow;
        end;
        if EditD then                                  {Prise en compte de la date}
        begin
          ValPFs[RowE-1].Val.Date:= StringToDate(TxtDate, 'DD/MM/YYYY');
          EditC:= False;
          ColE:= ACol;
          RowE:= Arow;
        end;
      end;
      if not MajMan.Down or (ARow > 0) and ((ACol = 3) or (Acol = 4)) then
        CanSelect:= True
      else
      begin
        CanSelect:= False;
        AffVals.Options:= AffVals.Options-[goEditing];
      end;
    end;
     
    procedure TListeVals.AffValsGetEditMask(Sender: TObject; ACol,
      ARow: Integer; var Value: String);
    {Initialisation à l'entrée d'un cellule en mode d'édition}
    begin
      ColE:= ACol;
      RowE:= ARow;
      if (ARow > 0) and (ACol = 3) then
      begin
        TxtCote:= '';
        EditC:= True;
        EditD:= False;
      end;
      if (ARow > 0) and (ACol = 4) then
      begin
        Value:= '00\/00\/0000';                             {Masque pour les dates}
        TxtDate:= '';
        EditC:= False;
        EditD:= True;
      end;
    end;
     
    procedure TListeVals.AffValsKeyPress(Sender: TObject; var Key: char);
    {procedure de filtrage de valeur décimale :
     - la valeur ne peut commencer que par le signe '-' ou un chiffre,
     - tous les autres caractères ne peuvent être que numérique ou le séparateur
       décimal,
     - le séparateur décimal ne peut apparaître qu'une seule fois.}
    var
      i: Integer;
      SD: Boolean;
    begin
      if EditC then
      begin
        if TxtCote = '' then      {Si chaîne vide, on accepte que '0' à '9' et '-'}
          case Key of
       '0'..'9', '-':
          else
            key:=#0;
          end
        else
        begin
          if (Length(TxtCote) = 1) and (TxtCote[1] = '-') then
          begin   {Si le chaine ne comprend qu'un caractére et que ce soit '-' ...}
            case Key of       {..le deuxième caractère ne peut être qu'unn chiffre}
         #0 .. #31, '0'..'9':
            else
              key:=#0;
            end;
            Exit;
          end;
          for i:= 1 to Length(TxtCote) do
          begin  {Pour le reste de la chaîne, on ne peut avoir que des chiffres ..}
            SD:= False;                 {.. ou une seul fois le séparateur décimal}
            if TxtCote[i] = '.' then    {Test de la présence du séparateur décimal}
              SD:= True;
            if not SD then    {Si pas déjà de séparateur décimal, on l'accepte ...}
              case Key of
           #0 .. #31, '0'..'9', '.':
              else
                key:=#0;
              end
            else                                               {Sinon on le refuse}
              case Key of
           #0 .. #31, '0'..'9':
              else
                key:=#0;
              end;
          end;
        end;
      end;
    end;
     
    procedure TListeVals.AffValsSetEditText(Sender: TObject; ACol,
      ARow: Integer; const Value: String);
    {Selon la colonne, on récupère dans TxtCote ou TxtDate  la valeur de la chaîne
     en cours de frappe}
    begin
      if (ARow > 0) and ((ACol = 3) or (Acol = 4)) then
      begin
        if Acol = 3 then
        begin
          TxtCote:= Value;
          ModifMan:= True;
        end;
        if Acol = 4 then
        begin
          TxtDate:= Value;
          ModifMan:= True;
        end;
      end;
    end;
    Cordialement.

    Pierre

  13. #13
    Membre chevronné

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    En ce qui concerne le InplaceEditor, j'aurais une question : pourquoi tu n'utilises pas une TStringGrid au lieu d'une TDrawGrid ? Peut être que le inplaceEditor existe seulement dans la TStringGrid ....

    J'avoue ne pas utiliser Lazarus, et donc je ne peux pas tester ce que je dit. Cela m'étonne quand même que le InplaceEditor n'existe pas sous Lazarus ...

  14. #14
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par mick605 Voir le message
    ... pourquoi tu n'utilises pas une TStringGrid au lieu d'une TDrawGrid ?...
    Il y a plusieurs années, quand j'avais commencé à utiliser ce composant en DELPHI, il n'était pas possible d'avoir différents formatages de texte (couleur, alignement, taille) pour chaque cellule. Je m'étais fait un petit utilitaire pour ça. Peut-être que cela a changé, je n'ai pas regardé depuis.

    Citation Envoyé par mick605 Voir le message
    ... Cela m'étonne quand même que le InplaceEditor n'existe pas sous Lazarus ...
    Encore une fois, de mémoire, lorsque j'ai posé ce problème avec TDrawGrid, on m'avait proposé d'utiliser InPlaceEditor. Sous Windows avec DELPHI, j'ai essayé et ça a marché. Je suis passé à Lazarus et là : connaît pas ! En fouillant un peu, j'ai trouvé une propriété (protected je crois) qui renvoyait directement à un TWinControl alors que sous DELPHI, cela renvoit à un ancêtre de TEdit et ses propriétés d'édition. Je ne suis pas allé plus loin.

    Cordialement.

    Pierre.

  15. #15
    Membre expérimenté
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Points : 1 688
    Points
    1 688
    Par défaut
    Bonjour à tous

    Le TInplaceEditor existait sous Lazarus mais à la différence de Delphi, sa classe n'était pas published et donc inutilisable directement comme on peut le faire avec Delphi. Apparement, il a disparu de l'unité grids.pas .
    Il faudrait demander à Jesus Reyes le pourquoi du comment !

    Par contre, il est plus intéressant d'avoir une petite classe maison qui gère se genre de cas. C'est ce que j'ai fait sur une de mes applications.

    Cela permet de traiter un plus grand nombre d'editeurs intégrés comme l'ouverture d'une TForm contenant plusieurs objets en plus d'un TEdit,TComboBox,etc(Attention à la gestion des focus dans ce cas).

    La gestion du masque de saisie sera également plus fine et plus complète que le GetMaskEdit que je n'utilise pas non plus afin de rester maitre de mes formats d'affichage.

    Cordialement,
    Chris

  16. #16
    Membre chevronné

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Il y a plusieurs années, quand j'avais commencé à utiliser ce composant en DELPHI, il n'était pas possible d'avoir différents formatages de texte (couleur, alignement, taille) pour chaque cellule. Je m'étais fait un petit utilitaire pour ça. Peut-être que cela a changé, je n'ai pas regardé depuis.
    Ok. Dans tous les cas, j'ai l'habitude de travailler avec les OnDrawCell pour écrire ce que je veux comme je veux.

    Citation Envoyé par ChPr Voir le message
    Encore une fois, de mémoire, lorsque j'ai posé ce problème avec TDrawGrid, on m'avait proposé d'utiliser InPlaceEditor. Sous Windows avec DELPHI, j'ai essayé et ça a marché. Je suis passé à Lazarus et là : connaît pas ! En fouillant un peu, j'ai trouvé une propriété (protected je crois) qui renvoyait directement à un TWinControl alors que sous DELPHI, cela renvoit à un ancêtre de TEdit et ses propriétés d'édition. Je ne suis pas allé plus loin.

    Cordialement.

    Pierre.
    Donc, je maintiens l'idée d'utiliser un composant intermédiaire, un TEdit, que tu places sur ta cellule lors d'un clic ... C'est simple, rapide à faire, et ca te permet de tout gérer comme tu veux ! En plus, ca tient en une dizaine de lignes de code

    Bonne chance

  17. #17
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par mick605 Voir le message
    ... Donc, je maintiens l'idée d'utiliser un composant intermédiaire, un TEdit, que tu places sur ta cellule lors d'un clic ... C'est simple, rapide à faire, et ca te permet de tout gérer comme tu veux ! En plus, ca tient en une dizaine de lignes de code ...
    Ça m'avait paru super et j'avais commencé à le faire. Je me suis aperçu que lors du défilement des lignes, le TEdit mordait dans la ligne fixe, la gestion de l'entrée et la sortie n'était pas évidente. Au global, sa gestion n'était pas plus facile (voire plus complexe) que celle que j'ai mise en œuvre et décrite ci-avant. Par contre, la gestion interne du masque est plus efficace car on connaît la position du curseur, ce que je ne connaît pas par ma méthode. Faudra que je ré-essaie.

    Cordialement.

    Pierre

  18. #18
    Membre chevronné

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Tiens, je te sors le code que j'avais fait pour un programme : E c'est l'Edit, son parent est la StringGrid. A toi ensuite de gérer les évenements de l'Edit. Tu peux aussi agrandir le rectangle de 1 pixel pour recouvrir les bords de tes cases.

    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 TForm1.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var ACol, ARow : integer;
        R : TRect;
    begin
      E.Visible:=False;
     
      if ssDouble in Shift then
      begin
        StringGrid1.MouseToCell(X,Y,ACol,ARow);
        E.BoundsRect:=StringGrid1.CellRect(ACol,ARow);
        E.Text:=StringGrid1.Cells[ACol, ARow];
        E.Visible:=True;
        E.SetFocus;
        E.SelectAll;
      end;
    end;
    Lors des défilements, je pense qu'il est logique de sortir du mode Edition de la cellule, et donc masquer le Edit. La sortie du mode édition se fait via l'évenement OnExit du Edit. Dès que le Edit perd le focus, c'est que l'utilisateur "valide" son contenu.

  19. #19
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par mick605 Voir le message
    ... Lors des défilements, je pense qu'il est logique de sortir du mode Edition de la cellule, et donc masquer le Edit. La sortie du mode édition se fait via l'évenement OnExit du Edit. Dès que le Edit perd le focus, c'est que l'utilisateur "valide" son contenu.
    Merci pour le morceau de code. C'est à quelque chose près ce que j'avais écrit, sauf qu'avec un TDrawGrid comme parent, il n'y a pas de propriété "Cells".
    C'est la gestion du défilement, et autre sortie (affecter le contenu du TEdit à la case qu'on vient de quitter et non pas celle où on arrive --> mémorisation des Acol et ARow ... comme j'ai fait dans ma procédure) qui sont aussi compliqué, voire plus : gestion de défilement.

    Mais au-delà de ça, effectivement le TEdit me permettra de gérer plus finement mon masque de valeur.

    Cordialement.

    Pierre

  20. #20
    Membre chevronné

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par ChPr Voir le message
    Merci pour le morceau de code. C'est à quelque chose près ce que j'avais écrit, sauf qu'avec un TDrawGrid comme parent, il n'y a pas de propriété "Cells".
    Utilise une StringGrid, c'est identique a la drawGrid et ca permet en plus de stocker des chaines de caractères, ce que tu as l'air de vouloir faire.

    Citation Envoyé par ChPr Voir le message
    C'est la gestion du défilement, et autre sortie (affecter le contenu du TEdit à la case qu'on vient de quitter et non pas celle où on arrive --> mémorisation des Acol et ARow ... comme j'ai fait dans ma procédure) qui sont aussi compliqué, voire plus : gestion de défilement.
    Si vraiment ca te pose problème, tu n'es pas obligé de sauver la position du Edit. Tu peux t'en débrouiller en prenant la position du centre de l'Edit, et en utilisant MouseToCell ...

    Sinon, qu'entends tu par la "gestion des défilements" ? Le scroll avec les ascenseurs ?

Discussions similaires

  1. problème avec le passage en mode .EXE
    Par za3im_ensa dans le forum LabVIEW
    Réponses: 2
    Dernier message: 21/07/2011, 16h56
  2. Réponses: 0
    Dernier message: 20/12/2010, 15h54
  3. Problème avec Full-Screen Exclusive mode API
    Par SheikYerbouti dans le forum Composants
    Réponses: 2
    Dernier message: 08/02/2010, 06h49
  4. Problème avec l'Interface Graphique (mode Design)
    Par helico2 dans le forum C++/CLI
    Réponses: 1
    Dernier message: 20/05/2008, 21h10
  5. Réponses: 2
    Dernier message: 27/02/2007, 09h51

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