Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Checkbox в Grid


Автор: ehy 4.11.2007, 01:47
Здравствуйте, подскажите пожалуйта!

Есть таблица в БД, данные из которой выводятся в dbGrid. Необходимо добавить в grid ещё один столбец с CheckBox, не связанный с таблицей в БД, чтобы использовать все записи отмеченные галочкой, например выводить в отчет.

Предполагаю, что можно использовать компонент DBGridEh, но никак не могу с ним разобраться... 
Если не трудно опишите пошагово... Ещё буду очень благодарна за русский мануал по EhLid smile 

Автор: ALeXandrK 4.11.2007, 02:58
Обычно это учитывают в базе данных, создавая соответствующее поле.

Автор: ehy 4.11.2007, 11:56
Цитата(ALeXandrK @ 4.11.2007,  02:58)
Обычно это учитывают в базе данных, создавая соответствующее поле.

В том то все и дело, что нет необходимости загромаждать таблицу в БД лишним полем...
Попробую ещё раз описать: Есть например список дисциплин, с их характеристиками, и надо выбрать для конктерного отчета, только некоторые из них! В базе эту информацию хранить нет смысла, т.к. для следующего отчета, могут быть выбраны другие дисциплины

Автор: ALeXandrK 4.11.2007, 19:23
Ну тебе же по лубому нужно показать checkbox для записи, а
наиболее удобно для этого создать доп. поле.

Это ж не загромаждение, а необходимая функциональность.
Если не хочешь хранить доп. поле, то просто создавай его
в Run-Time и удаляй перед сохранением БД.

Другие варианты здесь просто будут более сложные, при чем эта
сложность не будет оправдана.

Не придумывай велосипед с квадратными колёсами!

Автор: Fighter 4.11.2007, 22:11
Одно могу сказать, в стандартных дельфовских компонентах такого нет. А так, посмотри на 
www.torry.net, может там что найдешь. 

А вообще, действительно кажется слишком уж создавать отдельное поле для галок. Тем более что теперь каждый раз это поле очищать, так как предполагается, что нужно будет каждый раз выводить список и каждый раз выбирать нужные элементы. Так что покопай пока-что www.torry.net, а к тому моменту более опытные форумчане может что посоветуют, а может подтвердят то, что нужно создавать отдельное поле. 

Автор: Savek 5.11.2007, 10:02
Если доп. поле не создавать, то список значений где-то нужно хранить. Здесь видится такой вариант: в грид добавляем колонку, не подключенную к датасету и в событии OnDrawColumnCell отрисовываем в этой колонке изображение CheckBoxa. При нажатии мышкой на указанное поле добавляем номер соотв. строки в StringList (это будет список отмеченных чекбоксов) или удаляем его оттуда, если оно там уже есть. При отрисовке проверяем наличие текущей строки в StringList-е и рисуем изображение отмеченного/неотмеченного чекбокса. Процедура отрисовки чекбокса может выглядеть так:
Код

procedure TForm1.DrawCheckBox(Canvas: TCanvas; Rect: TRect;
  Checked: boolean);
  var DrawFlags : integer;
       re : TRect;
begin
re:=rect;
re.Top:=re.Top+2;
re.Bottom:=re.Bottom-2;
Canvas.TextRect(Rect,Rect.Left+1,Rect.Top+1,' ');
if Checked then
  DrawFlags:=DFCS_flat or DFCS_CHECKED
else
  DrawFlags:=DFCS_flat;
DrawFrameControl(Canvas.Handle,Re,DFC_BUTTON,DrawFlags);
end;



вот ее вызов
Код

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState);
begin
with DBGrid1 do begin
// Отрисовка чекбокса
if Column.Index=5 then//номер колонки с чекбоксом
  DrawCheckbox(DBGrid1.Canvas,Rect,StringList.IndexOf(Datasource.DataSet.RecNo)>-1);
  end;
end;



вроде понятно изложил...

Автор: ehy 5.11.2007, 12:34
Спасибо большое, что откликнулись! Буду рыть дальше))))

Savek, а что это - StringList? Компонент? Свойство DBGrid? Что-то не могу понять smile 

Автор: Fighter 5.11.2007, 12:43
Так а что тут рыть, тебе вроде непосредственно ответили.

Автор: Savek 5.11.2007, 12:47
Цитата(ehy @  5.11.2007,  12:34 Найти цитируемый пост)
Savek, а что это - StringList? Компонент? Свойство DBGrid? Что-то не могу понять 

Это глобальная переменнная

Код

var
Form1 : TForm1;
StringList : TStringList;

Автор: ALeXandrK 5.11.2007, 13:03
Мне кажется вы начили танцевать с бубном.
Добавлять и удалять поле намного проще, да и работать с данными таким
образом тоже проще!

Автор: Savek 5.11.2007, 14:45
Цитата(ALeXandrK @  5.11.2007,  13:03 Найти цитируемый пост)
Добавлять и удалять поле намного проще, да и работать с данными таким
образом тоже проще!

Это уж автору решать, я всего лишь вариант предложил..

Автор: Akella 5.11.2007, 16:40
можно непосредственно в компоненте TDataSet создать новое поле типа Boolean (fkData), например с именем 'ToReport'. Не путай, не в самой таблице на диске, а в компоненте. Далее в гриде, в свойствах столбца поставить CheckBox := True.
Теперь можно и так узнать, что отправлять в отчет:

Код

If DBGridEh1.DataSource.dataset.FieldByName('ToReport').asBoolean then отправляем запись в отчет

Автор: ehy 5.11.2007, 22:03
Akella, Насколько я поняла, ты работаешь с EhLib? Тогда конкретный вопросик про него: 
Новое поле я создала и в DataSetе и в Grid добавила и CheckBo добавила, это мне в принципе и так понятно было, да и способ отбора для отчета тоже! Вопрос в другом: когда запускаю проект, колонка с чекбоксами неактивна(галочки поставить нельзя!). Пробовала делать это поле вычисляемым и присваивать значение False, тогда поле активно, галочек нет, но и поставить их нельзя. Если назначить на клик мыши FieldValue['Поле'] =  True, то галочка ставиться, но не сохраняется (при клике на другой строке исчезает). Где я ошибаюсь? Может не на клик надо назначать FieldValue['Поле'] =  True? Может поле должно быть не вычисляемым? Кажется я просто упускаю, ещё какую-то небольшую настройку! Подскажи, плиз!
Заранее спасибо!

Автор: Akella 7.11.2007, 22:04
ну не знаю, как ты там создавала, вот тебе примерчег

Автор: Akella 7.11.2007, 22:08
а так, как состояние значений полей может запоминаться, то чтобы не мучаться, то при открытии формы выполняй запрос
Код

update table set field_int_bool = 0


Напиши хранимку, которая будет выполнять этот запрос

Автор: ehy 10.11.2007, 21:11
Теперь разобралась! Спасибо Akella за отзывчивость  smile 

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