Форум: "Базы";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];
ВнизПоле для статуса записи Найти похожие ветки
← →
Игорь ЖАКО (2006-10-16 17:40) [0]Подскажите как можно реализовать такую фичу
надо поле(для статуса записи) для показа в Dbgrid информации о выполнении т.е ВЫПОЛНЕНО,НЕВЫПОЛНЕНО, В РАБОТЕ и подсветка различными цветами
может есть такой расширенный dbgrid
← →
Shorokhov © (2006-10-16 17:48) [1]Есть гриды, выводящие галочки вместо текста. Например, MDBGrid.
Подстветку делай ручками.
В обработчике грид"а OnGetCellParams пишешь че-нить вроде этого:if not (gdSelected in State) then
begin
Background := clWindow;
aFont.Color := clWindowText;
if not MyTableWORK_COMPLETE.AsInteger = 0 then
Background := $00DAD3FD
else
Background := $00D5FDFF;
end
else
begin
Background := clHighLight;
aFont.Color := clHighLightText;
end;
← →
Shorokhov © (2006-10-16 17:51) [2]P.S.
только вот во втором if-е операнд not лишний, опечатка :)
← →
ceval © (2006-10-16 17:53) [3]а в EhDBGrid есть такое
← →
Desdechado © (2006-10-16 18:00) [4]Не нужно тут никаких левых гридов.
В OnDrawCell пишем раскраску.
Поле со статусом можно сделать калькулируемым (CalculatedField+OnCalcField), а можно подстановочным (LookUpField), если есть справочник этих статусов.
← →
Игорь ЖАКО (2006-10-17 09:39) [5]>Desdechado
>
>Поле со статусом можно сделать калькулируемым (CalculatedField+OnCalcField).
а можно по подробние
← →
ЮЮ © (2006-10-17 09:45) [6]Начни сам с подровностей: кто и как определяет этот статус ВЫПОЛНЕНО,НЕВЫПОЛНЕНО, В РАБОТЕ ?
← →
Игорь ЖАКО (2006-10-17 10:49) [7]с самого начало - есть таблица с записями туда надо добавить поле для статуса записи (т.е что бы пользыватель посмотрел на запись и понял что это выполнено или не выполнено или в работе) как лутче это сделать
вот думаю воспользываться расширенным DBgrid"ом (скорее всего EhGrid -Ehlib) и в таблице создать поле "Status" и что бы в DBGride показывалась например картинка (галочка - ВЫПОЛ и тд) и заполнять например поле "Status" 1 , 2 , 3 а вот как потом ......
← →
Инопланетянин (2006-10-17 10:56) [8]> [7] Игорь ЖАКО (17.10.06 10:49)
Ты думаешь "про галочки" не уяснив себе (или не объяснив нам) сути "проблемы". Что есть "СТАТУС"? Как и кем он меняется?
← →
Sergey13 © (2006-10-17 10:58) [9]> [8] Инопланетянин (17.10.06 10:56)
Ой, это был я. Не перевоплотился. 8-)
← →
Игорь ЖАКО (2006-10-17 11:06) [10]Будет меняться пользывателем - при добавлении записи устанавливаеться статус не выполнено и потом можно будет редактировать запись и тогда менять состаяния статуса (Выполнено или в работе) - я думаю так может есть другие варианты
← →
MsGuns © (2006-10-17 11:07) [11]Если надо показывать "статус" записи, который определяет сам клиент (т.е. в БД такой информации нет), то никакие эх!либы, а тем более какие-то левыу мдбгриды не помогут.
Проблема решается путем создания списка "помеченных" записей, куда добавляются или откуда удаляются UID "отмеченных" пользователем записей. В событии перерисовки ячеек грида OnDrawColumnCell надо искать идентификатор текущей записи в списке (годится шустрый IndexOf при условии, что в список добавлялся не сам идентификатор, а преобразованный в стринг аналог) и, если есть, то либо рисовать галочку, либо менять цвет строки, либо еще как-либо выделять "отмеченную" запись.
Технология управления гридом прекрасно описана в статье "Полосатый грид" на Королевстве Дельфи.
ЗЫ. Не пытайтесь решать ВСЕ свои проблемы поиском "подходящих компонент", как советуют многие тут. Это верный путь к непрофессионализму и ламерству, труднонаходимым ошибкам и проклятьям в Ваш адрес тех, кому придется впоследствии разбирать Ваши проекты.
← →
Sergey13 © (2006-10-17 11:14) [12]> [10] Игорь ЖАКО (17.10.06 11:06)
Тогда чем это поле отличается от других полей? От каких нибудь "Кода" или "Наименования"? В чем проблема то? Надо - добавь. Лично я не против.
← →
ЮЮ © (2006-10-17 11:16) [13]
> Если надо показывать "статус" записи, который определяет
> сам клиент (т.е. в БД такой информации нет),
Насколько понял я,поле в базе присутствует. Для новой записи устанавливается "не выполнено", в дальнейшем может быть изменено.
Т.е. обычное поле, можно даже в БД "справочник" добавить.
Вопрос о раскраске грида хорошо освещен в "Разноцветный D B G R I D":
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=168
← →
Игорь ЖАКО (2006-10-17 11:18) [14]А возможно реализовать такое -
если в поле Status= 1 то вывести в dbgrid в поле статус определенную картинку а если =2 то другую а если =3 то третью
← →
Игорь ЖАКО (2006-10-17 11:20) [15]>MsGuns
>ЮЮ
сейчас почитаю
← →
Shorokhov © (2006-10-17 12:06) [16]Ну, сходу можно сделать так. Может корявенько, но проблему решит.
Заранее не известно, сколько статусов может быть у записи.
Например: 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;
← →
MsGuns © (2006-10-17 14:00) [17]>Shorokhov © (17.10.06 12:06) [16]
Не сочтите за обиду, но прежде чем писАть в форум, неплохо посмотреть на свои "труды" критически.
Этот Ваш код не просто далек от оптимальности и сверхгромоздок, но еще и потенциально глючен.
← →
Игорь ЖАКО (2006-10-17 14:03) [18]>Shorokhov
ADOQuery1 использую
> case MyTableSTATUS.AsInteger of - как переписать
← →
Игорь ЖАКО (2006-10-17 14:09) [19]подскажите как написать условия
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
← →
MsGuns © (2006-10-17 14:11) [20]>Игорь ЖАКО (17.10.06 14:03) [18]
> case MyTableSTATUS.AsInteger of - как переписать
Эту глупость никак не надо переписывать.
Послушайтесь совета: НИКОГДА НЕ ПЕРЕПИСЫВАЙТЕ ЧУЖОЙ КОД БЕЗДУМНО, не вникая в смысл каждой его строки
← →
Игорь ЖАКО (2006-10-17 14:15) [21]>Игорь ЖАКО [18]
вот я сейчас пытаюсь свой код написать
← →
ANB © (2006-10-17 14:20) [22]
> MyTableSTATUS.AsInteger
По хорошему это MyQuery.FieldByName("STATUS").AsInteger
← →
Игорь ЖАКО (2006-10-17 14:33) [23]>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:34) [24]
> подскажите как написать условия
А где условие ?
← →
ANB © (2006-10-17 14:35) [25]
> IF // рисуется колонка, в которую мы хотим поместить картинку
>
> // и выполняется условие для рисования картинки
Аааа. Понял. Вот тута. Смотришь ТЗ и переводишь с русского на делфи :)
← →
Игорь ЖАКО (2006-10-17 14:49) [26]//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 стали картинками
← →
Игорь ЖАКО (2006-10-17 14:51) [27]не не стали по верх их нарисовалась а надо только в одном поле и вместо
← →
ANB © (2006-10-17 15:17) [28]А теперь сесть и подумать, почему так вышло. Потом запустить отладчик и проверить свои мысли. После чего написать, как надо. А не дергать всех по пустякам. Для решения все уже дано. Написание полностью работающего кода стоит денег.
← →
MsGuns © (2006-10-17 15:38) [29]ImageList1.Draw(TDBGrid(Sender).Canvas,Rect.Left,Rect.Top,ADOQuery1.FieldByName( "STATUS").AsInteger);
И все !
Без всяких этажерок из Case или If
Только не забыть погасить вывод содержимого поля во избежание наложения картинки на текст. Это проще всего делается в обработчике OnGetText поля, которое "назначено" этой колонке грида:
Text := "";
← →
Игорь ЖАКО (2006-10-17 16:14) [30]Begin
if ADOQuery1.FieldByName("status").AsInteger=1 Then
Begin
ImageIndex:=0; //... { получим значение номера картинки в ImageList
// А теперь пусть ImageList нарисует ее на канве DBGrid"а
ImageList1.Draw(TDBGrid(Sender).Canvas,Rect.Left,Rect.Top,ADOQuery1.FieldByName( "status").AsInteger) ;
тоже самое, рисует в каждом поле
что-то я тут не понял про OnGetText
//BGrid1.Fields[0].OnGetText:="";
// Adoquery1.FieldByName("status").OnGetText :="";
выдает ошибку
← →
ANB © (2006-10-17 17:08) [31]упал под стул.
Игорь, займитесь теорией и прекратите отлаживаться на форуме. Книжки что ли почитайте.
← →
Игорь ЖАКО (2006-10-17 17:19) [32]я бы сейчс с удовольствием почитал бы книжки вот только нет сейчас под рукой только дома а сейчас на работе
← →
Игорь ЖАКО (2006-10-17 17:20) [33]Зарание спасиба ВСЕМ за терпение
← →
ANB © (2006-10-17 17:21) [34]
> а сейчас на работе
тебе на работе поручили это написать ? И сколько платят ?
← →
Игорь ЖАКО (2006-10-17 17:26) [35]нет я не программист
← →
ANB © (2006-10-17 17:34) [36]
> нет я не программист
тогда нафига тебе это надо ? Да еще и срочно. Лучше дома, не торопясь обдумай все советы. Посмотри на параметры своего обработчика. Решение - тривиальное.
← →
Игорь ЖАКО (2006-10-17 18:25) [37]Пошел другим путем установил DBGridEh
Column[i].ImageList – ImageList с картинками, Column[i].KeyList свойство типа Strings - каждая строка – значение поля, вместо которого будет подставляться картинка из ImageList с соотвествующим индексом;procedure TFmain.DBGrid1GetCellParams(Sender: TObject; Column: TColumnEh;
AFont: TFont; var Background: TColor; State: TGridDrawState);
begin
With Dbgrid1.Fields[0] do begin
ImageList1 := Self.ImageList1;
//табличка преобразований значения поля в картинку
Dbgrid1.Columns[0].KeyList.Add("0");
Dbgrid1.Columns[0].KeyList.Add("1");
Dbgrid1.Columns[0].KeyList.Add("2");
End;
если не сложно как правельно будет код [30]
← →
ANB © (2006-10-17 18:43) [38]
> procedure TFmain.DBGrid1GetCellParams(Sender: TObject; Column:
> TColumnEh;
> AFont: TFont; var Background: TColor; State: TGridDrawState);
>
> begin
> With Dbgrid1.Fields[0] do begin
> ImageList1 := Self.ImageList1;
> //табличка преобразований значения поля в картинку
> Dbgrid1.Columns[0].KeyList.Add("0");
> Dbgrid1.Columns[0].KeyList.Add("1");
> Dbgrid1.Columns[0].KeyList.Add("2");
> End;
Для эхлиба - это уже лишнее. Там визуально все настраивается
← →
Slym © (2006-10-18 05:21) [39]
procedure TCreditAgentListFr.ArcGridDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
if (Column.FieldName="Permit") then
begin
TDBGridEh(Sender).Canvas.FillRect(Rect);
if not Column.Field.IsNull then
if Column.Field.asBoolean then
StatusImg.Draw(TDBGrid(Sender).Canvas,Rect.Left+1,Rect.Top+1,0)
else
StatusImg.Draw(TDBGrid(Sender).Canvas,Rect.Left+1,Rect.Top+1,1);
end else
TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
← →
Slym © (2006-10-18 05:22) [40]Хреново скопипастил... писалось под TDBGridEh но для TDBGrid заменить TDBGridEh на TDBGrid
Страницы: 1 2 вся ветка
Форум: "Базы";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.05 c