Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.31;
Скачать: CL | DM;

Вниз

Поле для статуса записи   Найти похожие ветки 

 
Игорь ЖАКО   (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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.054 c
15-1165563723
vitv
2006-12-08 10:42
2006.12.31
Какая книга лучше?


15-1165500303
Караед
2006-12-07 17:05
2006.12.31
ПОМОГИТЕ РАЗОБРАТЬСЯ С ЗАДАЧЕЙ


2-1165911751
Aks13
2006-12-12 11:22
2006.12.31
Программно нажать кнопку на форме


15-1165555633
Александр Иванов
2006-12-08 08:27
2006.12.31
Аналог RAdmin


2-1165992803
031178
2006-12-13 09:53
2006.12.31
SaveDialog