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 :

Ecrire dans cellules d'un DBGrid ??


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier Avatar de EssaiEncore
    Inscrit en
    Janvier 2005
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 144
    Points : 74
    Points
    74
    Par défaut Ecrire dans cellules d'un DBGrid ??
    Bonjour,

    Je voudrais ecrire dans une cellule de mon DBgrid mais il me renvoit une erreur " Impossible d'ecrire, vous n'etes pas en mode insertion ou modification"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DBGrid_suivi.Fields[0].text := '***';
    ou
    DBGrid_suivi.Fields[1].AsString := '***';
    Merci d'avance

  2. #2
    Membre averti
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Points : 439
    Points
    439
    Par défaut
    dans les propriétés de ton dbGRID n'es tu pas en ReadOnly
    Sinon regarde les propriétes de ta table ou Query
    De plus avanrt de poster precise ce que tu utilise (BDE,Firebird...) ca nous aideras

  3. #3
    Membre régulier Avatar de EssaiEncore
    Inscrit en
    Janvier 2005
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 144
    Points : 74
    Points
    74
    Par défaut
    Merci de ton aide

    je voudrais seulement ecrire dans la cellule et non pas modifier le contenu dans ma table.
    Seulement empecher qu'un utilisateur n'ayant pas les droit ne puisse pas voir le contenu de la cellule.
    S'il a pas les droit alors meetre **** a la place sinon laisser la valeur.
    J'ai vérifié pour la propriété ReadOnly... elle est bien a false.

  4. #4
    Membre averti
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Points : 439
    Points
    439
    Par défaut
    dans ce cas la je ne sais pas faire désolé c'est une question interessante mais je crois que le DBGrid est directement lié a la table donc si tu modifie une cellule tu modifie la table je vais quand meme effectué une petite recherche pour toi

  5. #5
    Membre régulier Avatar de EssaiEncore
    Inscrit en
    Janvier 2005
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 144
    Points : 74
    Points
    74
    Par défaut
    lol merci bien ...
    moi aussi, je cherche encore et toujours...
    Autrement tu as peut etre une autre idée pour faire qu'un utilisateur n'ayant pas les droits ne puisse pas voir une ligne.
    Cacher la ligne ==> parait qu'on peut pas avec un DBGrid ???
    Ecrire sur les valeur ...

    Si tu as une idée....

    Merci encore

  6. #6
    Membre habitué Avatar de Guile
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Avril 2002
    Messages : 130
    Points : 144
    Points
    144
    Par défaut
    En effet, le DBGrid est liée à son datasource donc si tu essaies de modifier le contenu d'une cellule, il considère que tu veux modifier ta table (d'ou l'erreur pas em mode edition ou insertion vu que tu n'as certainement pas fait de Table.edit ou Table.Insert)

    Dans ton cas, je te conseille de créer un champs calculé dans ta table et d'ajouter dans l'evenement OnCalcFields un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if not ChampsVisible then
      MaTable.FieldByName('MonChampCalculé').AsString := '***'
    else
      MaTable.FieldByName('MonChampCalculé').AsString := MaTable.FieldByName('MonChamp').AsString;
    Il existe 10 sortes de personnes, ceux qui comprennent le binaire et les autres...

  7. #7
    Membre averti
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Points : 439
    Points
    439
    Par défaut
    tu filtre avant le tableau dans la table, tu cree deux tables, une pour utilisateur ayant les droits avec un select * from .... et une autre avec un SELECT Champ1,Champ3 FROM ....

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 265
    Points : 290
    Points
    290
    Par défaut
    Salut

    Tu peux utiliser l'événement TField.OnGetText (sender: TField;var text: string; displaytext: boolean).

    dans le corps de l'événement tu peux faire Text := '***'.

    @+

  9. #9
    Membre régulier Avatar de EssaiEncore
    Inscrit en
    Janvier 2005
    Messages
    144
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 144
    Points : 74
    Points
    74
    Par défaut
    Merci a tous

    Guile : jene peut faire cela car je veut que TOUS les enregistrement de la ligne soit de la forme **** si l'utilisateur n'a pas de droit.

    jmjmjm : C'est une bonne idée, malheureusement je ne peut modifier ma requete car elle mes info sont stocké sous 2 base differentes.donc 2 databaseName sous delphi....et sur l'avis de mes collegues on ne peut créer une requete portant sur 2 databaseName.

    Zatoobux : désolé jai pas tout compris L'evenement se trouve ou ?

    Merci

  10. #10
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    Salut EssaiEncore,

    Sur le principe les solutions proposées par Guile et Zatoobux sont proches. J'allais te suggérer ce que t'a proposé Zatoobux, car je crois que c'est ce qu'il y a de mieux à faire dans ton cas.

    Petite explication donc : tu oublies ton envie de travailler avec le DBGrid directement (ce qui sur le principe n'est pas terrible de toute façon), et tu vas dans l'éditeur de champ de ton dataset (double-clic sur la table ou la requete), tu assignes à chaque TField l'évènement OnGetText (le meme pour tous ? ce doit être faisable).

    Dans cet evenement, en fonction de tes critères d'affichage, tu revois la valeur normale du champ ou bien tes '***'.

    Bon dev'
    « La simplicité est la sophistication suprême » (Léonard de Vinci)

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 265
    Points : 290
    Points
    290
    Par défaut
    re,

    Pour masquer toutes les lignes tu peux faire un truc du genre :

    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
    Procedure TMaForm.AffecteLesOnGetText (monGrid: TDBGrid);
    var
      i: integer;
    begin
      for i := 0 to pred(MonGrid.Datasource.dataset.Fields.count) do
        MonGrid.Datasource.dataset.Fields[i].OnGetText := MonGetText;
    end;
     
    procedure TMaForm.MonGetText (Sender: TField; var Text: String; DisplayText: Boolean);
    begin
       if MasquerLinge  (sender.dataset.Fields) then
         Text := '*****';
    end;
     
    function TMaForm.MasquerLigne (Fields: TFields): boolean;
    begin
       result := Fields.FieldByName ('FldMangeDesCacahutes').asBoolean = false;
    end;
    A l'initialisation (formshow ou autre) tu appelles AffecteLesOnGetText.
    Dans masquerligne tu fais ce que tu veux dans l'exemple le Grid pointe sur une table des personnes avec une colonne "fldMangeDesCacahuetes" de type booleen. Donc ici les lignes des personnes qui ne mangent pas de cacahuetes seront masquées.

    @+

    PS : il y avait une erreur dans AffecteLesOnGetText :
    MonGrid.Datasource.dataset.Fields[i].OnGetText := MonGetText;
    Il manqué le [i]...

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 40
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    moi je surchargerai la methode de dessin de la DBgrid, lorsque l'utilisateur n'a pas le droit de la voir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
    WITH DBGrid1.Canvas do
      begin
      fillrect(Rect); // efface la cellule
      textrect(Rect,Rect.Left+2,Rect.Top+2,'*****');//eventuellement ecrire
      end;
    end;

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 265
    Points : 290
    Points
    290
    Par défaut
    re,

    Oui Ocean c'est une solution mais j'utilise le OnGetText car
    - dans les impressions
    - les copiés / collés
    - les exports (html,xls...)
    depuis le jeux de données utilisé par le grid les lignes sont masqués sans ne rien re-ecrire.

    Par contre le OnGetText n'est pas utilisé pour l'affichage des champs blob dans le grid... Donc les blobs ne sont pas masqués...

    @+

Discussions similaires

  1. [POI] Ecrire dans cellules fusionnees
    Par turie dans le forum API standards et tierces
    Réponses: 0
    Dernier message: 17/02/2010, 10h14
  2. Ecrire dans cellule tableur application active
    Par LDFD14 dans le forum LabVIEW
    Réponses: 0
    Dernier message: 06/06/2008, 16h39
  3. [VBA] ecrire dans cellules filtrées
    Par Yannv dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 29/10/2007, 20h43
  4. [D7][DBGrid] Texte dans cellule particulière
    Par moulette85 dans le forum Bases de données
    Réponses: 3
    Dernier message: 28/04/2005, 17h49
  5. Réponses: 4
    Dernier message: 15/04/2005, 15h25

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