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 ?
Réponses
Trop de publicités?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);
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);