Copier certains lignes d'un stringgrid dans un autre

Résolu
gilore Messages postés 15 Date d'inscription mardi 27 juin 2006 Statut Membre Dernière intervention 26 novembre 2006 - 24 juil. 2006 à 07:33
gilore Messages postés 15 Date d'inscription mardi 27 juin 2006 Statut Membre Dernière intervention 26 novembre 2006 - 26 juil. 2006 à 00:36
bonjour

j'ai un stringgrid1 qui se charge grace à une BDD, j'aimerais selectionné certaines lignes de ce stringgrid1 dans un stringgrid2 pour générer ensuite les dites lignes dans un fichier word.
j'arrive à copier les dites lignes comme je le souhaite avec le code suivant :

StringGrid2.rows[arow] := StringGrid1.rows[arow]

le probleme, dans le stringgrid2, les lignes garde la meme position (arow) que dans la stringgrid1, conséquence des lignes vides dans la stringgrid2 quelqu'un peu t-il m'aider à résoudre ce problème...?

merci d'avance

Ps : j'espere que j'ai été claire...

11 réponses

ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
25 juil. 2006 à 12:07
Bonjour gilore,

Vu les erreurs dans ton code ci-dessus, je m'aperçois que tu ne maitrises pas bien les propriétés FixedRows et RowCount et les indices de lignes. Donc, si tu le permets, petit rappel :
l'indice de la première ligne (ou colonne) commence toujours à zéro.
Donc Rows[0] = la première ligne de ta grille.
RowCount renvoie le nombre de lignes. Si RowCount renvoie 5, ta dernière ligne a l'indice 4 (0,1,2,3,4 --> fait donc bien 5 lignes).
FixedRows détermine le nombre de lignes fixes. Si tu as FixedRows = 1, Row[0] te renvoie la première ligne, c.à.d. la ligne fixe !!! Pour commencer à la première ligne de données, il faut donc faire : for I:= 1 to RowCount-1    ou mieux for I:= FixedRows to RowCount-1.

Pour la solution à ton problème, difficile de te répondre pcq tu ne précises pas comment se fait la sélection (sélection avec souris ou d'après critères de valeur des cellules ?).
Voici en tout cas un exemple de code simplifié qui te permets d'ajouter dans stringgrid2 la ligne sélectionnée en appuyant sur la barre d'espacement. (donc dans stringgrid1.options, goEditing doit être à false !). Le nombre de lignes de données de StringGrid2 doit être = 1. Car on va toujours ajouter la ligne à la fin de la grille.

procedure TForm1.StringGrid1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
      if Key = VK_SPACE then   // c.à.d. la Key 32 (barre d'espace)
         with StringGrid2 do
         begin
              // on teste si la 1° cellule de la dernière ligne est vide
              // si elle n'est pas vide, on augmente le nb de lignes
              if Cells[FixedCols, RowCount-1] <> '' then
                   RowCount:= RowCount + 1;
              // on écrit la ligne en en cours de StringGrid1 (renvoyée par propriété Row)
              Rows[RowCount -1] := StringGrid1.Rows[StringGrid1.Row];
         end;
end;

Attention : ce n'est qu'un code simplifié, il ne t'empêchera pas, p.ex., de sélectionner plusieurs fois la même ligne ! C'est juste pour te montrer le principe.
Si tu veux passer en bloc une sélection multiple, n'hésite pas à reposer la question, mais précise bien les critères de sélection.

A +
Thierry
3
moldov Messages postés 165 Date d'inscription mercredi 8 octobre 2003 Statut Membre Dernière intervention 10 novembre 2008
24 juil. 2006 à 10:28
Salut gilore

Alors ce que tu peux faire c'est parcourir ton stringgrid1 et quand tu vois une ligne a ajouter dans l'autre tu l'ajoute avec un increment.
je m'explique car c'est peu être pas très clair.

itab1 -> 0
itab2 -> 0
Parcours du Stringgrid1 de itab1 -> 0 jusqu'a fin du stringgrid
    si Ligne a copier alors
        copier de la ligne du stringgrid1[itab1] dans Stringgrid2[itab2]
        itab2 +1

    enregistremenrt suivant itab1 +1

fin de boucle de parcours

Voila ca doit être plus clair maintenant.
Hésite pas si tu a des questions
Bonne Prog
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
24 juil. 2006 à 10:57
Salut gilore,

Voici une procedure que tu peux utiliser pour ajouter des lignes dans stringgrid2.

Il te faut une variable qui mémorise le nombre de lignes ajoutées (NbLines) que tu initialises à 0.
Contrôle de RowCount en fonction de NbLines et du nombre de lignes fixes.

procedure AjoutLigne(I: integer);
begin
   Inc(NBLines);
   with StringGrid2 do
   begin
          if (RowCount - FixedRows) < NbLines then
               RowCount:=  NbLines + FixedRows;
         Rows[NbLines + FixedRows -1] := StringGrid1.Rows[I];
   end;
end;

A +
Thierry 
0
gilore Messages postés 15 Date d'inscription mardi 27 juin 2006 Statut Membre Dernière intervention 26 novembre 2006
24 juil. 2006 à 23:30
tout d'abord merci d'avoir mais pour le premier message, j'ai rien compris... (Dsl)
et pour le second, j'ai essayé mais malheureusement il doit y avoir un souci car je n'arrive pas à obtenir le résultat escompté ... je vous met le code source
si quelqu'un a une idée... je suis preneur car la, je bloque .... les difficultés du débutant surement

procedure Tdestin.BitBtn1Click(Sender: TObject);
 var  I,NBlines:integer;
begin


   Inc(NBLines);


   with StringGrid2 do
   begin


        if (FixedRows - RowCount ) < NBLines then


        RowCount:=  NbLines + FixedRows;


        Rows[NbLines + FixedRows-1] := StringGrid1.Rows[I];


        end;

merci d'avance les amis
... Gilore
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
25 juil. 2006 à 05:48
Ben oui c'est normal que ca plante :

Procedure Tdestin.BitBtn1Click(Sender: TObject);
var I,NBlines:integer;
begin

//déja tu initialises ni la variable I, ni la variable NBLines.

Inc(NBLines);

with StringGrid2 do //Tu dois faire une boucle d'ou l'utilisation de Inc(NBLines) qui est équivalent à NBLines :=NBLines+1;
begin

if (FixedRows - RowCount ) < NBLines then

RowCount:= NbLines + FixedRows;

Rows[NbLines + FixedRows-1] := StringGrid1.Rows[I];

end;

ThWilliam t'a passé un code qui doit etre appelé en boucle. Mais à mon avis devrait pas répondre à ta demande.

Quand on est confronté à un probleme comme le tiens et qu'on trouve pas de solutions car on est pas assez bon, il faut utiliser des ruses de sioux : tu aurais pu tres bien faire une recherche de lignes vides dans ton StringGrid2 et les supprimer.
0
Utilisateur anonyme
25 juil. 2006 à 05:57
Allez séance d'exercices :

1)Tester le code suivant :

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
For i:=0 to (Listbox1.count-1) do
Begin
if listbox1.Items.Strings[i]<>'' then
listbox2.items.add(listbox1.Items.Strings[i]);
end;
end;

2)Appliquer ce code à un systeme de 2 StringGrid

3)Modifier ce code pour répondre exactement à ta demande.

Dans 10 min, je releve la copie .

@+ ;).
0
Utilisateur anonyme
25 juil. 2006 à 06:07
Ah oui : dans la ListBox1 rentre cette liste d'Items (les espaces ce n'est pas une erreur) (Rentrer les items : deposer 2 listbox. sélectionner listbox1 puis appuyer sur F11. Cliquer sur Items (TStrings). Magique une form apparait. Rentrer les items 1 par 1 : on passe à la ligne suivante par un appuye sur "Entrée". On valide le tout par un clique sur "OK". Point à la ligne.)

*Codes_Sources est fantastique
----> La c'est un espace : je le précise plus
*et le tutorial sur le guide du débutant delphiste

*est fantastique mais ce qui est encore mieux

*Ca sera dans tenir compte pour la prochaine fois
*La il y a plus d'espace : c'est pour voir si tu suis
*Attention il reste 1 min

*Top Moumoute, je releve la copie.

Question bonus : "Pourquoi on répond rarement aux questions sur les bases de données ?"

Réponse : car on a pas de bdd sous la main et cas chaque fois il faut s'en faire une : ce qui est long et gonflant.
0
gilore Messages postés 15 Date d'inscription mardi 27 juin 2006 Statut Membre Dernière intervention 26 novembre 2006
25 juil. 2006 à 08:26
bonjour,
j'essaye d'utiliser ton code mais malheureusement je n'arrive pas à mes fins.... peux tu me donner plus de précision au pauvre petit débutant que je suis ...
voila je code auquel j'arrive ... mais il ne se passe pas grande chose ...

procedure Tdestin.ajoutligne(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
 var  I,NBlines:integer;
begin


   Inc(NBLines);
   Inc(I) ;


   with StringGrid2 do


   begin


        For I:= 0 to (stringgrid1.Rowcount-1) do


        if (FixedRows - RowCount ) < NBLines then


        RowCount :=  NbLines + FixedRows-1;


        Rows[NbLines+ FixedRows-1 ] := StringGrid1.Rows[I];


        end;


end;

Merci d'avance....
0
Utilisateur anonyme
25 juil. 2006 à 13:49
Ah non ThWilliam, tu as fais l'exercice à sa place : je te mets 0/20. File dans ta chambre : ;).

@+ lol
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
25 juil. 2006 à 14:53
Mais m'sieur, je n'ai fait qu' donner un exemple pour 1 ligne sélectionnée !!! lol
A +
0
gilore Messages postés 15 Date d'inscription mardi 27 juin 2006 Statut Membre Dernière intervention 26 novembre 2006
26 juil. 2006 à 00:36
bonjour,


merci bcp pour ton aide, ca marche bien... maintenant plus qu'a inserer ca dans un fichier word ! ca va être tout une affaire ...


en tout ca merci encore


amicalement


Gilore


 


 


 
0
Rejoignez-nous