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

Вниз

Опялть про Dbgrid   Найти похожие ветки 

 
Report3   (2006-03-20 14:16) [0]

Задавал этот вопрос уже раза 2 минимум. Никак не могу найти ответ. Уже и ссылки мне давали на нужные статьи и направление указывали (в смысле где ответ искать :) ), но никак не могу разрешить поставленную задачу. Пж-та, если есть люди, которые могут снисходительно и благородно отнестись к ламерским вопросам юного программиста, занимаюшегося Делфи исключительно по-любительски, то просьба ответить на мой вопрос.

Вопрос простой. Основная мысль заключается в том, чтобы рисовать выделенную ячейку одним цветом, а строку в которой находится ячейка другим цветом. Поиски привели к событию OnDrawColumnCell.

Использую такой код:
if DBGrideh1.DataSource.DataSet.RecNo=adotable1.RecNo then
if gdFocused IN State then begin
DBGrideh1.Canvas.Brush.Color:=clRed;
end
else begin
DBGrideh1.Canvas.Brush.Color:=clBlue;
end;

DBGrideh1.Canvas.FillRect(Rect);
DBGrideh1.Canvas.TextOut(Rect.Left+2,Rect.Top+2,Column.Field.Text);


При этом: dgRowSelect в False и AlwaysShowEditor у меня установлен в False.

Проблема в том, что в результате выполнения кода весь DBGrideh1 синий, а красным цветом выделена редактируемая ячейка. Как быть? Ведь необходимо выделить синим цветом только строку, а не весь DBGrideh?


 
MBo ©   (2006-03-20 14:23) [1]

у тебя не выбирается цвет для невыделенных строк
if DBGrideh1.DataSource.DataSet.RecNo<>adotable1.RecNo then
DBGrideh1.Canvas.Brush.Color:=clWhite;
else begin
if gdFocused IN State then begin
DBGrideh1.Canvas.Brush.Color:=clRed;
end
else begin
DBGrideh1.Canvas.Brush.Color:=clBlue;
end;
end;


 
Report3   (2006-03-20 14:34) [2]

if DBGrideh1.DataSource.DataSet.RecNo<>adotable1.RecNo then begin
DBGrideh1.Canvas.Brush.Color:=clWhite;
end
else begin
if gdFocused IN State then begin
DBGrideh1.Canvas.Brush.Color:=clRed;
end
else begin
DBGrideh1.Canvas.Brush.Color:=clBlue;
end;
end;

НЕ работает!!! 3 день ничего не помогает!!! Опять весь Dbgrid красится синим.


 
MBo ©   (2006-03-20 14:53) [3]

Я с базами данных не работал, но подозрение тогда вызывает корректность определения текущей записи:
if DBGrideh1.DataSource.DataSet.RecNo<>adotable1.RecNo


 
Report3   (2006-03-20 14:59) [4]

Да, наверное, здесь и косяк! Тогда как правильно определять текущую запись?


 
Johnmen ©   (2006-03-20 15:02) [5]

Обрати внимание на параметр State.
Ещё раз внимательно http://delphikingdom.ru/asp/viewitem.asp?catalogid=168


 
Report3   (2006-03-20 15:08) [6]


> Обрати внимание на параметр State.

Ну, я же говорю! НЕ разу не грамотный и статья мне как ежу футболка. 5 раз ее перечитываю и там сказано:

В обработчике этого события нам доступны:
сам DBGrid (это не что иное, как Sender),
текущая колонка - та, ячейка из которой сейчас перерисовывается (DataCol и Column),
прямоугольник Rect, который содержит эту ячейку
и ее состояние State ( выделена, в фокусе и т.д.)

Дальше в примере:  
IF  gdSelected   IN State
Then Begin

Но gdselected подразумевает выделенную строку, а здесь речь идет о ячейке, поэтому я использую gdFocused


 
Johnmen ©   (2006-03-20 15:16) [7]


> Но gdselected подразумевает выделенную строку, а здесь речь
> идет о ячейке, поэтому я использую gdFocused


А что ты подразумеваешь под  DBGrideh1.DataSource.DataSet.RecNo<>adotable1.RecNo?


 
Report3   (2006-03-20 15:18) [8]

Ну, может я не прав, но мне кажется, что это должно помочь определить текущую запись, чтобы выделить именно ее. Судя потому что код не работает, я ошибаюсь :), но как быть честно говоря не знаю. Может вы подскажите?


 
Johnmen ©   (2006-03-20 15:54) [9]


> Но gdselected подразумевает выделенную строку, а здесь речь
> идет о ячейке,


Подразумевает выделенную ячейку, о чём в хелпе и пишут.

Итак, какое же выделение цветом требуется? Поподробней...


 
Report3   (2006-03-20 16:06) [10]

Итак! Я согнал в мозги в кучку посему постараюсь ответить на вопрос четко.

Картина должна выглядеть следующим образом: пользователь кликает на ячейку и тут эта ячейка становится красной (к примеру), а строка в которой эта самая ячейка становится синей! Т.е пользователь видит выделенную строку (выделенную относительно других строк) и в этой же выделенной строке он видит выделенную ячейка, но с другим цветом.

Вот как это смотрится на картинке.
http://forum.ixbt.com/post.cgi?id=attach:26:34113:0:1
Картинка нарисована вручную в ПэинтБраше, а нужно программно и в Делфи.

Таким образом, на вопрос
> Итак, какое же выделение цветом требуется?

Отвечаю! Нужно выделение и ячейки и строки!


 
Игорь Шевченко ©   (2006-03-20 16:33) [11]

unit main;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 Grids, DBGrids, Db, DBTables;

type
 TForm1 = class(TForm)
   DataSource1: TDataSource;
   Table1: TTable;
   Grid: TDBGrid;
   procedure GridDrawColumnCell(Sender: TObject; const Rect: TRect;
     DataCol: Integer; Column: TColumn; State: TGridDrawState);
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

type
 TDBGridCracker = class(TCustomDBGrid);

procedure TForm1.GridDrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
 if gdFocused in State then
   Grid.Canvas.Brush.Color := clMaroon
 else if (Rect.Top = TDBGridCracker(Grid).CellRect(TDBGridCracker(Grid).Col,
                                TDBGridCracker(Grid).Row).Top) and
    (not (gdFocused in State) or not Grid.Focused) then
   Grid.Canvas.Brush.Color := clAqua;
 Grid.DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;

end.


 
Report3   (2006-03-20 16:51) [12]

Блин! 3 человека с голубыми значками объесняли мне ламеру как решить мою простую задачу! И ведь никто не сказал грубсотей типа: "убей себя ап стенку" или "выпей яду". Все отнеслись с пониманием и выдержкой. В связи с этим!

Большое Вам спасибо уважаемые! Очень Вам признателен и благодарен! Особый респект Игорю Шевченко!!! Спасибо!!!


 
sniknik ©   (2006-03-20 17:09) [13]

> И ведь никто не сказал грубсотей типа: "убей себя ап стенку" или "выпей яду".
выпей яду!!!

так проще (+ фонт если фокус на другом компоненте не станет черным, трудноразлечимым на синем)

type
 TDBGridCracker = class(TDBGrid);

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
 with TDBGridCracker(Sender) do begin
   if (DataLink.ActiveRecord = Row - 1) then begin
     if gdSelected in State then Canvas.Brush.Color:= clRed
                                   else Canvas.Brush.Color:= clBlue;
     Canvas.Font.Color:= clWhite;
     DefaultDrawColumnCell(Rect, DataCol, Column, State);
   end;
 end;
end;


 
Report3   (2006-03-20 17:21) [14]

Столько щастья в один день :) Уже 4 человека с голубыми значками ответили мне!!! Наверное, это рекорд. :)

2 sniknik
Спасибо за помощь!



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

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

Наверх




Память: 0.51 MB
Время: 0.046 c
2-1142574754
Officeman
2006-03-17 08:52
2006.04.02
html page


2-1142850331
Officeman
2006-03-20 13:25
2006.04.02
Динамич доб.колонок в TListView


15-1141736854
Lomant
2006-03-07 16:07
2006.04.02
Попытка №5:)


2-1142413592
Cashmare
2006-03-15 12:06
2006.04.02
RichEdit


8-1130151436
Fedelio_
2005-10-24 14:57
2006.04.02
Компрессия в MPEG2 с использованием DirectShow