J'ai un TStringGrid, et je veux supprimer la ligne sélectionnée. Des choses de base que j'ai essayé de supprimer uniquement la dernier ligne. Comment puis-je supprimer une arbitraires ligne?
Si le code que vous avez essayé seulement supprime la dernière ligne, alors vous êtes probablement juste de la décrémentation de la RowCount de la propriété. Que, de fait, toujours fait ses modifications sur le fin de la liste des lignes. Avec cela à l'esprit, vous pouvez écrire du code pour s'assurer que la ligne vous ne voulez plus est celui à la fin, et puis supprimer la dernière ligne. (La façon la plus directe serait de déplacer la ligne, et il y a un MoveRow méthode, mais il est protégé. Si vous souhaitez appeler protégé méthodes, cependant, vous pouvez tout aussi bien appeler DeleteRow à la place.)
En utilisant uniquement des publics et publiés membres, il est possible d'écrire une boucle qui supprime un arbitraire ligne. Pour exemple, voici un code inspiré par Scalabium du Logiciel FAQ sur ce sujet:
procedure DeleteRow(Grid: TStringGrid; ARow: Integer);var
i: Integer;beginfor i := ARow to Grid.RowCount -2do
Grid.Rows[i].Assign(Grid.Rows[i +1]);
Grid.RowCount := Grid.RowCount -1;end;
Il copie le contenu de chaque ligne ci-dessous celui que vous souhaitez supprimer dans la ligne au-dessus. À la fin de la boucle, la ligne que vous souhaitez supprimer a été remplacé (par la ligne immédiatement au-dessous) et il y a deux copies de la dernière rangée. Ensuite, il supprime simplement la ligne finale.
Pour supprimer la ligne courante de la grille, appeler la fonction comme ceci:
DeleteRow(Grid, Grid.Row);
Pour ajouter, si vous avez besoin seulement d'objets (comme moi, dynamiquement des données de dessin dans les cellules de l'objet au lieu de le contenu de la cellule), puis remplacer la deuxième ligne avec Grid.Objects[0, I]:= Grid.Objects[0, I + 1];. C'est un peu plus rapide que le remplacement de la totalité du contenu qui ne sont même pas en cours d'utilisation.
La ligne sélectionnée de la grille est donnée par son Row propriété.
TCustomGrid a un DeleteRow méthode, mais il est protégé, de sorte que vous ne pouvez pas appeler à l'exception de l'intérieur des descendants de cette classe. Il est facile de contourner cette restriction. Déclarer un TCustomGrid descendant, puis tapez-cast votre grille de contrôle de ce nouveau type. Appel DeleteRow sur le résultat.
type
TCustomGridAccess = class(TCustomGrid)end;procedure DeleteGridRow(g: TCustomGrid; row: Integer);begin
TCustomGridAccess(g).DeleteRow(row);end;
Cela fonctionne parce que dans Delphi, les membres de la protection de visibilité sont implicitement public au sein de la même unité que la déclaration de la classe. Bien que TCustomGrid est déclarée dans le Grilles unité, notre TCustomGridAccess classe est déclarée dans votre de l'unité, de sorte que votre unité a accès à tous ses protégés méthodes, y compris DeleteRow.
Si votre Delphi version est assez nouveau, alors vous pouvez utiliser un classe helper. Classe les accompagnateurs peuvent accéder à des membres protégés et ne nécessite pas de conversion de type technique sans rapport avec les types.
type
TCustomGridHelper = class helper for TCustomGrid
public
procedure DelRow(ARow: Integer);end;procedure TCustomGridHelper.DelRow(ARow: Integer);beginSelf.DeleteRow(ARow);end;
Ensuite, il suffit d'utiliser l'appareil dans des endroits où vous avez déclaré que le helper. Tout descendant de TCustomGrid aura automatiquement une DelRow méthode, vous pouvez l'appeler comme toute autre méthode de la grille
Si le code que vous avez essayé seulement supprime la dernière ligne, alors vous êtes probablement juste de la décrémentation de la
RowCount
de la propriété. Que, de fait, toujours fait ses modifications sur le fin de la liste des lignes. Avec cela à l'esprit, vous pouvez écrire du code pour s'assurer que la ligne vous ne voulez plus est celui à la fin, et puis supprimer la dernière ligne. (La façon la plus directe serait de déplacer la ligne, et il y a unMoveRow
méthode, mais il est protégé. Si vous souhaitez appeler protégé méthodes, cependant, vous pouvez tout aussi bien appelerDeleteRow
à la place.)En utilisant uniquement des publics et publiés membres, il est possible d'écrire une boucle qui supprime un arbitraire ligne. Pour exemple, voici un code inspiré par Scalabium du Logiciel FAQ sur ce sujet:
Il copie le contenu de chaque ligne ci-dessous celui que vous souhaitez supprimer dans la ligne au-dessus. À la fin de la boucle, la ligne que vous souhaitez supprimer a été remplacé (par la ligne immédiatement au-dessous) et il y a deux copies de la dernière rangée. Ensuite, il supprime simplement la ligne finale.
Pour supprimer la ligne courante de la grille, appeler la fonction comme ceci:
Grid.Objects[0, I]:= Grid.Objects[0, I + 1];
. C'est un peu plus rapide que le remplacement de la totalité du contenu qui ne sont même pas en cours d'utilisation.OriginalL'auteur Rob Kennedy
La ligne sélectionnée de la grille est donnée par son
Row
propriété.TCustomGrid
a unDeleteRow
méthode, mais il est protégé, de sorte que vous ne pouvez pas appeler à l'exception de l'intérieur des descendants de cette classe. Il est facile de contourner cette restriction. Déclarer unTCustomGrid
descendant, puis tapez-cast votre grille de contrôle de ce nouveau type. AppelDeleteRow
sur le résultat.Cela fonctionne parce que dans Delphi, les membres de la protection de visibilité sont implicitement public au sein de la même unité que la déclaration de la classe. Bien que
TCustomGrid
est déclarée dans le Grilles unité, notreTCustomGridAccess
classe est déclarée dans votre de l'unité, de sorte que votre unité a accès à tous ses protégés méthodes, y comprisDeleteRow
.Si votre Delphi version est assez nouveau, alors vous pouvez utiliser un classe helper. Classe les accompagnateurs peuvent accéder à des membres protégés et ne nécessite pas de conversion de type technique sans rapport avec les types.
Ensuite, il suffit d'utiliser l'appareil dans des endroits où vous avez déclaré que le helper. Tout descendant de
TCustomGrid
aura automatiquement uneDelRow
méthode, vous pouvez l'appeler comme toute autre méthode de la grilleOriginalL'auteur Rob Kennedy