17 votes

Comment supprimer une ligne de TStringGrid ?

J'ai une TStringGrid, et je veux supprimer la ligne sélectionnée. Les méthodes de base que j'ai essayées ne suppriment que la ligne dernier rang. Comment supprimer une ligne arbitraire ?

18voto

Rob Kennedy Points 107381

Si le code que vous avez essayé ne supprime que la dernière ligne, alors vous ne faites probablement que décrémenter la valeur de la ligne. RowCount propriété. Cela fait en effet toujours ses modifications sur le fin de la liste des lignes. En gardant cela à l'esprit, vous pourriez écrire du code pour vous assurer que la ligne que vous ne voulez plus est celle qui se trouve à la fin, et entonces supprimer la dernière ligne. (Le moyen le plus direct serait de déplacer la rangée, et il y a un MoveRow mais elle est protégée. Cependant, si vous souhaitez appeler des méthodes protégées, vous pouvez tout aussi bien vous contenter de appelez DeleteRow à la place).

En utilisant uniquement les membres publics et publiés, il est possible d'écrire une boucle qui supprime une ligne arbitraire. Par exemple, voici du code inspiré de La FAQ de Scalabium Software sur ce sujet :

procedure DeleteRow(Grid: TStringGrid; ARow: Integer);
var
  i: Integer;
begin
  for i := ARow to Grid.RowCount - 2 do
    Grid.Rows[i].Assign(Grid.Rows[i + 1]);
  Grid.RowCount := Grid.RowCount - 1;
end;

Il copie le contenu de chaque ligne en dessous de celui que vous souhaitez supprimer dans la ligne ci-dessus. À la fin de la boucle, la ligne que vous souhaitez supprimer a été écrasée (par la ligne immédiatement inférieure) et il existe deux copies de la dernière ligne. Il suffit alors de supprimer la dernière ligne.

Pour supprimer la ligne actuelle de la grille, appelez la fonction comme ceci :

DeleteRow(Grid, Grid.Row);

10voto

Rob Kennedy Points 107381

La rangée sélectionnée de la grille est donnée par son Row propriété.

TCustomGrid a un DeleteRow mais elle est protégée, de sorte que vous ne pouvez l'appeler que depuis les descendants de cette classe. Il est cependant facile de contourner cette restriction. Déclarez un TCustomGrid descendant, et ensuite le type-cast de votre contrôle de grille à ce nouveau type. Appelez 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 avec une visibilité protégée sont implicitement public dans la même unité que la déclaration de la classe. Bien que TCustomGrid est déclaré dans le Grilles unité, notre TCustomGridAccess est déclarée dans votre de sorte que votre unité a accès à toutes ses méthodes protégées, y compris DeleteRow .


Si votre version de Delphi est suffisamment récente, vous pouvez alors utiliser un fichier aide de classe . Les aides de classe peuvent accéder aux membres protégés et ne nécessitent pas de conversion de type pour des types techniquement non liés.

type
  TCustomGridHelper = class helper for TCustomGrid
  public
    procedure DelRow(ARow: Integer);
  end;

procedure TCustomGridHelper.DelRow(ARow: Integer);
begin
  Self.DeleteRow(ARow);
end;

Ensuite, il suffit d'utiliser l'unité où vous avez déclaré l'aide. Tout descendant de TCustomGrid aura automatiquement un DelRow que vous pouvez appeler comme n'importe quelle autre méthode de grille :

grid.DelRow(grid.Row);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X