![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
StringGrid и удаление выделеных строк.
rioko © (2012-07-14 15:37:00)Здравствуйте! Надоумьте пожалуйста, как можно из стринггрида удалить выделеные строки? Как удалять я знаю, я не могу понять как опознать выделена ли строка или нет... Суть проблемы в следующем.. У меня в СтрингГриде стоит РэнжСелект, и пользователь может рандомным образом выделить какие то строки и нажав кнопку "удалить" - они должны удалиться.
Я никак не могу сделать что бы это работало...
Удаляю я строки так:
procedure DeleteRow(SG:TStringGrid; RowToDelete:Integer);
var i: Integer;
begin
with SG do begin
if (RowToDelete>=0) and (RowToDelete<RowCount) then begin
for i:=RowToDelete to RowCount-2 do
Rows[i].Assign(Rows[i+1]);
RowCount:= RowCount-1;
end;
end;
end;
в общем, проблема думаю понятна) помогите пожалуйста)
Германн (2012-07-15 19:32:00) [1]
> Юрий Зотов © (15.07.12 15:05) [31]
>
> > Германн © (15.07.12 14:28) [29]
>
> И что? Где тут нарушение порядка строк?
Видать меня где-то сильно переглючило :(
Юрий Зотов (2012-07-15 15:15:00) [2]> Омлет © (15.07.12 14:32) [30]
Ну, при многократном Assign перерисовка тоже не подарок. А вот насчет артефакта - тут да, явный глюк.
Юрий Зотов (2012-07-15 15:05:00) [3]> Германн © (15.07.12 14:28) [29]
И что? Где тут нарушение порядка строк?
При ЛЮБОМ удалении строки из середины все нижележащие строки ОБЯЗАНЫ сдвинуться на одну строку вверх. Это не нарушение порядка, а наоборот, его сохранение.
Омлет (2012-07-15 14:32:00) [4]> Какие?
1. Артефакт при отрисовке с опцией goAlwaysShowEditor. Только что проверял в D7. Создаем новый проект, кидает StringGrid и кнопку, назначаем обработчики:
type
TSG = class(TStringGrid);
procedure TForm1.Button1Click(Sender: TObject);
begin
TSG(StringGrid1).DeleteRow(0)
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin
StringGrid1.FixedRows := 0;
StringGrid1.FixedCols := 0;
StringGrid1.Options := StringGrid1.Options + [goEditing, goAlwaysShowEditor];
StringGrid1.cells[0,0] := 'test'
end;
Запускаем, видим:
http://not-doing.ru/some/StringGrid-before.png
Нажимаем кнопку, видим:
http://not-doing.ru/some/StringGrid-after.png
2. Выделение соскакивает на последнюю строку, что тоже видно по примеру 1.
3. О чем сказал Германн - вызывается OnRowMoved для удаляемой строки, что не очень логично, т.к. мы не перемещаем строку, а удаляем.
Это не говоря уже о избыточном вызове разных тяжелых методов, типа ChangeSize, и многократной перерисовки, когда удаляем несколько строк разом через DeleteRow.
Германн (2012-07-15 14:28:00) [5]
> > Германн
>
> Не понял, каким образом DeleteRow "меняет порядок строк
> в гриде"
procedure TCustomGrid.DeleteRow(ARow: Longint);
begin
MoveRow(ARow, RowCount - 1);
RowCount := RowCount - 1;
end;
Юрий Зотов (2012-07-15 11:36:00) [6]
> Омлет © (15.07.12 11:30) [27]
Какие?
Омлет (2012-07-15 11:30:00) [7]> Юрий Зотов © (14.07.12 19:56) [7]
> Зачем делать самопальное удаление, если оно уже есть в VCL?
У DeleteRow есть свои недостатки. Может быть поэтому его и не выпустили в public.
Юрий Зотов (2012-07-15 06:12:00) [8]
> turbouser © (14.07.12 23:13) [23]
И даже если разработчик неадекватный, то тоже нет. Всегда можно породить потомка и в нем публиковать что угодно. Причем именно этот способ совершенно легально предусмотрен объектной моделью Delphi. А кроме того, именно этот способ не приводит к риску нарваться на "модуль такой-то был откомпилирован с другой версией" (не помню, как это сообщение звучит в оригинале, но как-то так).
Поэтому в [7] использован нормальный способ доступа к protected. Злоупотреблением скорее можно назвать как раз правку исходников.
> AV © (14.07.12 21:59) [17]
> (т.е. то, что ее видят потомки, это понятно. В этом и только?)
В этом, но не только. Еще в том, что ее не видят экземпляры.
В подходе "только приват или паблик" получаем "либо видят все, либо не видит никто". А с protected имеем более гибкую картину - "видят, но не все". Таким образом, разработчик библиотеки общего назначения получает возможность дать доступ к ее потрохам другому такому же разработчику, но не прикладнику. А это, априори, люди разной квалификации - и то, что можно доверить первому, нельзя доверять второму.
> Германн
Не понял, каким образом DeleteRow "меняет порядок строк в гриде", что такое "полностью разработанный компонент" и почему TStringGrid к ним не относится.
Германн (2012-07-15 03:03:00) [9]
> AV © (14.07.12 21:59) [17]
>
> кстати, а в чем суть секции protected, д.Юр?
> Не, правда..
> А то у меня только приват или паблик :)
Ты очевидно говоришь о полностью разработанных компонентах. К каким TStringGrid никогда не относился, не относится и никогда не будет относиться.
Германн (2012-07-15 02:40:00) [10]
> Юрий Зотов © (14.07.12 19:56) [7]
>
> Зачем делать самопальное удаление, если оно уже есть в VCL?
>
1. Поддерживаю, ибо MoveRow делает гораздо больше, чем пример в Омлет ©
(14.07.12 19:25) [5]
2. Не поддерживаю, т.к. DeleteRow меняет порядок строк в гриде.
turbouser (2012-07-14 23:13:00) [11]
> Юрий Зотов © (14.07.12 22:45) [22]
> Просто - да или нет.
Если разработчик адекватный - то нет.
Вы думаете что я не понимаю?
Юрий Зотов (2012-07-14 22:45:00) [12]
> turbouser © (14.07.12 22:35) [20]
> Разве я не ответил?
Нет. Вынужден снова напомнить вопрос: разве то, что член класса включен разработчиком в секцию protected является основанием для правки исходников?
Просто - да или нет.
turbouser (2012-07-14 22:36:00) [13]Или нужна конкретика? Это в понедельник, если надо.
turbouser (2012-07-14 22:35:00) [14]
> Юрий Зотов © (14.07.12 22:29) [19]
Разве я не ответил?
Тебе довелось встречаться с DX? Множество методов, которые ну никак (матерное_слово никак!!!) не должны попадать в эту секцию - там.. цвета, положение, поведение.. :(
Юрий Зотов (2012-07-14 22:29:00) [15]
> turbouser © (14.07.12 22:21) [18]
> Уж не спросите ли вы меня почему..
Не спрошу. Потому что я уже спросил - разве то, что член класса включен разработчиком в секцию protected является основанием для правки исходников?
PS
Напомню - мы говорим о секции protected и только о ней. Не надо все валить все в одну кучу.
PPS
Таки жду ответа на вопрос.
turbouser (2012-07-14 22:21:00) [16]
> Юрий Зотов © (14.07.12 21:58) [16]
> Вообще-то, что, как и где должно быть доступно - решает
> разработчик. Ну да ладно, суть не в том.
>
> Суть в следующем - и что, разве это повод для правки генофонда?
>
>
То что пишут этот софт аутсорсные индусы (не знаю, других причин такого неадевата не могу придумать) это ладно.
Это полный пипец, Юрий.
Вышла версия 2011.2.4(или 3? не помню)
Пришлось менять их метод отрисовки, лезть в самые дебри... Пришлось менять модуль экспорта.. Пришлось менять.. Много чего пришлось менять. Уж не спросите ли вы меня почему..
AV (2012-07-14 21:59:00) [17]кстати, а в чем суть секции protected, д.Юр?
Не, правда..
А то у меня только приват или паблик :)
Или я отвечаю, за то что показал, или не лезь!
(т.е. то, что ее видят потомки, это понятно. В этом и только?)
Юрий Зотов (2012-07-14 21:58:00) [18]
> turbouser © (14.07.12 21:50) [14]
> У них много свойств и методов, которые должны быть доступны
> ограничены секцией protected. Это очень неприятно, мягко
> говоря.
Вообще-то, что, как и где должно быть доступно - решает разработчик. Ну да ладно, суть не в том.
Суть в следующем - и что, разве это повод для правки генофонда?
turbouser (2012-07-14 21:55:00) [19]PivotGrid
экспорт в Ёксель
dbtable
эт на вскидку.
turbouser (2012-07-14 21:50:00) [20]
> Юрий Зотов © (14.07.12 21:47) [13]
У них много свойств и методов, которые должны быть доступны ограничены секцией protected. Это очень неприятно, мягко говоря.