Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Hello, World!
  
 

Фильтр по датам

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  10:05[Войти] | [Зарегистрироваться]

Обсуждение материала
Разноцветный D B G R I D
Полный текст материала


Другие публикации автора: Елена Филиппова

Цитата или краткий комментарий:

«... Представленный материал - это пример проекта, который реализует некоторые возможности по 'раскраске' компонента TDBGrid. Создание примера 'Разноцветный Grid' продиктовано тем, что вопрос о том, как 'раскрасить' строки grid'а в зависимости от каких-либо условий, является очень популярным на Круглом столе. И судя по тому, что ответ 'обрабатывайте событие OnDrawColumnCell' многих не вдохновляет, тема остается открытой. ...»


Важно:
  • Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
  • Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
  • При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
  • Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.



Добавить свое мнение.

Результаты голосования
Оценка содержания

  Содержит полезные и(или) интересные сведения
[1]3186.1%
 
  Ничего особенно нового и интересного
[2]38.3%
 
  Написано неверно (обязательно укажите почему)
[3]25.6%
 
Всего проголосовали: 36

Оценка стиля изложения

  Все понятно, материал читается легко
[1]2692.9%
 
  Есть неясности в изложении
[2]27.1%
 
  Непонятно написано, трудно читается
[3]00%
 
Всего проголосовали: 28




Смотрите также материалы по темам:
[TDBGrid] [Перерисовка компонент] [Multiselect] [Отображение списков, сеток]

Комментарии жителей
Отслеживать это обсуждение

Всего сообщений: 43

14-04-2020 03:03
Вы что обалдели???
Статья написана 20 лет назад!!!
И в течение 10 лет продолжали хвалить.
Да и сейчас актуальна )


30-05-2010 14:11
Огромное Вам спасибо! Перерывала весь инет раз за разом и никак не могла найти то, что надо! Теперь можно сделать задуманную фишку. Спасибо вам! И удачи в дальнейших изысканиях!


27-05-2010 15:36
Вопросы нужно задавать на Круглом Столе
 Geo


27-05-2010 04:17
как выделить удаленные записи?
так не работает
***
procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
  Field: TField; State: TGridDrawState);
begin
if  DataSource1.DataSet.UpdateRecord=usDeleted then
    with (Sender as TDBGridEh).Canvas do
    begin
      FillRect(Rect);
      Font.Style := Font.Style + [fsStrikeOut];
      Font.Color := clRed;
      if (Field.DataType = ftFloat) then
        TextOut(Rect.Right-TextWidth(Field.AsString)-3, Rect.Top+3, Field.AsString)
      else
        TextOut(Rect.Left+2,Rect.Top+3,Field.AsString);
    end;
end;


30-10-2009 09:53
Спасибо за статью! Подчерпнул казалось бы элементарные вещи, до которых сам не додумывался(не было необходимости). Теперь стало гораздо красивее.
 Sli


04-02-2009 08:17
Спасибо, отличная, понятная статья.
Начало хорошее.


27-01-2009 12:35
А у меня сработало с SQL СУБД (я работаю с PostgreSQL через ADO+ODBC), вот код:

  with (Sender as TDBGrid) do
    with Canvas do
      begin
        if DataSource.DataSet.RecNo mod 2 = 0 then
          begin
            Brush.Color:=clGradientInactiveCaption;
            FillRect(Rect);
            TextOut(Rect.Left+2,Rect.Top+2,Column.Field.Text);
          end;
        if gdSelected in State then
          begin
            Brush.Color:= clHighLight;
      Font.Color := clHighLightText;
      end;
        DefaultDrawColumnCell(Rect,DataCol,Column,State);
      end;



06-08-2008 05:42
Хотел дополнить про checkbox в ячейке в связи с выходом Windows XP и ее крутыми темами:

uses ..., UxTheme;
...
procedure TformColorGrid.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  Style: Integer;
  theme: HTHEME;
begin
  if { рисуется колонка, в которую мы хотим поместить TCheckBox } then
  begin
    if UseThemes then
      theme := OpenThemeData(Handle, 'BUTTON')
    else
      theme := 0;
    if theme = 0 then // классический CheckBox
    begin
      if { значение поля TRUE } then
        Style := DFCS_CHECKED
      else
        Style := DFCS_BUTTONCHECK;
      DrawFrameControl(TDBGrid(Sender).Canvas.Handle, Rect, DFC_BUTTON, Style);
    end
    else begin // CheckBox по теме
      if { значение поля TRUE } then
        Style := CBS_CHECKEDNORMAL
      else
        Style := CBS_UNCHECKEDNORMAL;
      DrawThemeBackground(theme, TDBGrid(Sender).Canvas.Handle, BP_CHECKBOX, Style, Rect, nil);
      CloseThemeData(theme);
    end;
  end;
end;



25-01-2008 05:34
Тут в тексте ошибка (КАК ОТМЕТИТЬ НЕСКОЛЬКО СТРОК ИЛИ "НЕ MultiSelect'ОМ ЕДИНЫМ...")


procedure TformColorGrid.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
Var Style   : Integer;  
Begin
IF СompareText(Column.FieldName , 'Check') = 0 Then
Then IF ListSelect.IndexOf(Pointer(TDBGrid(Sender).DataSource.
DataSet.FieldByName('Species No').AsInteger)) >= 0
Then Style := DFCS_CHECKED
Else Style := DFCS_BUTTONCHECK;
End;

DrawFrameControl(TDBGrid(Sender).Canvas.Handle, Rect, DFC_BUTTON, Style);
End;



Должно быть так:


if CompareText(Column.FieldName , 'Check') = 0 Then
  begin
  if ListSelect.IndexOf(Pointer(TDBGrid(Sender).DataSource.
DataSet.FieldByName('OPID').AsInteger)) >= 0
Then Style := DFCS_CHECKED
Else Style := DFCS_BUTTONCHECK;
DrawFrameControl(TDBGrid(Sender).Canvas.Handle, Rect, DFC_BUTTON, Style);
  end;



31-03-2007 08:39
сообщение от автора материала
Эти ветки предназначена для обсуждения статей.

Вопросы задают вот здесь:
http://www.delphikingdom.com/table/add.asp


31-03-2007 08:27
Доброго дня!
Такой вопрос: есть грид, отображающий данные не readonly (изменяемого) набора данных. Делаю checkbox в вычисляемом столбце по аналогии с тем, как описано в http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=168, но там написано для readonly набора данных. Чего хочется: несмотря на то, что объект-столбец (НЕ объект-поле!) имеет cd-во readonly при клике мыше по нему два раза или принахождении фокуса на нём и нажатии клавиши checkbox пропадает, т.к. набор данных изменяемый. Хочется, чтобы он не пропадал, но сохранить изменяемый набор данных и не использовать dgRowSelect=true. Как это сделать?
 sams


05-03-2007 03:54
Теперь все ОК. Прошу прощения, что сразу не внимательно прочитал. Сейчас разобрался. Спасибо большое
Сообщение не подписано


21-02-2007 02:13
сообщение от автора материала
При раскрашивании DBGrid'a, активные раскрашенные строки не подсвечиваются синим цветом.

В статье про это написано и приведен соответствующий код.
Смотрите в части "Полосатое окно":
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=168#link5


21-02-2007 01:43
Статья очень хорошая, но вот есть одна загвоздка. При раскрашивании DBGrid'a, активные раскрашенные строки не подсвечиваются синим цветом. Не могли бы вы подсказать мне решение этой проблемы?
Заранее благодарен.


23-08-2006 13:33
Извините ВСЕ!!!

Моя Ошибка в том что в методе рисования dbg2DrawColumnCell(
я использовал:
s_num := dbg2.Columns[dbg2.SelectedIndex].Title.Caption;

а не:
s_num := Column.Title.Caption;

В первом случаэ дельфи что то путал, во втором все идеально

ВОТ ТАК!!


23-08-2006 13:04
Добрый вечер!

Много всего сказано......

А столкнулся с такой задачей по раскраске
В таблице есть ячейки типа ексель где помещается результат вычеслений (это если компютер сам считает)
А если поле имеет признак "не считать" то должно  "красным"

Таблица:
d1,d2,...dn    integer   Значение (компютер/пользователь)
f1,f2,...fn    boolean   (True/False) Считать/не считать

В сетки видно поля "D1,d2,dn"

Кто знает помогите...


23-11-2005 07:10
Спасибо, то что нужно.


03-07-2003 01:01
Насчёт раскрашивания "через одну" без дергания датасета -

var Coord: TGridCoord;
begin
  Coord := (Sender as TDBGrid).MouseCoord(Rect.Left + 1, Rect.TOp + 1);
  if (Coord.Y mod 2 = 0) then
  begin
    (Sender as TDBGrid).Canvas.Brush.COlor := clLtGray;
  end
    else
  begin
    (Sender as TDBGrid).Canvas.Brush.COlor := clWindow;
  end;


25-12-2002 16:02
Всё отлично, кое-что перенял.
А есть что-то подобное, но для CBuilder ???
Перенесть многие "вкусные" вещи не получается.


09-12-2002 11:45
Хотелось бы продолжение видеть.
И еще одно замечание. Иногда для каждого типа поля (или даже для просто какого-то поля в какой-то отдельной записи) неплохо бы было иметь возможность вносить и изменять данные с помощью отдельного редактора, для целого типа, например, с помощью TSpinEdit, для других - с помощью TMaskEdit и т.д. Конечно, нельзя сказать, чтобы это было совсем уж невозможно, но структура класса такова, что реализация этих попыток скорее похожа на обман, а не мастерство. Скажем, существование события типа, например, OnCreateEditor, при котором в нужной ячейке создавался бы редактор и т.д., очень упростило бы жизнь. Кроме этого, есть все-таки некоторая непродуманность в компоненте. Попробуйте, например, определить, какая по счету строка сверху сейчас редактируется. Опять-таки, это можно сделать, но способа не обманывать, а использовать предоставленные компонентом возможности я не знаю. Хотелось бы увидеть ответы и на это.


06-12-2002 18:12
>>>Я было решил, что это ведь плохо. И до сих пор так думаю.

Скоро будет продолжение этой статьи и по теме заголовка тоже :о)


06-12-2002 17:45
Да, хорошая статья. А я как-то решил заголовок таблицы перерисовать. Так пришлось наследовать, поскольку функция рисования заголовка содержится в другой (не помню сейчас какой), а эта - не published.
Я было решил, что это ведь плохо. И до сих пор так думаю. Так посоветуйте что-нибудь попроще, если сможете, может, я не увидел простого пути какого-то.


13-11-2002 07:37
А можно ли как-то если у тебя в таблице разрешено редактирование, заблокировать колонку с чекбоксами для редактирования, чтобы там курсор не менялся и сама колонка не переходила в состояние редактирования, тогда не будет затираться чекбокс или картинка,
а так при двойном нажатии мышки все пропадает, что приводит к панике для конечного пользователя


13-08-2002 07:06
Очень интересная статья. Без жаргона, то бишь для всех людей.
Предлагаю ещё один вариант реализации 'галочки' в гриде.

procedure TForm1.FormCreate(Sender: TObject);
begin
  ADODataSet1.Open;
  ADODataSet1Add.DisplayValues := "a;";//'a'-галочка в шрифте Marlett
  with DBGrid1.Columns[3].Font do // укажите номер нужной колонки
  begin
    Name := "Marlett";
    Size := 10;
  end;
end;

procedure TForm1.DBGrid1ColEnter(Sender: TObject);
begin
  if DBGrid1.SelectedField = ADODataSet1Add
  then DBGrid1.Options := DBGrid1.Options - [dgEditing]
  else DBGrid1.Options := DBGrid1.Options + [dgEditing];
end;

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  if (DBGrid1.SelectedField = ADODataSet1Add) and (Key = " ") then
  begin
    if ADODataSet1.State = dsBrowse then ADODataSet1.Edit;
    ADODataSet1Add.Value := not ADODataSet1Add.Value;
  end;
end;

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
  if DBGrid1.SelectedField = ADODataSet1Add then
  begin
    if ADODataSet1.State = dsBrowse then ADODataSet1.Edit;
    ADODataSet1Add.Value := not ADODataSet1Add.Value;
  end;
end;

Я обычно использую этот способ. Мне кажется выглядит это более эстетично.


23-07-2002 13:49
  Добрый день всем. Пока не увидел полосатый грид, о нем даже мысли не возникало. А оказалась довольно приятная вещица :)
  Вот, кстати, компонент полосатый и для Query (записать в DBZebra.pas, скопировать в ...\lib\, установить в Дельфи компонент - на закладке Samples появится компонент Zebra. А дальше с ним работать как с обычным гридом). Правда писАл не я, а друг, но думаю он не обидится.
=====================================================================


unit DBZebra;

interface

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

type
  TDBZebra = class(TDBGrid)
  private
    FTop: Integer;
    { Private declarations }
  protected
    { Protected declarations }
    procedure Scroll(Distance: Integer); override;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    property Top: Integer read FTop;
  published
    { Published declarations }
  end;

procedure Register;

implementation

constructor TDBZebra.Create(AOwner: TComponent);
begin
  inherited;
  FTop := 1;
end;

procedure Register;
begin
  RegisterComponents("Samples", [TDBZebra]);
end;

procedure TDBZebra.Scroll(Distance: Integer);
begin
  FTop := FTop + Distance;
  inherited;
end;

end.


10-07-2002 18:07
Вот недавно только дорвался до Интернета, поэтому извините так скажем за опоздание.
Я бы сказал, что написано то верно, но вот в чем дело. Используя код описанный в ващей статье о 'Полосатом окне' в своем приложении заметил очень интересную штучку: допустим в какой-либо колонке, но обязательно в строке которая не является текущей, т.е. закрашена не белым цветом, содержится текст который не умещается полностью в ячейку - например, видно вместо 'самолет' 'само'(это так и должно быть при стандартном выводе), но у вас этого 'само' не видно, его как бы нет, и появляется он если только эта строка выделяется, а затем при переходе на другую опять исчезает. Так в чем здесь дело, и как это исправить? С уважением, SAVic.


17-06-2002 16:12
Ребята давай те поработаем над вопросами иногда они немного тупые, вот поставил себе Delphi 6 :) А у нас в пакетах дезайн тайм везде проставлен, для компонентов, и эксепшины так и валят. Кто может помочь?


24-03-2002 00:23
Уважаемая Елена. Посоветуйте реализацию только одной активной строки в гриде отмеченной чек боксом. т.е. при активации другого чек бокса -только он (другой) становиться активным и вместе с ним только 'его' строка
С надеждой
Александр


24-12-2001 00:12
Сначала не мог понять почему у меня пример
с CheckBox работает не совсем коректно пришлось
скачать пример и посмотреть оказалось Grid
редактировать нельзя. Мне кажется проще было указать
сразу в статье, что работает только в режиме для чтения.


16-11-2001 23:48
Елена, спасибо за полезную статью. Один наболевший вопрос, как сделать, чтобы длинный техт в ячейке переносился по словам и высота ячейки соотвестсвующая устанавливалась (как в Excel)?


26-10-2001 04:17
Елена, не могли бы Вы мне помочь со следующим вопросом: как раскрасить ТОЛЬКО текущую (выделенную) строку, соответствующую текущей записи? Мне необходимо, чтобы получилось следующее: вся активная строка выделена одним цветом, а активная ячейка другим.


25-10-2001 10:59
Сергею : Вы говорите глупости, уж извините за резкий тон. От типа TdataSet никак не зависит раскраска грида. Уж можете мне поверить, мне пришлось их покрасить не мало. И для TQuery и для TStoredProc и TClientDataSet. Алгоритм раскраски НЕ зависит  от способа получения данных, как и от типа СУБД.


25-10-2001 03:57
Раскраска идёт в соответствии с условиями, которые беруться из полей, а если условием является текущая запись, т.е. надо раскрасить всю ТОЛЬКО выделенную строку.


25-06-2001 11:33
С компонентом Table - все работает. Но если  поставить Query - форматирование ячеек теряется. Получается тема не совсем исчерпана.
С уважением, Сергей.


06-04-2001 17:05
Ситуация: Есть DBGrid и к примеру два DataSource, в которые данные поступают из Query. Как во время выполнения программы, переключить DBGrid на работу вначале с первым DataSource, потом со вторым ?
Зарание спасибо !!!


17-12-2000 08:12
Статья, конечно же, интересная.
Здесь не форум, но всё-таки у меня есть вопрос, на который ответ почему-то не находится. Хочется раскрасить следующим образом:
длинная база отсортирована (например) по людям, записей на каждого много. Как только 'людь' сменился - меняем цвет фона. Цветов всего два - то тот, то другой. Если кто догадывается об ответе - можно мылом. Спасибо.


20-09-2000 13:00
Присоединяюсь ко всему нижесказанному,действительно очень полезная статья, но, к сожалению, я нашел в ней не все ответы на свои вопросы.
Хотелось бы увидеть еще и ее продолжение, ведь наверняка накопились еще вопросы по этой теме, которые не затронуты в статье. Как, например, сделать так, чтобы при отрисовке(изменении размеров, прокрутке и т.д.) грида не было пустого пространства между последней колонкой и полосой прокрутки?

С уважением, Сергей
Сообщение не подписано


09-09-2000 05:48
Полезно и просто!


08-09-2000 18:51
А что значит 'редактировать' ?
Вопрос не ясен. И лучше вопросы отдельно от обсуждений задавать :о)


06-09-2000 19:10
Понятно, полезно.
А можно вопрос!
Как чекбокс потом редактировать?! Как бы его отобразили, а редактировать не знаю...


22-05-2000 03:28
Казалось бы, всякие Grid"ы практически всегда сама рисую, а о DrawFrameControl не знала... Спасибо!


17-05-2000 18:19
Все понятно, но мне кажется чайникам это ненужно. Я лично только один раз воспользовался On_GetText. Остальное всегда старался делать стандартно.


12-05-2000 18:15
Прочитал статью и обалдел.
Я так думаю, даже самый тупой чайник должен во все врубиться после прочтения статьи.
Да, не зря наша Королева является Королевой.

С уважением Олег.


Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Два кольца, два конца, посередине гвоздик.
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.

Оценка содержания
 
Содержит полезные и(или) интересные сведения
 
Ничего особенно нового и интересного
 
Написано неверно (обязательно укажите почему)


Оценка стиля изложения
 
Все понятно, материал читается легко
 
Есть неясности в изложении
 
Непонятно написано, трудно читается

Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования