Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

StringGrid и удаление выделеных строк.   Найти похожие ветки 

 
rioko   (2012-07-14 15:37) [0]

Здравствуйте! Надоумьте пожалуйста, как можно из стринггрида удалить выделеные строки? Как удалять я знаю, я не могу понять как опознать выделена ли строка или нет... Суть проблемы в следующем.. У меня в СтрингГриде стоит РэнжСелект, и пользователь может рандомным образом выделить какие то строки и нажав кнопку "удалить" - они должны удалиться.
Я никак не могу сделать что бы это работало...
Удаляю я строки так:


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;


в общем, проблема думаю понятна) помогите пожалуйста)


 
rioko   (2012-07-14 15:57) [1]

Как проверить - входит ли строка в список выделенных или нет? Как вообще проверить - выделена ли строка?


 
rioko   (2012-07-14 15:58) [2]

И как получить список всех выделеных строк?)


 
Омлет ©   (2012-07-14 16:44) [3]

SG.Selection


 
rioko   (2012-07-14 18:03) [4]

Можно пример пожалуйста? Все что было мной найдено в интернете по этому поводу сводилось к тому как удалить известную выделенную строку. К примеру выделена строка 10 - ее и удалить. А как удалить строки к примеру 5 - 18, если они выделены в таблице среди прочих строк?


 
Омлет ©   (2012-07-14 19:25) [5]

procedure TForm1.Button1Click(Sender: TObject);
// При нажатии на Button1 удалятся выделенные в StringGrid1 строки
var
 i, h: integer;
begin
 with StringGrid1, Selection do
 begin
   h := Bottom - Top + 1;
   for i := Top to RowCount - h - 1 do
     Rows[i].Assign(Rows[i + h]);
   RowCount := RowCount - h;
 end;
end;


> Все что было мной найдено в интернете по этому поводу сводилось
> к тому как удалить известную выделенную строку.

Работа программиста заключается не в поиске кода, а в его написании )


 
rioko   (2012-07-14 19:55) [6]

Омлет ©  Спасибо огромное за помощь, это как раз то что нужно)

> Работа программиста заключается не в поиске кода, а в его
> написании )

Для написание нужно понимание которого у меня к сожалению не было, а теперь есть) хоть и посредственное) Спасибо)


 
Юрий Зотов ©   (2012-07-14 19:56) [7]

Зачем делать самопальное удаление, если оно уже есть в VCL?

type
 TSG = class(TStringGrid); // Дает доступ к секции protected

procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
begin
 with TSG(StringGrid1), Selection do
   for i := Bottom downto Top do
     DeleteRow(i)
end;


 
turbouser ©   (2012-07-14 21:14) [8]


> Юрий Зотов ©   (14.07.12 19:56) [7]
>
> Зачем делать самопальное удаление, если оно уже есть


> Дает доступ к секции protected

не так уж и "есть"
protected не зря так называется.
хотя, многие злоупотребляют этой секцией :(


 
Юрий Зотов ©   (2012-07-14 21:35) [9]


> turbouser ©   (14.07.12 21:14) [8]
> protected не зря так называется.

Извините, а Вы уверены, что понимаете суть секции protected? Зачем она вообще нужна?


 
turbouser ©   (2012-07-14 21:39) [10]

Конечно, Юрий. А Вам доводилось править исходники DevExpress?


 
Юрий Зотов ©   (2012-07-14 21:44) [11]


> turbouser ©   (14.07.12 21:39) [10]

Конечно не доводилось. А зачем?


 
turbouser ©   (2012-07-14 21:45) [12]


> Юрий Зотов ©   (14.07.12 21:44) [11]


> А зачем?

Вам по пунктам разложить? :)


 
Юрий Зотов ©   (2012-07-14 21:47) [13]


> turbouser ©   (14.07.12 21:45) [12]

Не обязательно. Можно кратко - только суть того, что Вас там не устроило.


 
turbouser ©   (2012-07-14 21:50) [14]


> Юрий Зотов ©   (14.07.12 21:47) [13]

У них много свойств и методов, которые должны быть доступны ограничены секцией protected. Это очень неприятно, мягко говоря.


 
turbouser ©   (2012-07-14 21:55) [15]

PivotGrid
экспорт в Ёксель
dbtable
эт на вскидку.


 
Юрий Зотов ©   (2012-07-14 21:58) [16]


> turbouser ©   (14.07.12 21:50) [14]
> У них много свойств и методов, которые должны быть доступны
> ограничены секцией protected. Это очень неприятно, мягко
> говоря.

Вообще-то, что, как и где должно быть доступно - решает разработчик. Ну да ладно, суть не в том.

Суть в следующем - и что, разве это повод для правки генофонда?


 
AV ©   (2012-07-14 21:59) [17]

кстати, а в чем суть секции protected, д.Юр?
Не, правда..
А то у меня только приват или паблик :)
Или я отвечаю, за то что показал, или не лезь!

(т.е. то, что ее видят потомки, это понятно. В этом и только?)


 
turbouser ©   (2012-07-14 22:21) [18]


> Юрий Зотов ©   (14.07.12 21:58) [16]


> Вообще-то, что, как и где должно быть доступно - решает
> разработчик. Ну да ладно, суть не в том.
>
> Суть в следующем - и что, разве это повод для правки генофонда?
>
>

То что пишут этот софт аутсорсные индусы (не знаю, других причин такого неадевата не могу придумать) это ладно.
Это полный пипец, Юрий.
Вышла версия 2011.2.4(или 3? не помню)
Пришлось менять их метод отрисовки, лезть в самые дебри... Пришлось менять модуль экспорта.. Пришлось менять.. Много чего пришлось менять. Уж не спросите ли вы меня почему..


 
Юрий Зотов ©   (2012-07-14 22:29) [19]


> turbouser ©   (14.07.12 22:21) [18]
> Уж не спросите ли вы меня почему..

Не спрошу. Потому что я уже спросил - разве то, что член класса включен разработчиком в секцию protected является основанием для правки исходников?

PS
Напомню - мы говорим о секции protected и только о ней. Не надо все валить все в одну кучу.

PPS
Таки жду ответа на вопрос.


 
turbouser ©   (2012-07-14 22:35) [20]


> Юрий Зотов ©   (14.07.12 22:29) [19]

Разве я не ответил?
Тебе довелось встречаться с DX? Множество методов, которые ну никак (матерное_слово никак!!!) не должны попадать в эту секцию - там.. цвета, положение, поведение.. :(


 
turbouser ©   (2012-07-14 22:36) [21]

Или нужна конкретика? Это в понедельник, если надо.


 
Юрий Зотов ©   (2012-07-14 22:45) [22]


> turbouser ©   (14.07.12 22:35) [20]
> Разве я не ответил?

Нет. Вынужден снова напомнить вопрос: разве то, что член класса включен разработчиком в секцию protected является основанием для правки исходников?

Просто - да или нет.


 
turbouser ©   (2012-07-14 23:13) [23]


> Юрий Зотов ©   (14.07.12 22:45) [22]


> Просто - да или нет.

Если разработчик адекватный - то нет.
Вы думаете что я не понимаю?


 
Германн ©   (2012-07-15 02:40) [24]


>  Юрий Зотов ©   (14.07.12 19:56) [7]
>
> Зачем делать самопальное удаление, если оно уже есть в VCL?
>

1. Поддерживаю, ибо MoveRow делает гораздо больше, чем пример в Омлет ©  
(14.07.12 19:25) [5]
2. Не поддерживаю, т.к. DeleteRow меняет порядок строк в гриде.


 
Германн ©   (2012-07-15 03:03) [25]


> AV ©   (14.07.12 21:59) [17]
>
> кстати, а в чем суть секции protected, д.Юр?
> Не, правда..
> А то у меня только приват или паблик :)

Ты очевидно говоришь о полностью разработанных компонентах. К каким TStringGrid никогда не относился, не относится и никогда не будет относиться.


 
Юрий Зотов ©   (2012-07-15 06:12) [26]


> turbouser ©   (14.07.12 23:13) [23]

И даже если разработчик неадекватный, то тоже нет. Всегда можно породить потомка и в нем публиковать что угодно. Причем именно этот способ совершенно легально предусмотрен объектной моделью Delphi. А кроме того,  именно этот способ не приводит к риску нарваться на "модуль такой-то был откомпилирован с другой версией" (не помню, как это сообщение звучит в оригинале, но как-то так).

Поэтому в [7] использован нормальный способ доступа к protected. Злоупотреблением скорее можно назвать как раз правку исходников.


> AV ©   (14.07.12 21:59) [17]
> (т.е. то, что ее видят потомки, это понятно. В этом и только?)

В этом, но не только. Еще в том, что ее не видят экземпляры.

В подходе "только приват или паблик" получаем "либо видят все, либо не видит никто". А с protected имеем более гибкую картину - "видят, но не все". Таким образом, разработчик библиотеки общего назначения получает возможность дать доступ к ее потрохам другому такому же разработчику, но не прикладнику. А это, априори, люди разной квалификации - и то, что можно доверить первому, нельзя доверять второму.


> Германн

Не понял, каким образом DeleteRow "меняет порядок строк в гриде", что такое "полностью разработанный компонент" и почему TStringGrid к ним не относится.


 
Омлет ©   (2012-07-15 11:30) [27]

> Юрий Зотов ©   (14.07.12 19:56) [7]
> Зачем делать самопальное удаление, если оно уже есть в VCL?


У DeleteRow есть свои недостатки. Может быть поэтому его и не выпустили в public.


 
Юрий Зотов ©   (2012-07-15 11:36) [28]


> Омлет ©   (15.07.12 11:30) [27]

Какие?


 
Германн ©   (2012-07-15 14:28) [29]


> > Германн
>
> Не понял, каким образом DeleteRow "меняет порядок строк
> в гриде"

procedure TCustomGrid.DeleteRow(ARow: Longint);
begin
 MoveRow(ARow, RowCount - 1);
 RowCount := RowCount - 1;
end;


 
Омлет ©   (2012-07-15 14:32) [30]

> Какие?

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 15:05) [31]

> Германн ©   (15.07.12 14:28) [29]

И что? Где тут нарушение порядка строк?

При ЛЮБОМ удалении строки из середины все нижележащие строки ОБЯЗАНЫ сдвинуться на одну строку вверх. Это не нарушение порядка, а наоборот, его сохранение.


 
Юрий Зотов ©   (2012-07-15 15:15) [32]

> Омлет ©   (15.07.12 14:32) [30]

Ну, при многократном Assign перерисовка тоже не подарок. А вот насчет артефакта - тут да, явный глюк.


 
Германн ©   (2012-07-15 19:32) [33]


> Юрий Зотов ©   (15.07.12 15:05) [31]
>
> > Германн ©   (15.07.12 14:28) [29]
>
> И что? Где тут нарушение порядка строк?

Видать меня где-то сильно переглючило :(



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.073 c
15-1336738041
alexdn
2012-05-11 16:07
2013.03.22
Лицензии


2-1328101281
sergeii01
2012-02-01 17:01
2013.03.22
Запись в файл из нескольких потоков


15-1343817068
ProgRAMmer Dimonych
2012-08-01 14:31
2013.03.22
Spurious wakeup в WinSock?


2-1335471178
SIV5000
2012-04-27 00:12
2013.03.22
Меню > Создать


2-1330431730
Drowsy
2012-02-28 16:22
2013.03.22
Не показывается модальная форма.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский