![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
стереть строку в StringGrid [Win2k]
Эд © (2003-02-12 13:47:00)Здравствуйте!
Усть ли способ стереть строку в StringGrid чтобы остальные
автоматически сместились вверх как в ListBox?
Спасибо
kkostik (2003-02-12 16:11:00) [1]Андрей Сенченко ©
Всё верно, можно и так, но сколько тогда памяти съест StringGrid и сколько эта память будет освобаждаться
Андрей Сенченко (2003-02-12 15:00:00) [2]kkostik © (12.02.03 14:25)
Anatoly Podgoretsky © (12.02.03 14:28)
Собственно, я не претендовал на окончательность своего варианта, как самого идеального и скоростного. По-хорошему в моем вариате реализован достаточно убогий алгоритм "в лоб", но он себя оправдываент в той задаче, под которую был написан - там сложно представить себе существование больше 20 строк таблицы.
Предложить другой вариант имея на руках только TStringGrid без написания потомков я врядли смогу. Но если бы потребовалось делать скоростной алгоритм - там зависело бы от задачи. Если таблица большая и последовательность расположения строк важна ( нельзя заменить удаляемую строк последней строкой грида ), то скорее всего сделал бы так:
1. Делаем удаляемую строку невидимой ( например нулевой высоты, как было предложено ). Ставим метку на полное удаление - она нужна для п.2 и в случае если данные из таблицы нужно будет куда-то сохранить.
2. Ловим Application.OnIdle ( сорри если неправильный синтаксис, букваря нет под рукой ) - то есть момент, когда приложение "не используется" и потихонечку поднимаем строки.
Если бы и этот вариант не дал ощутимых преимуществ - полез бы пошукать алгоритмы, например сюда.
http://alglib.chat.ru/
Danilka (2003-02-12 14:41:00) [3]можно сделать высоту нулевой :))
kkostik (2003-02-12 14:39:00) [4]Я это реализовал через заведение у StringGrida свойства которое определяет максимальное количество строк выводимых в грид, остальные строки при перемещении перерисовываются
Anatoly Podgoretsky (2003-02-12 14:28:00) [5]А ты можешь предложить другой путь, кроме перемещения, для заполнения дырок в длинных объектах.
kkostik (2003-02-12 14:25:00) [6]Андрей Сенченко да всё правельно это будет работать, но если в StringGrid занести порядка пяти тысяч записей и удалить первую, то будет работать долго...
Андрей Сенченко (2003-02-12 14:04:00) [7]Anatoly Podgoretsky © (12.02.03 13:58)
Писать наследника :) Нуууу .... это НЕ АВТОМАТИЧЕСКИ - это предполагает работу ручками
Андрей Сенченко (2003-02-12 14:03:00) [8]А то я то идиот целую процедуру писал по сдвижке строк :)
примерно такую :
Begin
// Берем номер удаляемой строки
GridRow := FmWorkDel.CBoxDel.ItemIndex + 1;
// Перемещаем строки наверх
For i := 0 to FmMain.StGridWork.ColCount - 1 do
For j := GridRow to FmMain.StGridWork.RowCount - 1 do
FmMain.StGridWork.cells[i,j] := FmMain.StGridWork.cells[i,j+1];
FmMain.StGridWork.RowCount := FmMain.StGridWork.RowCount - 1;
end;
kkostik (2003-02-12 13:59:00) [9]всё ручками писать надо, я по крайней мере больше способа не знаю, можно ещё оди вариант предложить, порождаешь от TStringGrid или выше свой объект и дописываешь отображение только видимых позиций, тода проже будет удалять строки
Anatoly Podgoretsky (2003-02-12 13:58:00) [10]Очень просто - пишем наследника и уже им пользуемся
Андрей Сенченко (2003-02-12 13:53:00) [11]Anatoly Podgoretsky © (12.02.03 13:51)
чтобы АВТОМАТИЧЕСКИсместились ? В TStrinGrid??? Анатолий ! Не дайте помереть дурой ! Расскажите !
Anatoly Podgoretsky (2003-02-12 13:51:00) [12]Способ такой есть