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

Вниз

DBGridEh.OnDrawColumnCell не работает отрисовка при потере фокуса   Найти похожие ветки 

 
DelphiLexx ©   (2006-11-17 14:36) [0]

В ячейках первой таблицы у меня отображается маленькая пиктограмма и текст.

procedure
 DBGridDrawCellPicture(Sender: TObject; img: TImageList; AText: string;
   State: TGridDrawState; AFontColor: TColor; IconNum: integer;
   ARect: TRect; AFontStyle: TFontStyles);
var
 bm: TBitmap;
begin

 with TDBGrid(Sender).Canvas do
 begin
   bm := TBitmap.Create;
   bm.Transparent := true;
   try
     if img.GetBitmap(IconNum, bm) then
     begin
       if State = [gdSelected, gdFocused] then
         Font.Color := clWhite
       else
         Font.Color := AFontColor;
       Font.Style := TFontStyles(AFontStyle);
       FillRect(ARect);
       TextOut(ARect.Left + 17, ARect.Top + 1, AText);
       Draw(ARect.Left, ARect.Top, bm);
     end;
   finally
     bm.Free;
   end;
 end;
end;

procedure
 TfmExmplForm.dgrDDBDrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumnEh; State: TGridDrawState);
begin

  DBGridDrawCellPicture(Sender, ImageList.ilSmall,
     fdsDct.FieldByName(GetNamingField).AsString, state, clBlack,  25, Rect, [fsBold])
end;

При потере гридом фокуса картинка не отображается. Как этого избежать?


 
clickmaker ©   (2006-11-17 14:41) [1]

подозреваю, что замешаны в этом безобразии  bm.Transparent := true; и else  Font.Color := AFontColor;


 
DelphiLexx ©   (2006-11-17 14:46) [2]


> подозреваю, что замешаны в этом безобразии  bm.Transparent
> := true; и else  Font.Color := AFontColor;

Ну а как надо сделать?


 
clickmaker ©   (2006-11-17 14:50) [3]

кстати, о птичках. У ImageList уже есть метод Draw


 
DelphiLexx ©   (2006-11-17 14:51) [4]


> подозреваю, что замешаны в этом безобразии  bm.Transparent
> := true; и else  Font.Color := AFontColor;
Мне, кажется, что bm.Transparent и Font.Color здесь не причем. Просто как-то надо заставить грид производить отрисовка даже тогда, когла он теряет фокус.


 
DelphiLexx ©   (2006-11-17 14:51) [5]


> кстати, о птичках. У ImageList уже есть метод Draw

И что дальше? Хочешь сказать можно им как-то рисовать на гриде? Тогда как?


 
clickmaker ©   (2006-11-17 14:53) [6]


> Хочешь сказать можно им как-то рисовать на гриде? Тогда
> как?

а за пивком не сбегать?
ты за рулем - ты и тормози. Мне лень. Я тебе слабые места показал, идейку подкинул


 
DelphiLexx ©   (2006-11-17 14:58) [7]


> а за пивком не сбегать?
> ты за рулем - ты и тормози. Мне лень. Я тебе слабые места
> показал, идейку подкинул

Так проблемы не решаются. Кидаешь на пол пути.


 
clickmaker ©   (2006-11-17 15:21) [8]


> Так проблемы не решаются

ну так будь чиста реальным пацаном. Покажи, как решаются проблемы ;)


 
Anatoly Podgoretsky ©   (2006-11-17 15:40) [9]

> DelphiLexx  (17.11.2006 14:51:04)  [4]

Для того что бы заставить грид перерисоваться, надо изменить значение в любой ячейке в видимой части.


 
clickmaker ©   (2006-11-17 15:54) [10]


> [9] Anatoly Podgoretsky ©   (17.11.06 15:40)

у него же фокус уходит, и иконка пропадает, как он говорит. значит, таки грид перерисовывается


 
Anatoly Podgoretsky ©   (2006-11-17 16:17) [11]

> clickmaker  (17.11.2006 15:54:10)  [10]

Не слишком много я верю его словам.


 
DelphiLexx ©   (2006-11-17 16:23) [12]


> Не слишком много я верю его словам.

100% истина


 
DelphiLexx ©   (2006-11-17 16:59) [13]


> 100% истина

Объясню подробнее свою задачу. У меня два грида связаны между собой по принципу мастер-деталь. В главном гриде в первой колонке отображается картиночка с текстом. Если в Options главного грида отключить опцию dgAlwaysShowSelection, то при потере гридом фокусом все прорисовывается кроме первой колонки (продает и текст и картинка) в связи с этим пришлось включить опцию dgAlwaysShowSelection. Но даже эта опция не помагает если я устанавливаю курсор на подчиненную таблицу, в первой колонке главной таблицы текст отображается, а вот картинка нет. Как этот гридовский баг исправить?


 
KilkennyCat ©   (2006-11-18 07:28) [14]

> [13] DelphiLexx ©   (17.11.06 16:59)


если это баг, то логичнее к производителю обратиться.
если это не баг, то логичнее проверить все досконально... если проект достаточно большой, создать новый, и попытаться в нем реализовать эту проблему.

P. S.
У мня ничего не пропало.


 
atruhin ©   (2006-11-18 12:21) [15]

У меня работает.

procedure TooListObjectView.DrawColumnCell(const Rect: TRect;
 DataCol: Integer; Column: TColumnEh; State: TGridDrawState);
var
 ImList : TImageList;
 Ind    : integer;
 IconName : string;
 ClassInfo : TClassInfo;
begin
 if Assigned(OnDrawColumnCell)
 then inherited
 else begin
   if Assigned(DataSource) and Assigned(DataSource.DataSet) and
      (fShowIcon) and (CmpString(Column.FieldName, "STATUS")) then begin
     Canvas.FillRect(Rect);
     ImList := ooMainAPI.Classes.ImageList16;
     ClassInfo := ooMainAPI.Classes.ClassByID(
                             DataSource.DataSet.FieldByName("CLASS_ID").Value);
     IconName := "icon16status" + Column.DisplayText + "@" + ClassInfo.Name;
     Ind := ooMainAPI.Classes.Icon16Index(IconName);
     if Ind > 0
       then ImList.Draw(Canvas, rect.Left,rect.Top, Ind, true );
   end else DefaultDrawColumnCell(Rect,DataCol,Column,State);
 end;
end;


 
atruhin ©   (2006-11-18 12:21) [16]

Забыл, это наследник от DBGridEh


 
DelphiLexx ©   (2006-11-20 09:13) [17]


> У меня работает.
Все равно если я устанавливаю курсор на подчиненную таблицу картинока перестается отрисовываться.


 
DelphiLexx ©   (2006-11-20 09:14) [18]


> Забыл, это наследник от DBGridEh

Может быть, в свойствах грида надо что-нибудь поставить?


 
ЮЮ ©   (2006-11-20 09:37) [19]

перед FillRect(ARect) я бы все-таки определил бы Brush.Color


 
ЮЮ ©   (2006-11-20 09:52) [20]

Да и учловие  State = [gdSelected, gdFocused] какое-то некузявое

(gdSelected in State ) or (gdFocused in State) было бы, наверно, правильней. Ибо gdFocused наверняка выпадает из State  при потере фокуса


 
DelphiLexx ©   (2006-11-20 15:38) [21]


> устанавливаю курсор на подчиненную таблицу картинока перестается
> отрисовываться

Когда я устанавливаю курсор на подчиненную таблицу картинока перестается отрисовываться и процедура OnDrawColumnCell просто напросто не вызывается - определил через Windows.Beep.


 
ЮЮ ©   (2006-11-21 04:10) [22]


> Когда я устанавливаю курсор на подчиненную таблицу картинока
> перестается отрисовываться и процедура OnDrawColumnCell
> просто напросто не вызывается - определил через Windows.
> Beep.


А зачем её отрисовываться, если этот грид никто не трогает? Последний раз он отрисовывается при потере фокуса, причем только выделенная ячека.  И это должно быть понятно уже по тому, что картинка не отрисовалась. Но ячейка то отрисовалась, коль картинка пропала.
См.[20]


 
DelphiLexx ©   (2006-11-21 08:55) [23]


> См.[20]

Да пробовал я как в [20] эффект тот же самый.


 
DelphiLexx ©   (2006-11-21 09:02) [24]


> См.[20]

Да и причем здесь [gdSelected, gdFocused] если это условие влияет на цвет текста в ячейке.


 
ЮЮ ©   (2006-11-21 09:36) [25]

А при чем здесь всё остальное?

Не поленился и создал два грида, безо всяких доп.настроек, два датасета, один подчиненный и код из subj-а. Всё работает, как  и ожидаолсь. Никуда картинки не пропадают.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Grids, DBGrids, DB, DBTables, DBGridEh, ImgList;

type
 TForm1 = class(TForm)
   Database1: TDatabase;
   Query1: TQuery;
   DataSource1: TDataSource;
   Edit1: TEdit;
   Button1: TButton;
   Query2: TQuery;
   DataSource2: TDataSource;
   DBGrid1: TDBGridEh;
   DBGrid2: TDBGridEh;
   ImageList1: TImageList;
   procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
     DataCol: Integer; Column: TColumnEh; State: TGridDrawState);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure DBGridDrawCellPicture(
 Sender: TObject; img: TImageList; AText: string;
 State: TGridDrawState; AFontColor: TColor; IconNum: integer;
 ARect: TRect; AFontStyle: TFontStyles
);
var
bm: TBitmap;
begin

with TDBGrid(Sender).Canvas do
begin
  bm := TBitmap.Create;
  bm.Transparent := true;
  try
    if img.GetBitmap(IconNum, bm) then begin
      if (gdSelected in State) or  (gdFocused in State) then
        Font.Color := clWhite
      else
        Font.Color := AFontColor;
      Font.Style := TFontStyles(AFontStyle);
      FillRect(ARect);
      TextOut(ARect.Left + 17, ARect.Top + 1, AText);
      Draw(ARect.Left, ARect.Top, bm);
    end;
  finally
    bm.Free;
  end;
end;
end;

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumnEh; State: TGridDrawState);
begin
DBGridDrawCellPicture(
  Sender, ImageList1, Column.Field.AsString, state, clBlack,  0, Rect, [fsBold]
)
end;

end.


Так что ищи ошибки в коде.


 
DelphiLexx ©   (2006-11-21 10:25) [26]


> Так что ищи ошибки в коде.

После долгой трасировки - ты оказался прав. Ошибку у себя я нашел. Спасибо всем за участие. Тема закрыта.



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

Текущий архив: 2007.01.14;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.041 c
2-1167002092
Vladimir1984
2006-12-25 02:14
2007.01.14
Как получить цвет отдельного пикселя на панели...


1-1164380543
BBCHa
2006-11-24 18:02
2007.01.14
Установка форматов в Excele


15-1166600124
EkZot
2006-12-20 10:35
2007.01.14
Макросы в Excel


15-1166877481
КВАНТ
2006-12-23 15:38
2007.01.14
Helpы про WinAPI


15-1165853702
ProgRAMmer Dimonych
2006-12-11 19:15
2007.01.14
Вопрос, наверное, не новый...