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

 Delphi Discussion :

Ajout données stringgrid via bouton


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 61
    Points
    61
    Par défaut Ajout données stringgrid via bouton
    Bonjour,

    Je cherche à compléter un stringgrid via un bouton.

    Je m'explique :
    Via deux TEdit (nom et prénom), je désire en cliquant sur un bouton Valider inscrire le nom dans la colonne 0 ligne 1 et le prénom dans la colonne 0 ligne 1.

    J'ai déclaré deux integer (ligne et colonne) que j'incréméente, mais je dois louper quelquechose, car cela ne fonctionne pas.

    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 TListe.ValidClick(Sender: TObject);
    var colonne : integer;
    var ligne : integer;
     
    begin
     
    begin
    ligne := 0  ;
    colonne :=0 ;
     
    with stringgrid1 do
    stringgrid1.Cells[colonne,ligne+1]:= champnom.text;
    stringgrid1.Cells[colonne+1,ligne+1]:= champprenom.text;
     
    end;
    end;
    Je pense qu'il est possible ensuite de sauvegarder cette liste dans un fichier, et de la réexploiter dans ma stringgrid, mais quand est il si je veux rajouter une entrée? La nouvelle entrée va-t-elle se placer à la suite des autres ou dois-je déclarer une variable qui mémorise la dernière ligne ?

    Merci de vos réponses.

  2. #2
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Bonjour,

    Alors, déjà, ton code ne fonctionnera pas car tu initialises toujours tes variables ligne et colonne à 0 avant de faire quoi que ce soit.
    Ces deux variables doivent donc être globales et non locales
    De plus, un seul mot clé var est nécessaire pour déclarer des variables locales

    Enfin, si tu utilises le mot clé with, inutile de de mettre le nom du composant à chaque fois...

    Ca doit donner ça au final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TListe.ValidClick(Sender: TObject);
    //var 
    //colonne : integer; à mettre en globale
    //ligne : integer; à mettre en globale
    begin
      //ligne := 0  ; initialisation à faire ailleurs (le OnCreate par exemple)
      //colonne :=0 ; initialisation à faire ailleurs (le OnCreate par exemple)
      with stringgrid1 do
        Cells[colonne,ligne+1]:= champnom.text;
        Cells[colonne+1,ligne+1]:= champprenom.text;
      end;
    end;
    Voilà, en espérant t'avoir aidé
    A+

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 61
    Points
    61
    Par défaut
    merci ero pour ta réponse rapide.

    voici mon code :


    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
    unit Listeeleves;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Grids;
     
    type
      TListe = class(TForm)
        Ajouteleve: TButton;
        Button2: TButton;
        Ajout: TGroupBox;
        Nomeleve: TLabel;
        Champnom: TEdit;
        Prenom: TLabel;
        Champprenom: TEdit;
        Valid: TButton;
        Edit1: TEdit;
        Listingclasse: TStringGrid;
        procedure AjouteleveClick(Sender: TObject);
        procedure ValidClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
     
       private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
     Liste: TListe;
     identite : string;
     colonne : integer;
     ligne : integer;
     
    implementation
     
    {$R *.dfm}
     
     
    procedure TListe.FormCreate(Sender: TObject);
    begin
    ligne := 0  ;
    colonne :=0 ;
    Listingclasse.Cells [0,0] := 'Nom';
    Listingclasse.Cells [1,0] := 'Prénom';
    end;
     
     
    procedure TListe.AjouteleveClick(Sender: TObject);
    begin
    ajout.Visible := true;
     
    end;
     
     
    procedure TListe.ValidClick(Sender: TObject);
    begin
    with Listingclasse do
    Listingclasse.Cells[colonne,ligne+1]:= champnom.text;
    Listingclasse.Cells[colonne+1,ligne+1]:= champprenom.text;
     
    end;
     
    end.
    Je pense avoir raté un truc dans ta réponse car le résultat est le même, et les données nouvellement entrées se réécrivent sur la première ligne.

    Je persiste quand même, et essaye de trouver en attendant une aide !

    merci

  4. #4
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Re,

    La procédure lors du clic sur le bouton Valider devrait ressembler à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TListe.ValidClick(Sender: TObject);
    begin
      ligne := ligne +1; 
      with Listingclasse do
        Cells[colonne,ligne]    := champnom.text;
        Cells[colonne+1,ligne]:= champprenom.text;
      end;
    end;
    J'ai rajouté la ligne ligne := ligne + 1; car sinon tu restais toujours sur la même ligne pour le prochain enregistrement...
    J'ai également encadré le with par un begin end car comme je te l'ai dit tout à l'heure, avec le with, tu n'as plus besoin de reprendre l'objet Listingclasse ...

    Voilà, j'espère que ça sera bon ce coup-ci!
    A+

  5. #5
    Membre confirmé
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2008
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 666
    Points : 643
    Points
    643
    Par défaut
    salut à toutes et à tous,
    une autre solution, c'est d'écrire une procédure qui ajoute une ligne à une grille. il y a un problème qu'il doit y avoir au moins une cellule de données, tu ne peux pas régler le "RowCount" à zéro.
    voici le code qui permet d'ajouter tes données à "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
    procedure AddRowToGrid(Grid: TStringGrid; Data: array of string);
    var
     i: integer;
     FirstRowIsEmpty: boolean;
    begin
     // nous vérifions si la première ligne est vide
     FirstRowIsEmpty := true;
    for i := Grid.FixedCols to Grid.ColCount - 1 do
      if Grid.Cells[i, Grid.FixedRows] <> '' then begin
         FirstRowIsEmpty := false;
         break;
        end;
     
     // si elle n'est pas vide, alors on ajoute une nouvelle ligne
     if not FirstRowIsEmpty then
       Grid.RowCount := Grid.RowCount + 1;
     
     // copier les données de la dernière ligne
     for i := 0 to Grid.ColCount - Grid.FixedCols - 1 do begin
       if i > High(Data) then
         Grid.Cells[Grid.FixedCols + i, Grid.RowCount - 1] := ''
       else
         Grid.Cells[Grid.FixedCols + i, Grid.RowCount - 1] := Data[i];
     end;
    end;
    ensuite pour appeler cette procédure, tu peux procéder comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    AddRowToGrid(StringGrid1, [Edit1.Text, Edit2.Text]);
    end;
    a+

    NABIL74

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 61
    Points
    61
    Par défaut
    Merci ero!

    Ca fonctionne.

    Est-il possible de faire l'inverse? D'enlever une entrée dans la liste?

    faut il passer par une comparaison de chaines de caractères?

  7. #7
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Citation Envoyé par breizh44 Voir le message
    Merci ero!

    Ca fonctionne.
    De rien

    Citation Envoyé par breizh44 Voir le message
    Est-il possible de faire l'inverse? D'enlever une entrée dans la liste?

    faut il passer par une comparaison de chaines de caractères?
    Qu'entends tu par enlever une entrée ?
    Tu veux dire supprimer une ligne du TStringGrid ?

    Si oui, suffit de faire un décalage ...

    Par exemple, tu déclares dans la partie publique la procédure supprimerLigne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure supprimerLigne(monStringGrid: TStringGrid; ligne: integer);
    Et tu l'utilises ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.supprimerLigne(monStringGrid: TStringGrid; ligne: integer);
    var
      i:integer;
    begin
      for i:= ligne to monStringGrid.RowCount-2 do
      begin
        monStringGrid.Cells[0,i]:= monStringGrid.Cells[0,i+1];
        monStringGrid.Cells[1,i]:= monStringGrid.Cells[1,i+1];
      end;
    end;
    Enfin, pour l'appeler :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.Button2Click(Sender : TObject);
    begin
      supprimerLigne(StringGrid1,2);
    end;
    Certains me dirons que l'on peut faire plus performant, mais le but, c'est déjà d'expliquer les bases

    A+

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Février 2008
    Messages : 108
    Points : 61
    Points
    61
    Par défaut
    merci beaucoup de votre aide!

    Faut bien commencer un jour!

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

Discussions similaires

  1. Ajout Nouvel exercice via bouton
    Par jackborogar dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 25/06/2012, 09h43
  2. Ajout des données à BD via Hibernate
    Par mamadou_76 dans le forum Hibernate
    Réponses: 2
    Dernier message: 22/05/2007, 08h48
  3. Ajouter objet dynamiquement via un bouton
    Par maxjaco dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 23/06/2006, 16h39
  4. [MySQL] problème ajout donnée dans BDD via php
    Par Skeud007 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 29/05/2006, 23h41
  5. Réponses: 2
    Dernier message: 15/06/2005, 23h56

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