![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поле для статуса записи [Access]
Игорь ЖАКО © (2006-10-16 17:40:00)Подскажите как можно реализовать такую фичу
надо поле(для статуса записи) для показа в Dbgrid информации о выполнении т.е ВЫПОЛНЕНО,НЕВЫПОЛНЕНО, В РАБОТЕ и подсветка различными цветами
может есть такой расширенный dbgrid
MsGuns (2006-10-17 15:38:00) [21]ImageList1.Draw(TDBGrid(Sender).Canvas,Rect.Left,Rect.Top,ADOQuery1.FieldByName( 'STATUS').AsInteger);
И все !
Без всяких этажерок из Case или If
Только не забыть погасить вывод содержимого поля во избежание наложения картинки на текст. Это проще всего делается в обработчике OnGetText поля, которое "назначено" этой колонке грида:
Text := '';
ANB (2006-10-17 15:17:00) [22]А теперь сесть и подумать, почему так вышло. Потом запустить отладчик и проверить свои мысли. После чего написать, как надо. А не дергать всех по пустякам. Для решения все уже дано. Написание полностью работающего кода стоит денег.
Игорь ЖАКО (2006-10-17 14:51:00) [23]не не стали по верх их нарисовалась а надо только в одном поле и вместо
Игорь ЖАКО (2006-10-17 14:49:00) [24]//if MyQuery.FieldByName('STATUS').AsInteger =1
если содержимое поля Status равно 1 то рисавать вторую картинку
ImageIndex:=2
ImageList.Draw(TDBGrid(Sender).Canvas,Rect.Left,Rect.Top, ImageIndex ); }
в поле будет 3 значения (0 . 1 . 2)
if ADOQuery1.FieldByName('STATUS').AsInteger=1 Then
Begin
ImageIndex:=1; //... { получим значение номера картинки в ImageList
// А теперь пусть ImageList нарисует ее на канве DBGrid'а
ImageList1.Draw(TDBGrid(Sender).Canvas,Rect.Left,Rect.Top, ImageIndex );
получилась вот такая беда все 1 стали картинками
ANB (2006-10-17 14:35:00) [25]
> IF // рисуется колонка, в которую мы хотим поместить картинку
>
> // и выполняется условие для рисования картинки
Аааа. Понял. Вот тута. Смотришь ТЗ и переводишь с русского на делфи :)
ANB (2006-10-17 14:34:00) [26]
> подскажите как написать условия
А где условие ?
Игорь ЖАКО (2006-10-17 14:33:00) [27]>Shorokhov [16]
>MsGuns пока это только один рабочий вариант
подскажите как написать условия
procedure TformColorGrid.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
Var ImageIndex : Integer;
Begin
IF // рисуется колонка, в которую мы хотим поместить картинку
// и выполняется условие для рисования картинки
Then Begin
ImageIndex:= ... { получим значение номера картинки в ImageList }
// А теперь пусть ImageList нарисует ее на канве DBGrid'а
ImageList.Draw(TDBGrid(Sender).Canvas,Rect.Left,Rect.Top, ImageIndex );
End;
End
ANB (2006-10-17 14:20:00) [28]
> MyTableSTATUS.AsInteger
По хорошему это MyQuery.FieldByName('STATUS').AsInteger
Игорь ЖАКО (2006-10-17 14:15:00) [29]>Игорь ЖАКО [18]
вот я сейчас пытаюсь свой код написать
MsGuns (2006-10-17 14:11:00) [30]>Игорь ЖАКО (17.10.06 14:03) [18]
> case MyTableSTATUS.AsInteger of - как переписать
Эту глупость никак не надо переписывать.
Послушайтесь совета: НИКОГДА НЕ ПЕРЕПИСЫВАЙТЕ ЧУЖОЙ КОД БЕЗДУМНО, не вникая в смысл каждой его строки
Игорь ЖАКО (2006-10-17 14:09:00) [31]подскажите как написать условия
procedure TformColorGrid.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
Var ImageIndex : Integer;
Begin
IF // рисуется колонка, в которую мы хотим поместить картинку
// и выполняется условие для рисования картинки
Then Begin
ImageIndex:= ... { получим значение номера картинки в ImageList }
// А теперь пусть ImageList нарисует ее на канве DBGrid'а
ImageList.Draw(TDBGrid(Sender).Canvas,Rect.Left,Rect.Top, ImageIndex );
End;
End
Игорь ЖАКО (2006-10-17 14:03:00) [32]>Shorokhov
ADOQuery1 использую
> case MyTableSTATUS.AsInteger of - как переписать
MsGuns (2006-10-17 14:00:00) [33]>Shorokhov © (17.10.06 12:06) [16]
Не сочтите за обиду, но прежде чем писАть в форум, неплохо посмотреть на свои "труды" критически.
Этот Ваш код не просто далек от оптимальности и сверхгромоздок, но еще и потенциально глючен.
Shorokhov (2006-10-17 12:06:00) [34]Ну, сходу можно сделать так. Может корявенько, но проблему решит.
Заранее не известно, сколько статусов может быть у записи.
Например: 0,1,2 и что-то еще в будущем.
Тогда можно кинуть на форму 4 TImage (i0,i1,i2,i3), в каждый из них загрузить по соотв. картинке и в обработчике OnDrawColumnCell написать следующее:
var lR: TRect;
begin
if Column.FieldName = 'STATUS' then
begin
lR := Rect;
dbg.Canvas.FillRect(Rect);
i0.Width := Rect.Right - Rect.Left;
i0.Height := i0.Width;
i1.Width := Rect.Right - Rect.Left;
i1.Height := i1.Width;
i2.Width := Rect.Right - Rect.Left;
i2.Height := i2.Width;
i3.Width := Rect.Right - Rect.Left;
i3.Height := i3.Width;
case MyTableSTATUS.AsInteger of
0: dbg.Canvas.Draw(lr.Left + round((lr.right - lr.Left)/2) - 9,lr.Top + round((lr.Bottom - lr.Top)/2 - 8),i0.Picture.Bitmap);
1: dbg.Canvas.Draw(lr.Left + round((lr.right - lr.Left)/2) - 9,lr.Top + round((lr.Bottom - lr.Top)/2 - 8),i1.Picture.Bitmap);
2: dbg.Canvas.Draw(lr.Left + round((lr.right - lr.Left)/2) - 9,lr.Top + round((lr.Bottom - lr.Top)/2 - 8),i2.Picture.Bitmap);
end;
else dbg.Canvas.Draw(lr.Left + round((lr.right - lr.Left)/2) - 9,lr.Top + round((lr.Bottom - lr.Top)/2 - 8),i3.Picture.Bitmap);
end;
end;
Игорь ЖАКО (2006-10-17 11:20:00) [35]>MsGuns
>ЮЮ
сейчас почитаю
Игорь ЖАКО (2006-10-17 11:18:00) [36]А возможно реализовать такое -
если в поле Status= 1 то вывести в dbgrid в поле статус определенную картинку а если =2 то другую а если =3 то третью
ЮЮ (2006-10-17 11:16:00) [37]
> Если надо показывать "статус" записи, который определяет
> сам клиент (т.е. в БД такой информации нет),
Насколько понял я,поле в базе присутствует. Для новой записи устанавливается "не выполнено", в дальнейшем может быть изменено.
Т.е. обычное поле, можно даже в БД "справочник" добавить.
Вопрос о раскраске грида хорошо освещен в "Разноцветный D B G R I D":
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=168
Sergey13 (2006-10-17 11:14:00) [38]> [10] Игорь ЖАКО (17.10.06 11:06)
Тогда чем это поле отличается от других полей? От каких нибудь "Кода" или "Наименования"? В чем проблема то? Надо - добавь. Лично я не против.
MsGuns (2006-10-17 11:07:00) [39]Если надо показывать "статус" записи, который определяет сам клиент (т.е. в БД такой информации нет), то никакие эх!либы, а тем более какие-то левыу мдбгриды не помогут.
Проблема решается путем создания списка "помеченных" записей, куда добавляются или откуда удаляются UID "отмеченных" пользователем записей. В событии перерисовки ячеек грида OnDrawColumnCell надо искать идентификатор текущей записи в списке (годится шустрый IndexOf при условии, что в список добавлялся не сам идентификатор, а преобразованный в стринг аналог) и, если есть, то либо рисовать галочку, либо менять цвет строки, либо еще как-либо выделять "отмеченную" запись.
Технология управления гридом прекрасно описана в статье "Полосатый грид" на Королевстве Дельфи.
ЗЫ. Не пытайтесь решать ВСЕ свои проблемы поиском "подходящих компонент", как советуют многие тут. Это верный путь к непрофессионализму и ламерству, труднонаходимым ошибкам и проклятьям в Ваш адрес тех, кому придется впоследствии разбирать Ваши проекты.
Игорь ЖАКО (2006-10-17 11:06:00) [40]Будет меняться пользывателем - при добавлении записи устанавливаеться статус не выполнено и потом можно будет редактировать запись и тогда менять состаяния статуса (Выполнено или в работе) - я думаю так может есть другие варианты