2013-12-06 8 views
3

Я хочу сделать что-то подобное. У меня есть список в StringGrid, и я хочу удалить одну строку, выбрав ячейку и нажав кнопку. Затем этот список должен отображаться снова в StringGrid без этой строки. Самая большая проблема, с которой я сталкиваюсь при удалении строки, я пробовал эту процедуру, но она только удаляла строку в StringGrid, а не в списке, я думаю.Удалить строку в StringGrid-Delphi

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; 

Пожалуйста, помогите кому-нибудь. :)

+0

Я не уверен, что правильно понимаю, но мне кажется, что у вас есть две структуры, список и сетка. Представленный вами код удаляет одну строку из сетки. Что мешает вам удалить соответствующий элемент из списка? – AlexSC

+0

Так что я должен просто удалить за один раз элемент из списка и сетки? Я не думал об этом ... – Vekka

+0

Если вы используете живые привязки для отображения списка в сетке, вы можете просто удалить элемент из списка. –

ответ

1

Выбранная строка может быть найдена StringGrid1.selected, и вы можете вызвать следующую процедуру.

procedure TUtils.DeleteRow(ARowIndex: Integer; AGrid: TStringGrid); 
var 
    i, j: Integer; 
begin 
    with AGrid do 
    begin 
    if (ARowIndex = RowCount) then 
     RowCount := RowCount - 1 
    else 
    begin 
     for i := ARowIndex to RowCount do 
     for j := 0 to ColumnCount do 
      Cells[j, i] := Cells[j, i + 1]; 

     RowCount := RowCount - 1; 
    end; 
    end; 
end; 
+0

Также можно вызвать метод 'TStringGrid.DeleteRow()'. Он объявлен как «защищенный», но вы можете использовать его для доступа к нему: 'type TStringGridAccess = class (TStringGrid) end; TStringGridAccess (AGrid) .DeleteRow (ARowIndex); ' –

2

Если вы используете стандартный VCL TStringGrid (без использования прямых привязок, доступных в последних версиях), вы можете использовать класс интерполятора для доступа к защищенному методу TCustomGrid.DeleteRow.

Следующий код был протестирован в Delphi 2007. Он использует простой TStringGrid, упавший на форму, со столбцами и ячейками по умолчанию и стандартом TButton.

Обработчик события TForm.OnCreate просто заполняет сетку некоторыми данными, чтобы упростить просмотр удаленной строки. Событие нажатия кнопки удаляет строку 1 из stringgrid при каждом щелчке.

Примечание: Код не проверяет ошибки, чтобы убедиться, что имеется достаточно строк. Это демо-приложение , а не пример производственного кода. Ваш фактический код должен проверить количество доступных строк, прежде чем пытаться его удалить.

// Interposer class, named to indicate it's use 
type 
    THackGrid=class(TCustomGrid); 

// Populates stringgrid with test data for clarity  
procedure TForm1.FormCreate(Sender: TObject); 
var 
    i, j: Integer; 
begin 
    for i := 1 to StringGrid1.ColCount - 1 do 
    StringGrid1.Cells[i, 0] := Format('Col %d', [i]); 
    for j := 1 to StringGrid1.RowCount - 1 do 
    begin 
    StringGrid1.Cells[0, j] := Format('Row #d', [j]); 
    for i := 1 to StringGrid1.ColCount - 1 do 
    begin 
     StringGrid1.Cells[i, j] := Format('C: %d R: %d', [i, j]); 
    end; 
    end; 
end; 

// Deletes row 1 from the stringgrid every time it's clicked 
// See note above for info about lack of error checking code. 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
    THackGrid(StringGrid1).DeleteRow(1); 
end; 

Если вы используете более позднюю версию, и приложили данные к сетке с помощью живых привязок, вы можете просто удалить строку из исходных данных, и пусть живут привязки обрабатывать удаление строки.

Смежные вопросы