![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поле для статуса записи [Access]
Игорь ЖАКО © (2006-10-16 17:40:00)Подскажите как можно реализовать такую фичу
надо поле(для статуса записи) для показа в Dbgrid информации о выполнении т.е ВЫПОЛНЕНО,НЕВЫПОЛНЕНО, В РАБОТЕ и подсветка различными цветами
может есть такой расширенный dbgrid
Игорь ЖАКО (2006-10-19 09:54:00) [1]Огромное Спасиба всем особенно MsGuns
Slym (2006-10-19 05:00:00) [2]Какие у нас классные программисты:
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-18 16:29:00) [3]Вот рабочий код, не знаю правельно или нет зато работает
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
ANB (2006-10-18 14:55:00) [4]
> If Column.FieldName='status' then
судя по вот этому коду вообще отрисовки быть не должно, т.к. поле в колонке обычно в верхнем регистре хранится.
Вывод : исходник приведен не из программы. Или не тот кусок исходника.
MsGuns (2006-10-18 14:11:00) [5]Зачем Вам переменная ItemIndex, если индекс картинки Вы вытаскиваете непосредственно из поля записи датасета ?
Приведите полный текст обработчика, а не только "рисующий" кусок.
Игорь ЖАКО (2006-10-18 14:02:00) [6]Все равно ерунда получаеться все поля 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 12:49:00) [7]>Игорь ЖАКО (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 12:29:00) [8]>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 10:15:00) [9]>Игорь ЖАКО (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 := '';
Slym (2006-10-18 05:22:00) [10]Хреново скопипастил... писалось под TDBGridEh но для TDBGrid заменить TDBGridEh на TDBGrid
Slym (2006-10-18 05:21:00) [11]
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;
ANB (2006-10-17 18:43:00) [12]
> 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;
Для эхлиба - это уже лишнее. Там визуально все настраивается
Игорь ЖАКО (2006-10-17 18:25:00) [13]Пошел другим путем установил 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 17:34:00) [14]
> нет я не программист
тогда нафига тебе это надо ? Да еще и срочно. Лучше дома, не торопясь обдумай все советы. Посмотри на параметры своего обработчика. Решение - тривиальное.
Игорь ЖАКО (2006-10-17 17:26:00) [15]нет я не программист
ANB (2006-10-17 17:21:00) [16]
> а сейчас на работе
тебе на работе поручили это написать ? И сколько платят ?
Игорь ЖАКО (2006-10-17 17:20:00) [17]Зарание спасиба ВСЕМза терпение
Игорь ЖАКО (2006-10-17 17:19:00) [18]я бы сейчс с удовольствием почитал бы книжки вот только нет сейчас под рукой только дома а сейчас на работе
ANB (2006-10-17 17:08:00) [19]упал под стул.
Игорь, займитесь теорией и прекратите отлаживаться на форуме. Книжки что ли почитайте.
Игорь ЖАКО (2006-10-17 16:14:00) [20]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 :='';
выдает ошибку