Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > StringGrid


Автор: nworm 14.4.2009, 20:46
Что-то у меня никак не получается, сделать чтобы у StringGrid одновременно было две опции (Options):
1. goEditing
2. goRowSelect
У меня получается, что если поставить goRowSelect=true, то ячейки больше не редактируются.

Автор: artsb 14.4.2009, 21:43
goEditing оставьте, а строку руками закрашивайте.

Добавлено через 8 минут и 35 секунд
Вот пример:
Код

void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
      int ARow, TRect &Rect, TGridDrawState State)
{
if(StringGrid1->Row == ARow)
{
  StringGrid1->Canvas->Brush->Color = clLime;
  StringGrid1->Canvas->FillRect(Rect);
}
else
{
  StringGrid1->Canvas->Brush->Color = StringGrid1->Color;
  StringGrid1->Canvas->FillRect(Rect);
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::StringGrid1Click(TObject *Sender)
{
StringGrid1->Invalidate();
}
//---------------------------------------------------------------------------

Если у вас есть фиксированные строки/столбцы и они должны быть закрашены определённым цветом - делаете соответствующую проверку и закрашиваете их нужным цветом, либо вообще не закрашиваете.

Автор: nworm 14.4.2009, 22:43
Да, спасибо, проходит. Только много строк так не выбрать.

Автор: Anikmar 15.4.2009, 08:34
Цитата(nworm @  14.4.2009,  22:43 Найти цитируемый пост)
Да, спасибо, проходит. Только много строк так не выбрать. 

ИМХО. Стандартный мультистрочный выбор с помощью Shift и Ctrl не удобен на больших списках. Утомительно. Лучше добавить колонку с CheckBox и отмечать строки при помощи галочек. Нагляднее, на мой взгляд. Естественно добавить 3 кнопки (или контекстным меню) - отметить все, убрать все, инверсировать выбор.

Автор: artsb 15.4.2009, 11:16
Цитата(nworm @  14.4.2009,  22:43 Найти цитируемый пост)
Только много строк так не выбрать. 

Тогда придётся изобретать велосипед... smile
Попробуйте как Anikmar советует.
Правда, с другой стороны, создавать сотню CheckBox'ов и не забыть потом их все удалить, тоже не очень весело. Да и как быть с индексами...
Я делал так:
Нарисовал две картинки наподобие CheckBox'а (только красивее). Нулевой столбец в StringGrid'e выделил под эти CheckBox'ы и хранил в его строках либо "1", либо "0" (в зависимости от состояния) и в зависимости от состояния рисовал ту или иную картинку. При клике по ячейке в нулевом столбце - изменял её значение.
Ещё надо DefaultDrawing = false. Но теперь надо будет всё рисовать руками. Зато, в этом случае, в ячейках можно делать многострочный текст.

Автор: nworm 15.4.2009, 15:15
Столбец с чекбоксами у меня сейчас есть (я переписал код из drkb на C++, всё нормально исчезает/появляется при изменении числа строк таблицы).

Там только нет мультистрочного выбора с помощью Shift и Ctrl  (типа MultiSelect в ListBox-e). Всё-таки с этим MultiSelect-ом удобнее (по сравнению с чекбоксами) выделять большие куски.
Но, с другой стороны, если MultiSelect-ную опцию делать в StringGrid-е, то при любом редактировании ячейки все выбранные строки сбиваются.
Вот интересно, можно ли как-нибудь комбинировать и мультиселект и редактирование?

Автор: Anikmar 15.4.2009, 17:58
Цитата(artsb @  15.4.2009,  11:16 Найти цитируемый пост)
Попробуйте как Anikmar советует.
Правда, с другой стороны, создавать сотню CheckBox'ов и не забыть потом их все удалить, тоже не очень весело. Да и как быть с индексами...
Я делал так:
Нарисовал две картинки наподобие CheckBox'а (только красивее). Нулевой столбец в StringGrid'e выделил под эти CheckBox'ы и хранил в его строках либо "1", либо "0" (в зависимости от состояния) и в зависимости от состояния рисовал ту или иную картинку. При клике по ячейке в нулевом столбце - изменял её значение.
Ещё надо DefaultDrawing = false. Но теперь надо будет всё рисовать руками. Зато, в этом случае, в ячейках можно делать многострочный текст.

Ну сотня строк на экране не поместится по-любому, а на самом деле - вы правы, я же сам, сначала CheckBox ставил, а потом перешел к картинкам, так что лучше картинки.

Цитата(nworm @  15.4.2009,  15:15 Найти цитируемый пост)
Там только нет мультистрочного выбора с помощью Shift и Ctrl  (типа MultiSelect в ListBox-e). Всё-таки с этим MultiSelect-ом удобнее (по сравнению с чекбоксами) выделять большие куски.
Но, с другой стороны, если MultiSelect-ную опцию делать в StringGrid-е, то при любом редактировании ячейки все выбранные строки сбиваются.
Вот интересно, можно ли как-нибудь комбинировать и мультиселект и редактирование?

Тогда можно комбинировать мультиселеск с чек-боксами, при этом редактирование не собьет ранее выделенное. Если по шифту выделяете -   то можно добавить кнопку "Отметить выделенное". Мне кажется вполне подойдет.

Автор: artsb 15.4.2009, 18:13
Цитата(nworm @  15.4.2009,  15:15 Найти цитируемый пост)
Вот интересно, можно ли как-нибудь комбинировать и мультиселект и редактирование?

Опять таки, goEditing оставьте, а выбранные строки строки закрашивайте руками.
Например, можно создать ещё один столбец в самом конце (это якобы CheckBox'ы) и в OnCreate формы установить столбцу нулевую ширину и заполнить его нулями (т.е. отмеченных строк нет).
Далее придумываете сочетание мышь+клавиатура при котором нужно отметить строку и в обработчике StringGrid'а OnMouseDown (ну или Up) делаете проверку и устанавливаете значение соответствующей строки в "1".
Также придётся немного подправить функцию DrawCell: реализовать закраску выбранных строк определённым цветом.

ЗЫ извиняюсь, что нет кода, а только логика, просто уже лень писать, тестировать и т.д. smile

Автор: nworm 15.4.2009, 20:18
Вроде всё прояснилось. Теперь надо будет выбрать какой-нибудь вариант и реализовать.

Автор: artsb 15.4.2009, 23:24
Маленький совет: не пробуйте реализовать выбранный вариант в основном проекте. Сделайте отдельный и там тестируйте. Просто может получиться так, что в основном проекте всплывут ошибки никак не связанные с решаемой в данный момент задачей, а вы будете ломать голову, почему не работает.
Ну и собственно, удачи!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)