Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];

Вниз

Опялть про 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.038 c
9-1127285948
Kerk
2005-09-21 10:59
2006.04.02
Игра "Точки"


2-1142694523
Adios
2006-03-18 18:08
2006.04.02
Как проверить существует ли папка?


2-1142873793
mrAndersen
2006-03-20 19:56
2006.04.02
Активизация после нажатия на ENTER


8-1130477605
Idx
2005-10-28 09:33
2006.04.02
Как убрать черные(слишком темные) тений в ImageList


3-1139375320
Marat
2006-02-08 08:08
2006.04.02
Local Engine





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский