У меня есть TStringGrid, и я хочу удалить выбранную строку. Основные вещи, которые я пробовал, удаляют только последние строк. Как удалить произвольную строку?Как удалить строку TStringGrid?
ответ
Если код, который вы уже пробовали только удаляет последнюю строку, то вы, вероятно, просто декремент RowCount
Недвижимость. Это действительно всегда делает свои изменения на конце , заканчивающемся списка строк. Имея это в виду, вы можете написать код, чтобы убедиться, что строка, которую вы больше не хотите, является той, что находится в конце, и , затем удалите последнюю строку. (Самый прямой путь будет двигаться рядом, и есть метод MoveRow
, но он защищен. Если вы хотите вызвать защищенные методы, однако, вы можете также просто call DeleteRow
вместо этого.)
Использования только общественности и опубликованные члены, можно написать цикл, который удаляет произвольную строку. Например, вот некоторый код вдохновленный Scalabium Software's FAQ on this topic:
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;
Она копирует содержимое каждой строки ниже тот, который вы хотите удалить в строке выше. В конце цикла строка, которую вы хотите удалить, была перезаписана (рядом с ней рядом), и есть две копии последней строки. Затем он просто удаляет окончательную строку.
Чтобы удалить текущую строку сетки, вызовите функцию так:
DeleteRow(Grid, Grid.Row);
Выбранный ряд сетки задается свойством .
TCustomGrid
имеет метод DeleteRow
, но он защищен, поэтому вы не можете его вызывать, кроме как из потомков этого класса. Тем не менее, легко обойти это ограничение. Объявите потомка TCustomGrid
, а затем введите тип управления сеткой для этого нового типа. Вызвать DeleteRow
на результат.
type
TCustomGridAccess = class(TCustomGrid) end;
procedure DeleteGridRow(g: TCustomGrid; row: Integer);
begin
TCustomGridAccess(g).DeleteRow(row);
end;
Это работает, потому что в Delphi, члены с защищённой видимости неявно общественного в той же единице, как декларации класса. Хотя TCustomGrid
объявлен в блоке Grids, наш класс TCustomGridAccess
объявлен в вашего устройства, поэтому ваше устройство имеет доступ ко всем его защищенным методам, включая DeleteRow
.
Если версия Delphi достаточно новая, то вы можете использовать класса помощник а. Помощники класса могут получить доступ к защищенным элементам и не требуют применения литья типов к технически несвязанным типам.
type
TCustomGridHelper = class helper for TCustomGrid
public
procedure DelRow(ARow: Integer);
end;
procedure TCustomGridHelper.DelRow(ARow: Integer);
begin
Self.DeleteRow(ARow);
end;
Затем просто используйте устройство, в котором вы объявили помощника. Любой потомок TCustomGrid
будет автоматически иметь DelRow
метод, который можно назвать так же, как и любой другой метод сетки:
grid.DelRow(grid.Row);
- 1. Delphi: удалить унаследованный TStringGrid
- 2. Как прокручивать TStringGrid динамически?
- 3. TStringGrid и ключ вставки
- 4. TStringGrid с SpeedButtons
- 5. Клонирование компонента TStringGrid
- 6. Fmx TStringGrid цвет строки
- 7. Как поместить CR/LF в ячейку TStringgrid?
- 8. TStringGrid грязный взломать - ограничение выбора на одну строку
- 9. Delphi TStringGrid Flicker
- 10. TStringGrid merge cell drawing
- 11. TStringGrid - OnMouseUp не вызывается!
- 12. Указатель стрелки в TStringGrid
- 13. C++ Builder TStringGrid получить строку из конкретной ячейки
- 14. TStringGrid - есть ли простой способ получить строку «текущий/выбранный»?
- 15. Перемещение значений через ячейки TStringGrid
- 16. Удалить строку в StringGrid-Delphi
- 17. TStringGrid: Почему OnClick после OnKeyDown
- 18. Как создать собственный редактор для TStringGrid? (TStringGrid как родительский элемент для других элементов управления)
- 19. Как отобразить номер строки в TStringGrid?
- 20. Как отменить выбор ячейки в FireMonkey TStringgrid
- 21. Как реализовать TStringGrid с помощью виртуального дерева?
- 22. Как изменить цвет линий сетки TStringGrid?
- 23. Как добавить ASCI Char в ячейки TStringGrid
- 24. Как запретить непредвиденный запуск tStringGrid onSelectCell
- 25. Как получить доступ к символу в TStringGrid?
- 26. Пользовательская ячейка редактирования в TStringGrid
- 27. Delphi livebinding TClientDataSet TStringGrid runtime
- 28. TStringGrid Маркировка за пределами колонки
- 29. Как удалить прокомментированную строку
- 30. Как удалить специальную строку
Для добавления, если вам нужны только объекты (как я, динамически рисование данных в ячейках от объекта вместо содержимого ячейки) , затем замените вторую строку на 'Grid.Objects [0, I]: = Grid.Objects [0, I + 1];'. Это немного быстрее, чем замена всего содержимого, которое даже не используется. –