Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.12;
Скачать: CL | DM;

Вниз

хочу посоветоваться на счет алгоритма раскраски грида...   Найти похожие ветки 

 
AAA3AAA   (2003-12-01 15:50) [0]

Хочется расскрасить грид по датам полосками.... тоесть если идут документы за одну дату. красить их в один цвет, а как начались за другую (не обязательно следующую), то в другой цвет.
Если бы присутствовали документы за все даты, то проблема бы легко решалась... просто красим все четные в один цвет, а нечетные в другой... но в данной ситуации могут встречаться документы с произвольными датами... к примеру идут подряд, 23,23,23,23,27,27,27... они окрасятся в один цвет...
Процедуры грида DBGrid1DrawColumnCell или DBGrid1DrawDataCell

работают с каждым конкретным полем грида... тоесть нужно узнать какая дата была до этого.. и если дата сменилась, то переключить цвет.. Для этого завел глобальные переменные Для прошлой даты и прошлого цвета...

в алгоритме проверяем If прошлая дата отличается от тевущей then меняем цвет на следующий и прорисовываем поле (всего можно задать несколько цветов и менять по кругу)

У этого алгоритма есть недостаток:
Так как число дат может оказаться не четным, то данные в гриде будут постоянно перерисовываться то в один, то в другой цвет (например после того как хинт поднимется... поле из одного цвета, станет другого) или при перемотке

Как тут быть ?. Подскажите пож что можно предпринять?


 
vlv   (2003-12-01 16:12) [1]

Введи в твой DataSet вычисляемое поле.
После открытия твоего DataSet-а один раз пробегись по нему
и установи это поле (можешь по своему теперешнему алгоритму).
А на DrawDataCell крась строку в зависимости от этого поля.


 
Александр из Минска ©   (2003-12-01 16:18) [2]

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
if gdFixed in State then Exit;
if ListBox1.Items.Count >= 1000 then //список цветов, в которые должен красить столбец
//у меня заранее преполагается, что в таблице не будет более 1000 колонок. И этот листбокс сохраняется/загружается в/из файла.
В нем всегда 1000 строк (даже если у тебя меньше колонок)
begin
StringGrid1.Canvas.Brush.Color := StringToColor(ListBox1.Items[ACol]);
StringGrid1.Canvas.Brush.Style := bsSolid;
StringGrid1.Canvas.FillRect(Rect);
if gdSelected in State then
begin
StringGrid1.Canvas.Brush.Color:= clHighLight;
StringGrid1.Canvas.Font.Color := clHighLightText;
end;
StringGrid1.Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, StringGrid1.Cells[ACol, ARow]);
end;
end;

Все понятно?


 
AAA3AAA   (2003-12-02 06:23) [3]


> vlv (01.12.03 16:12) [1]

Спасибо. К этому и склонялся, но думал может еще варианты есть.

> Александр из Минска © (01.12.03 16:18) [2]

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


 
Мыш ©   (2003-12-02 08:08) [4]

А если цвет не принципиален, то можно сделать вычисление цвета по дате. Берешь дату в днях, умножаешь на некоторое значение и заносишь это в цвет. color:=dayNum*10+$00eebbcc; Создавать поле имхо, будет громоздко, поэтому если цвет важен, то можно создать массив[0..31]of Tcolor - таблицу соответствия каждой дате определенного цвета.


 
AAA3AAA   (2003-12-02 08:31) [5]


> Мыш © (02.12.03 08:08) [4]
"массив[0..31]of Tcolor "

Я так тоже пробовал.
Мое ИМХО что это развитие моего первого метода раскраски по четным нечетным.
Сам посуди что будет если попадутся даты поряд 20.02, 20.03, 20.4...
А первый метод... вычисление цвета из даты... Мне он не подходит, поскольку цвета получаются непредсказуемыми и слишком уж большой диапозон... столько не нужно... Грид смотрится как радуга, а нужно всего лиш 2 цвета, отделяющие новый день от предидущего.
В общем пока сделал вычисляемый столбец... Все пашет как надо. Если есть предложения по оптимизации данной задачи, с удовольствием выслушаю :)
всем спасибо.



Страницы: 1 вся ветка

Текущий архив: 2003.12.12;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
1-36620
qwe
2003-11-21 16:53
2003.12.12
Invalid Class Typecast


1-36602
aleks111
2003-12-01 14:23
2003.12.12
wmf в res и обратно...


14-36846
Митяй
2003-11-18 17:39
2003.12.12
Re: Любая тема ветки


8-36773
Sergeys
2003-08-16 00:39
2003.12.12
ListBox + Картинка + Список


1-36684
kolesya
2003-12-02 21:23
2003.12.12
Drag and Drop