| | | | |
Полный текст материала
Другие публикации автора: Елена Филиппова
Цитата или краткий комментарий: «... Представленный материал - это пример проекта, который реализует некоторые возможности по 'раскраске' компонента TDBGrid.
Создание примера 'Разноцветный Grid' продиктовано тем, что вопрос о том, как 'раскрасить' строки grid'а в зависимости от каких-либо условий, является очень популярным на Круглом столе. И судя по тому, что ответ 'обрабатывайте событие OnDrawColumnCell' многих не вдохновляет, тема остается открытой. ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
| | Содержит полезные и(или) интересные сведения | [1] | 31 | 86.1% | | | | Ничего особенно нового и интересного | [2] | 3 | 8.3% | | | | Написано неверно (обязательно укажите почему) | [3] | 2 | 5.6% | | Всего проголосовали: 36 | | | Все понятно, материал читается легко | [1] | 26 | 92.9% | | | | Есть неясности в изложении | [2] | 2 | 7.1% | | | | Непонятно написано, трудно читается | [3] | 0 | 0% | | Всего проголосовали: 28 |
[TDBGrid] [Перерисовка компонент] [Multiselect] [Отображение списков, сеток]
Отслеживать это обсуждение
Всего сообщений: 4314-04-2020 03:03Вы что обалдели???
Статья написана 20 лет назад!!!
И в течение 10 лет продолжали хвалить.
Да и сейчас актуальна ) |
|
30-05-2010 14:11Огромное Вам спасибо! Перерывала весь инет раз за разом и никак не могла найти то, что надо! Теперь можно сделать задуманную фишку. Спасибо вам! И удачи в дальнейших изысканиях! |
|
27-05-2010 15:36
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Спасибо за статью! Подчерпнул казалось бы элементарные вещи, до которых сам не додумывался(не было необходимости). Теперь стало гораздо красивее.
|
|
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 then
begin
if UseThemes then
theme := OpenThemeData(Handle, 'BUTTON')
else
theme := 0;
if theme = 0 then
begin
if then
Style := DFCS_CHECKED
else
Style := DFCS_BUTTONCHECK;
DrawFrameControl(TDBGrid(Sender).Canvas.Handle, Rect, DFC_BUTTON, Style);
end
else begin
if 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
31-03-2007 08:27Доброго дня!
Такой вопрос: есть грид, отображающий данные не readonly (изменяемого) набора данных. Делаю checkbox в вычисляемом столбце по аналогии с тем, как описано в http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=168, но там написано для readonly набора данных. Чего хочется: несмотря на то, что объект-столбец (НЕ объект-поле!) имеет cd-во readonly при клике мыше по нему два раза или принахождении фокуса на нём и нажатии клавиши checkbox пропадает, т.к. набор данных изменяемый. Хочется, чтобы он не пропадал, но сохранить изменяемый набор данных и не использовать dgRowSelect=true. Как это сделать? |
|
05-03-2007 03:54Теперь все ОК. Прошу прощения, что сразу не внимательно прочитал. Сейчас разобрался. Спасибо большое Сообщение не подписано |
|
21-02-2007 02:13
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Прочитал статью и обалдел.
Я так думаю, даже самый тупой чайник должен во все врубиться после прочтения статьи.
Да, не зря наша Королева является Королевой.
С уважением Олег. |
|
|
|