Текущий архив: 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.48 MB
Время: 0.05 c