Текущий архив: 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.46 MB
Время: 0.007 c