Текущий архив: 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