Copier certains lignes d'un stringgrid dans un autre [Résolu]

gilore 15 Messages postés mardi 27 juin 2006Date d'inscription 26 novembre 2006 Dernière intervention - 24 juil. 2006 à 07:33 - Dernière réponse : gilore 15 Messages postés mardi 27 juin 2006Date d'inscription 26 novembre 2006 Dernière intervention
- 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...
Afficher la suite 

11 réponses

Répondre au sujet
ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention - 25 juil. 2006 à 12:07
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ThWilliam
moldov 168 Messages postés mercredi 8 octobre 2003Date d'inscription 10 novembre 2008 Dernière intervention - 24 juil. 2006 à 10:28
0
Utile
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
Commenter la réponse de moldov
ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention - 24 juil. 2006 à 10:57
0
Utile
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 
Commenter la réponse de ThWilliam
gilore 15 Messages postés mardi 27 juin 2006Date d'inscription 26 novembre 2006 Dernière intervention - 24 juil. 2006 à 23:30
0
Utile
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
Commenter la réponse de gilore
Utilisateur anonyme - 25 juil. 2006 à 05:48
0
Utile
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.
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 25 juil. 2006 à 05:57
0
Utile
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 .

@+ ;).
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 25 juil. 2006 à 06:07
0
Utile
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.
Commenter la réponse de Utilisateur anonyme
gilore 15 Messages postés mardi 27 juin 2006Date d'inscription 26 novembre 2006 Dernière intervention - 25 juil. 2006 à 08:26
0
Utile
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....
Commenter la réponse de gilore
Utilisateur anonyme - 25 juil. 2006 à 13:49
0
Utile
Ah non ThWilliam, tu as fais l'exercice à sa place : je te mets 0/20. File dans ta chambre : ;).

@+ lol
Commenter la réponse de Utilisateur anonyme
ThWilliam 424 Messages postés mardi 3 janvier 2006Date d'inscription 26 novembre 2013 Dernière intervention - 25 juil. 2006 à 14:53
0
Utile
Mais m'sieur, je n'ai fait qu' donner un exemple pour 1 ligne sélectionnée !!! lol
A +
Commenter la réponse de ThWilliam
gilore 15 Messages postés mardi 27 juin 2006Date d'inscription 26 novembre 2006 Dernière intervention - 26 juil. 2006 à 00:36
0
Utile
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


 


 


 
Commenter la réponse de gilore

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.