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

» Хочу раскрасить одну строку в ListBox, StringGrid и т.д.

Автор: JeanM
Дата сообщения: 15.03.2003 16:16
Это связано с условиями проекта. DBGrid использовать ну никак нельзя, а необходимо выделение строк по некоторому условию. Выделение может быть устроено: изменяется фон, изменяется начератние, изменяется цвет шрифта. В общем не важно, что изменяется, главное, чтобы эти строки отличались от стандартных. Кстати, возможно еще использование TreeView. Так что если кто чем может помочь по выделению строки в указанных компонентах - прошу... :)
Если есть другой способ - пожалуйста сообщите
Автор: hog
Дата сообщения: 15.03.2003 17:49

Цитата:
DBGrid

я так понимаю - дельфи/билдер =)

на примере TListBox:

ListBox.Style := lbOwnerDrawFixed;

в OnDrawItem:

Код:
with (Control as TListBox).Canvas do begin
if (Index mod 2) = 0 then // покрасим четные строки красным цветом
Brush.Color := clRed;

FillRect(Rect);
TextOut(Rect.Left + Offset, Rect.Top, (Control as TListBox).Items[Index])
end;


Автор: JeanM
Дата сообщения: 15.03.2003 20:29
Великий сенькс!! Только что такое Оффсет?
Я сижу на Buildere: немного пришлось переделать твой код :), но все работает!!!

TListBox *lb = ((TListBox *)Control);
if(Index%2 == 0)
{
lb->Canvas->Brush->Color = clSilver;
lb->Canvas->Font->Color = clBlack;
}
lb->Canvas->FillRect(Rect);
lb->Canvas->TextOut(Rect.Left, Rect.Top, lb->Items->Strings[Index]);

Вопрос такой возник - когда наводишь на четную запись, курсор имеет не обычное выделение, а просто обводит рамкой эту запись. А если навести на нечетную запись - курсор по стандарту - темно-синий. Как-нибудь можно сделать его темно-синим (как по стандарту)?. С DBGrid у меня была такая же проблема - т.е. курсор просто пропадал (во всех записях). И его практически не было видно. Вышел из положения - сделал у выделенной строки шрифт полужирный.
:) Повторяю вопрос: Как-нибудь можно сделать его темно-синим (как по стандарту)?
Автор: hog
Дата сообщения: 16.03.2003 17:30

Цитата:
Только что такое Оффсет?

типа отступ, integer и все такое =)


Цитата:
курсор имеет не обычное выделение, а просто обводит рамкой эту запись

в OnDrawItem передается параметр State : TOwnerDrawState (смотри в хелпе)


Цитата:
Как-нибудь можно сделать его темно-синим (как по стандарту)?

например так:

Код:
if not (odSelected in State) then
if (Index mod 2) = 0 then Brush.Color := clRed;
Автор: JeanM
Дата сообщения: 17.03.2003 15:44
Отлично!! Большое спасибо. Полный код:

TListBox *lb = ((TListBox *)Control);
if(!State.Contains(odSelected)) // -> добавленная строка /////////////////////
if(Index%2 == 0) lb->Canvas->Brush->Color = clSilver;
else lb->Canvas->Brush->Color = clWhite;

lb->Canvas->Font->Color = clBlack;
lb->Canvas->FillRect(Rect);
lb->Canvas->TextOut(Rect.Left, Rect.Top, lb->Items->Strings[Index]);
Автор: sailor
Дата сообщения: 15.08.2003 13:32
Вопрос:
Как мне в Delphi изменить цвет только 1 столбца в Stringrid'е (например первого).. Причём не фона, а того, что внутри (текста)? причём не всего столбца, а только некоторых ячеек в нём?
Автор: Sleepwalker
Дата сообщения: 15.08.2003 15:58
sailor
у меня такое ощещение, что именно так - никак. Можно через Канвас выделение сделать, там уже верти как хочешь, но все придется ручкми делать.
Автор: sailor
Дата сообщения: 15.08.2003 16:21
Sleepwalker

Цитата:
Можно через Канвас выделение сделать, там уже верти как хочешь, но все придется ручкми делать.

А чуть подробнее? Мне каким угодно способом.. главное - сделать
Автор: Tishka
Дата сообщения: 20.08.2003 11:58
Если это TDrawGrid, то в OnDrawCell пишеш:

if ACol = 2 // пример
then
begin
// здесь раскрашиваешь как, бог на душу положит.
end
else inherited;

К стати, а почему не воспользоваться TDBGrid, с его OnDrawColumnCell и OnDrawDataCell.

Добавлено
А у TListBox'а, если свойство Style <> lbStandard, в обработчике события OnDrawItem можно рисовать и писать всё, что угодно.
Автор: pvlpvlpvl
Дата сообщения: 27.09.2003 16:30
А как всё это сделать в visual c (без mfc)?
Автор: ShIvADeSt
Дата сообщения: 29.09.2003 00:04

Цитата:
А как всё это сделать в visual c (без mfc)?

А ты уверен (я просто давно в нем не работал) что там есть стринггрид? Потому как в MSDK нет такого класса. Следовательно, он является порожденным то есть MFC. А вот пример раскраски ListBox есть в нем. С хорошим примером. (на VC++). Так что смотри, используй.

Страницы: 1

Предыдущая тема: Использование ImageList и Image. Delphi.


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