2013-05-03 4 views
10

У меня есть TStringGrid, и я хочу удалить выбранную строку. Основные вещи, которые я пробовал, удаляют только последние строк. Как удалить произвольную строку?Как удалить строку TStringGrid?

ответ

11

Если код, который вы уже пробовали только удаляет последнюю строку, то вы, вероятно, просто декремент 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); 
+0

Для добавления, если вам нужны только объекты (как я, динамически рисование данных в ячейках от объекта вместо содержимого ячейки) , затем замените вторую строку на 'Grid.Objects [0, I]: = Grid.Objects [0, I + 1];'. Это немного быстрее, чем замена всего содержимого, которое даже не используется. –

9

Выбранный ряд сетки задается свойством .

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); 
Смежные вопросы