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 :

DBGrid , empêcher une cellule d'être modifiée


Sujet :

Composants VCL Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 046
    Points : 40 962
    Points
    40 962
    Billets dans le blog
    62
    Par défaut DBGrid , empêcher une cellule d'être modifiée
    Bonjour,

    Je voudrais empêcher la modification d'une cellule en fonction d'une autre valeur . Par exemple , ma base de données contient 3 dates ces dates ne sont modifiables que dans les 24 heures suivant leur saisie !

    Table
    CLE,
    ....
    DATE_DEPART,
    DATE_DEPART2,
    DATE_DEPART3,
    DATE1TIMESTAMP, // date de saisie de la date1 (D1) géré par trigger
    DATE2TIMESTAMP, // " " " date2 (D2) " " "
    DATE3TIMESTAMP // " " " date3 (D3) " " "
    Ce n'est pas forcément la meilleure structure de table , mais il s'agit d'une modification sur de l'existant et bien entendu pour hier !


    pour ce faire j'ai utiliser l'évènement onColEnter

    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
    procedure TMain.SMDBGrid1ColEnter(Sender: TObject);
    var DateSaisie,Delay : TDateTime;
     function Delai(DateField : TField) : TDateTime;
     begin
       if DateField.IsNull then Result:=IncDay(Now)
       else Result:=IncDay(DateField.AsDateTime);
       case DayOfTheWeek(Result) of
         6 : result:=IncDay(Result,2);  // samedi -> lundi
         7 : result:=IncDay(Result);    // dimanche -> lundi
       end;
     end;
     
    begin
     
    if SMDBGrid1.SelectedField=ZQ.FieldByName('DATE_DEPART') then
     begin
       delay:=Delai(ZQ.FieldByName('D1'));
       SMDBGrid1.SelectedField.ReadOnly:= (now>delay);
     end;
    if SMDBGrid1.SelectedField=ZQ.FieldByName('DATE_DEPART2') then
     begin
       delay:=Delai(ZQ.FieldByName('D2'));
       SMDBGrid1.SelectedField.ReadOnly:=(now>delay);
     end;
    if SMDBGrid1.SelectedField=ZQ.FieldByName('DATE_DEPART3') then
     begin
       delay:=Delai(ZQ.FieldByName('D3'));
       SMDBGrid1.SelectedField.ReadOnly:= (now>delay);
     end;
    end;
    cependant si ce code est correct , une problématique se pose si je change de ligne sans changer de colonne
    (Oui ! il s'agit en fait d'une SMDBGrid , mais je ne pense pas que cela ait un impact)

    Question : Quel serait le bon évènement ? le OnSelectCell serait bien sur le meiux mais n'existe pas dans la DBGrid ni SMDBGrid du coup
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 62
    Points : 61
    Points
    61
    Par défaut Interdir la modification d'une cellule de DGRID en comparaison à une autre chaine
    Bonjour, SergioMaster,
    j'ai créé un compos en 10 minute dérivé de DBRID en lui ajoutant la propriété OnSelectCell. Si le code vous intéresse je le poste sur ce forum.
    J'ai fait un test ça fonctionne très bien.

    Nom : Editer cellule.jpg
Affichages : 418
Taille : 62,6 Ko
    Nom : Editer cellule2.jpg
Affichages : 425
Taille : 178,0 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.MayDBGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    begin
    label1.Caption := Maydbgrid1.Columns[2].Field.Value;
    // comparaison de chaine
    if label1.Caption ='Bakour' then
    // options DBGrid
    MayDBGrid1.options :=  MayDBGrid1.options  -  [dgediting]
    else
    MayDBGrid1.options :=  MayDBGrid1.options  +  [dgediting];
    end;
    A+

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 046
    Points : 40 962
    Points
    40 962
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Effectivement , j'ai bien pensé a une classe dérivée par contre je n'avais pas pensé à changer carrément l'option de la grille plutôt que de la cellule (radical comme technique ) . Une demande plus urgente étant tombée entre-temps , j'ai laissé en plan ce problème , reporté à la semaine prochaine
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 046
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 046
    Points : 40 962
    Points
    40 962
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Finalement j'ai résolu mon problème en utilisant l'évènement OnDrawColumnCell (que j'utilisais déjà pour d'autres spécificités d'affichage) et en jouant sur la propriété readonly du champ comme indiqué dans le premier post

    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
     
    procedure TMain.SMDBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    var DrawRect: TRect;
        Delay : TDateTime;
        function Delai(DateField : TField) : TDateTime;
         begin
           if DateField.IsNull then Result:=IncDay(Now)
           else Result:=IncDay(DateField.AsDateTime);
           case DayOfTheWeek(Result) of
             6 : result:=IncDay(Result,2);  // samedi -> lundi
             7 : result:=IncDay(Result);    // dimanche -> lundi
           end;
         end;
     
    begin
    .....
      if (Column.Field.FieldNo in [14,21,22]) AND (gdFocused in State) then  // mes 3 dates "blocables"
        begin
         case Column.Field.FieldNo of
            14 : begin
                   delay:=Delai(ZQ.FieldByName('D1'));
                   SMDBGrid1.SelectedField.ReadOnly:= (now>delay);
                 end;
            21 : begin
                   delay:=Delai(ZQ.FieldByName('D3'));
                   SMDBGrid1.SelectedField.ReadOnly:= (now>delay);
                 end;
            22 : begin
                   delay:=Delai(ZQ.FieldByName('D3'));
                   SMDBGrid1.SelectedField.ReadOnly:= (now>delay);
                 end;
         end;
        end;
    ....
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

Discussions similaires

  1. [XL-2007] Savoir si une cellule est en train d'être modifiée
    Par ghosty04 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/03/2010, 18h25
  2. Réponses: 8
    Dernier message: 19/02/2010, 12h52
  3. [XL-2003] Comment savoir si une cellule a été modifiée
    Par Line dans le forum Excel
    Réponses: 4
    Dernier message: 08/08/2009, 19h49
  4. Réponses: 11
    Dernier message: 16/06/2008, 10h36

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