Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Раскрасить ячейки в dbgrid

Автор: Duncan4071505
Дата сообщения: 06.12.2005 17:44
Всем привет!
Подскажите как в компоненте dbgrid (delfi) для ячейки изменить цвет.
Просьба - советы типа: "читай хелп" или "купи книгу" не надо писать!
Лучше всего привести в пример фрагмент кода с комментариями.
Заранее всем спасибо.
Автор: minos14
Дата сообщения: 06.12.2005 21:14
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
If (Условие) and (Column.FieldName='ИмяПоля')
// например, у меня - If (TableSkladKol.AsInteger = 0) and (Column.FieldName='Tovar')
then
begin
TDBGrid(Sender).Canvas.Brush.Color:=ClRed;
TDBGrid(Sender).Canvas.Font.Color:=clWhite;
end;

If gdSelected in State
then
begin
TDBGrid(Sender).Canvas.Brush.Color:= clHighLight;
TDBGrid(Sender).Canvas.Font.Color := clHighLightText;
end;

// Перерисовка таблицы Grid
TDBGrid(Sender).DefaultDrawColumnCell(Rect,DataCol,Column,State);
end;
Автор: DroN_S
Дата сообщения: 07.12.2005 03:16
Duncan4071505
попробуй так

Код:
const
SelColor = ClYellow;
begin
if (state = [gdSelected]) then
with TStringGrid(Sender), Canvas do
begin
Brush.Color := SelColor;
FillRect(Rect);
TextRect(Rect, Rect.Left + 2, Rect.Top + 2, Cells[aCol, aRow]);
end;
Автор: Duncan4071505
Дата сообщения: 07.12.2005 09:03
Спасибо за быстрые и содержательные ответы!!!
Хелп я конечно буду читать. Просто нужно было очень срочно.
Еще раз спасибо.

Добавлено:
minos14
Спасибо! Помогло. Но закрашивает всю строку
А очень хотелось бы закрасить только одну ячейку из всей строки.
Поможешь?
Автор: dyr farot
Дата сообщения: 07.12.2005 12:17
добавь к if (state = [gdSelected]) then
if ((state = [gdSelected]) and (Column->FieldName == 'NAME') ) then
Автор: Duncan4071505
Дата сообщения: 07.12.2005 14:46
dyr farot
Спасибо большое! Помогло!

Добавлено:
А еще один вопросик.
В том же dbgrid в одной колонке есть текстовые значения, их много, но они расположены в алфавитном порядке.
Приходится лазить вверх/вниз постоянно, что очень неудобно.
Как сделать так, чтобы при нажатии кнопки, к примеру "О", курсор автоматически перемещался на начало записей начинающихся на эту букву, в нашем случае "О". И так далее.
К примеру есть фамилии 'Иванов', 'Иванчук', 'Иванчик', и много других фамилий, но начинающихся на другую букву. Нажимаем на букву 'И' и перемещаемся на эти фамилии, и т.д.
Объяснил как-то коряво, но если смысл более-менее понятен - помогите плиз!
Автор: A_V
Дата сообщения: 07.12.2005 20:42
Duncan4071505
в обработчике OnKeyPress:
Query.Locate('field_name',Key,[loCaseInsensitive, loPartialKey])
Автор: Duncan4071505
Дата сообщения: 08.12.2005 09:55
A_V
Не получается!


Цитата:
в обработчике OnKeyPress:
Query.Locate('field_name',Key,[loCaseInsensitive, loPartialKey])


Ошибка:
Undeclared identifier: 'Query'
Автор: A_V
Дата сообщения: 08.12.2005 11:01
Duncan4071505
объект Query- это то к чему превязан твой дбгрид,
например ADOQuery1, ADOTable1 итд
Автор: Duncan4071505
Дата сообщения: 08.12.2005 12:23
A_V
Помогло! В моем случае это оказался pFIBDataSet1.

А как сделать так, чтобы искать слово не только по первой букве - как сейчас оно работает, но и по следующим буквам?
Сейчас нажав на кнопку, к примеру 5, я перемещаюсь на ближайшую (?) запись начинающуюся на 5. А мне еще надо ввести пару значений (букв или цифр).
например есть строки:
46898
56889
52131
56331
Мне нужно попасть на последнюю запись (56331), мне достаточно набрать 5, затем 6, затем 3.

Как такую функциональность реализовать?

Добавлено:
Еще вопрос!
Сейчас у меня данные отсортированы по колонке 'id'.
Как сортировать по другим колонкам?

Добавлено:
И как сделать чтобы поиск происходил по той колонке, где стоит курсор?
Автор: dyr farot
Дата сообщения: 08.12.2005 13:39
по первому вопросу:
нужно делать так, как все -- показать формочку ( тип bsDialog ) на которой лежит TEdit и в его OnKeyDown ( или в OnChange ) делать Locate() по edit.Text

по второму: добавить в запрос ORDER BY имя_поля
Автор: Duncan4071505
Дата сообщения: 08.12.2005 15:55
dyr farot
ORDER BY помог. Как я сам до этого не додумался! Протупил.

А по поводу

Цитата:
нужно делать так, как все -- показать формочку ( тип bsDialog ) на которой лежит TEdit и в его OnKeyDown ( или в OnChange ) делать Locate() по edit.Text

своими глазами видел в реале!
Как-то оно работает без доп. форм.
Вот. Если будут еще мысли - с удовольствием выслушаю!
Спасибо за помощь.
Автор: dyr farot
Дата сообщения: 08.12.2005 16:13
ты, просто, формы не видел -- она размером с edit. но можно и без нее: edit' у Parent и ParentWindow установить и его показать...
Автор: Duncan4071505
Дата сообщения: 09.12.2005 09:44
недопонял...
подробнее можешь объяснить.

Добавлено:
Вроде все это дело реализовано при помощи компонента dxdbgrid. Вот.
Где-бы описание его раздобыть или примеры использования?
Автор: onlymax
Дата сообщения: 09.12.2005 10:35

Цитата:
своими глазами видел в реале!
Как-то оно работает без доп. форм.

Переменную стринговую заведи. И на onkeypress засовывай в нее символы последовательно (не забывай проверять символы на валидность то есть обрабатываются только буквы, цыфры и знаки препинания). После этого ищи именно по ней...
примерно так (полностью описывать лень...):
var s : string
s:='';
onkeypress(c:char)
begin
if с - валидно then
s:= s + c;
тут должен идти поиск...
if не нашел then
begin
s:= '';
вернуться к последней найденной записи...
end;
end;

Страницы: 1

Предыдущая тема: Работа с PDF на VB


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.