Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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


 
MsGuns ©   (2006-10-18 10:15) [41]

>Игорь ЖАКО   (17.10.06 16:14) [30]
>ImageList1.Draw(TDBGrid(Sender).Canvas,Rect.Left,Rect.Top,ADOQuery1.FieldByName ( "status").AsInteger)  ;
>тоже самое, рисует в каждом поле

Перед прорисовкой надо выполнить проверку ячейки, для которой выполняется перерисовка:

If Column.FieldName=имя поля, вместо содержимого которого рисуется картинка

>что-то я тут не понял про OnGetText
> Adoquery1.FieldByName("status").OnGetText :="";  
>выдает ошибку

В событии филда ;)
Двойной клик на компоненте TADOQuery, в появившемся редакторе полей датасета найти то поле, которое отображается в колонке, где надо рисовать иконку. В окне инспектора объектов на закладке "События" (Events) встать курсором на OnGetText и дважды щелкнуть. Затем в том месте, где окажется курсор, набрать между Begin и end

  Text := "";


 
Игорь ЖАКО   (2006-10-18 12:29) [42]

>MsGuns
C OnGetText разобрался
вот что-то с проверкой ячейки не разберусь

  begin
if ADOQuery1.FieldByName("status").AsInteger=1 Then
 If  Column.FieldName="status" then
   ImageIndex:=1;
       ImageList1.Draw(TDBGrid(Sender).Canvas,Rect.Left,Rect.Top,ADOQuery1.FieldByName( "status").AsInteger)  ;
end;


 
MsGuns ©   (2006-10-18 12:49) [43]

>Игорь ЖАКО   (18.10.06 12:29) [42]
>MsGuns
 begin
if ADOQuery1.FieldByName("status").AsInteger=1 Then  
If  Column.FieldName="status" then
  ImageIndex:=1;  
    ImageList1.Draw(TDBGrid(Sender).Canvas,Rect.Left,Rect.Top,ADOQuery1.FieldByName(  "status").AsInteger)  ;
end;

Наклонным выделено лишнее


 
Игорь ЖАКО   (2006-10-18 14:02) [44]

Все равно ерунда получаеться все поля DBgrida прорисовываються
не только колонка status


procedure TFmain.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn; State: TGridDrawState);
 Var ImageIndex   : Integer;
If  Column.FieldName="status" then
   ImageList1.Draw(TDBGrid(Sender).Canvas,Rect.Left,Rect.Top,ADOQuery1.FieldByName(   "status").AsInteger)  ;



 
MsGuns ©   (2006-10-18 14:11) [45]

Зачем Вам переменная ItemIndex, если индекс картинки Вы вытаскиваете непосредственно из поля записи датасета ?

Приведите полный текст обработчика, а не только "рисующий" кусок.


 
ANB ©   (2006-10-18 14:55) [46]


> If  Column.FieldName="status" then

судя по вот этому коду вообще отрисовки быть не должно, т.к. поле в колонке обычно в верхнем регистре хранится.
Вывод : исходник приведен не из программы. Или не тот кусок исходника.


 
Игорь ЖАКО   (2006-10-18 16:29) [47]

Вот рабочий код, не знаю правельно или нет зато работает

procedure TFmain.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn; State: TGridDrawState);

 Var ImageIndex   : Integer;
  begin
      if Column.FieldName = "Status" then
if ADOQuery1.FieldByName("status").AsInteger=0 Then
 ImageIndex:=0;
  ImageList1.Draw(TDBGrid(Sender).Canvas,Rect.Left,Rect.Top, ImageIndex);
   if Column.FieldName = "Status" then
if ADOQuery1.FieldByName("status").AsInteger=1 Then
 ImageIndex:=1;
  ImageList1.Draw(TDBGrid(Sender).Canvas,Rect.Left,Rect.Top, ImageIndex);
    if Column.FieldName = "Status" then
if ADOQuery1.FieldByName("status").AsInteger=2 then
ImageIndex:=2;
ImageList1.Draw(TDBGrid(Sender).Canvas,Rect.Left,Rect.Top,ImageIndex)
end;


Вся соль была в ADOQuery1.FieldByName(   "status").AsInteger


 
Slym ©   (2006-10-19 05:00) [48]

Какие у нас классные программисты:
if ADOQuery1.FieldByName("status").AsInteger=0 Then
ImageIndex:=0;

вот так надо:

procedure TFmain.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
var ImageIndex:integer;
begin
 if Column.FieldName="Status" then
 begin
   TDBGrid(Sender).Canvas.FillRect(Rect);
   ImageIndex:=Column.Field.AsInteger;
   if (ImageIndex<ImageList1.Count) and (ImageIndex>=0) then
     ImageList1.Draw(TDBGrid(Sender).Canvas,Rect.Left,Rect.Top,ImageIndex);
end else
  TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;



 
Игорь ЖАКО   (2006-10-19 09:54) [49]

Огромное Спасиба всем особенно MsGuns



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.051 c
1-1163459204
Morrison
2006-11-14 02:06
2006.12.31
Кто знаком с KAZip? Не получаются элементарные вещи... :(


15-1165567647
Jeer
2006-12-08 11:47
2006.12.31
Задачка, чтоб не скучать.


8-1145632081
hbreaker
2006-04-21 19:08
2006.12.31
Аналог ACDSee


4-1156274077
Dot
2006-08-22 23:14
2006.12.31
поиск hwnd одного из двух окон


2-1166106304
webpauk
2006-12-14 17:25
2006.12.31
Записи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский