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

Вниз

Можно ли разукрашивать StringGrid в событии отличном от DrawCell?   Найти похожие ветки 

 
Zheksik ©   (2007-12-07 11:18) [0]

Здравствуйте. Проблема в том, что после обработки и получения табличных результатов нужно выделить максимальный элемент в каждом столбце. Я знаю как выделяется ячейка с помощью события DrawCell, но оно мне не подходит, т.к. оно происходит в момент прорисовки таблицы, а мне нужно, чтобы после полного построения таблицы.


 
{RASkov} ©   (2007-12-07 11:36) [1]

> [0] Zheksik ©   (07.12.07 11:18)

Не верно мыслишь....
Рисовать грид нужно именно в OnDrawCell, а вот перерисовать его весь можно вызовом Invalidate....


 
Сергей М. ©   (2007-12-07 11:37) [2]


> оно мне не подходит


Оч даже подходит.

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

Теперь в обработчике OnDrawCell параметр ACol рассматриваешь как индекс эл-та массива, берешь из него хранимый в нем номер строки, сравниваешь с ARow, если равны, то выделяешь.


 
Zheksik ©   (2007-12-07 11:43) [3]

{RASkov}
это уже что-то... спасибо. буду пробовать...

to Сергей М. ©   (07.12.07 11:37) [2]
как вариант... спасибо.


 
Zheksik ©   (2007-12-07 13:00) [4]

бррррр, запутался...

Сергей М. ©
создал массив по вашему совету, где индекс элемента соответствует колонке, а значение ряду, но как в OnDrawCell правильно использовать этот массив??? Ведь for здесь нельзя использовать(((


 
@!!ex ©   (2007-12-07 13:03) [5]

> [4] Zheksik ©   (07.12.07 13:00)

Зачем for???
StringGrid сам переберет все элементы.
ACol и ARow дают тебе индексы нужно элемента массива!


 
Сергей М. ©   (2007-12-07 13:04) [6]


> for здесь нельзя использовать


А нафига он там нужен ?

if MyArray(ACol) = ARow then .. выделяем ...


 
Zheksik ©   (2007-12-07 13:20) [7]

хм... вот и не верь после этого в чудеса...


 private
   MaxArray: array[1..16] of Integer;

procedure TForm1.AdvStringGrid1DrawCell(Sender: TObject; ACol,
 ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
if MaxArray(ACol) = ARow then AdvStringGrid1.Canvas.Brush.color := clRed;
end;


на ACol выдаёт - Missing operator or semicolon


 
Сергей М. ©   (2007-12-07 13:23) [8]

Чудес не бывает - где-то в областях видимости, доступных этому методу, идентификатор "MaxArray" уже определен и определен иным образом.


 
Zheksik ©   (2007-12-07 13:30) [9]

что значит, "где-то в областях видимости"???

единственное место где используется этот массив - это процедура где он наполняется значениями... Процедура простая... просто перебор всех значений таблицы и наполнение массива. Объявлен массив в привате.

Где "копать"?


 
{RASkov} ©   (2007-12-07 13:34) [10]

> [7] Zheksik ©   (07.12.07 13:20)
> MaxArray(ACol)

Скобки не массивные :) надо []


 
Сергей М. ©   (2007-12-07 13:37) [11]


> место где используется


Разве я сказал "используется" ?

Я сказал определен (декларирован или объявлен, если угодно).


 
Zheksik ©   (2007-12-07 13:38) [12]

{RASkov} ©   (07.12.07 13:34) [10]

;D

Сергей М. ©   (07.12.07 13:23) [8]
и правда не бывает... что не лишний раз подтвердила моя ошибка.

спасибо.


 
Сергей М. ©   (2007-12-07 13:38) [13]


> {RASkov}


Точно)

Автор содрал один в один пример в псевдокоде и сидит ждет чудес)


 
Zheksik ©   (2007-12-07 13:48) [14]

Сергей М. ©   (07.12.07 13:38) [13]
смешно.

{RASkov} ©   (07.12.07 11:36) [1]
точно invalidate??? эффекта нет.


 
{RASkov} ©   (2007-12-07 13:50) [15]

> [13] Сергей М. ©   (07.12.07 13:38)
> содрал один в один пример

[6]
:)
Бывает)


 
Palladin ©   (2007-12-07 13:50) [16]


> Zheksik ©   (07.12.07 13:48) [14]

это грустно, а не смешно


 
{RASkov} ©   (2007-12-07 13:50) [17]

> [14] Zheksik ©   (07.12.07 13:48)
> точно invalidate??? эффекта нет.

Что значит нет????


 
Сергей М. ©   (2007-12-07 13:59) [18]


> Zheksik ©   (07.12.07 13:48) [14]
> смешно.


Да, было бы, если бы не было так как в [14]


 
Zheksik ©   (2007-12-07 14:09) [19]

Сергей М. ©   (07.12.07 13:59) [18]
я ошибся, я это признал, что ещё то нужно??? кстати, про псевдокод ты чётко придумал ;)
там можно было и псевдофигурные скобки поставить...


 
Сергей М. ©   (2007-12-07 14:15) [20]


> там можно было и псевдофигурные скобки поставить...
>


А то !)

Но вот ведь беда - не дотумкал я туда их поставить)

Да ты не расстраивайся - и на старуху бывает проруха, и на новичка справка)


 
Zheksik ©   (2007-12-07 14:18) [21]

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


 
Сергей М. ©   (2007-12-07 14:20) [22]


> Zheksik ©   (07.12.07 14:18) [21]


Так.
Дуй уже учить Паскаль, обидчивый ты наш.


 
{RASkov} ©   (2007-12-07 14:24) [23]

> [21] Zheksik ©   (07.12.07 14:18)

У тебя уже все получилось? разобрался?
Чего дуешься.... Никто тебя здесь не обижает)


 
Zheksik ©   (2007-12-07 14:34) [24]

{RASkov} ©   (07.12.07 14:24) [23]
)))
я не дуюсь и не обижаюсь...

я с самого начала признал СВОЮ ошибку, а некоторые до сих пор не знают как оправдаться за неправильный совет с детской ошибкой, которую даже начинающий не совершает.


 
Плохиш ©   (2007-12-07 14:34) [25]

Что-то я не заметил в [7] отрисовки...


 
Сергей М. ©   (2007-12-07 14:41) [26]


> Zheksik ©   (07.12.07 14:34) [24]


> некоторые до сих пор не знают как оправдаться за неправильный
> совет


Поплачься-поплачься)
Авось полегчает)

А врать хныкать и врать про "неправильный совет" уже не надо - тебе, несмотря на твое категоричное "оно мне не подходит", неоднократно и вразумительно сказано, что именно оно тебе и подходит.


 
Zheksik ©   (2007-12-07 14:41) [27]

{RASkov} ©   (07.12.07 14:24) [23]
по порядку:
1) построил таблицу
2) создал массив с максимальными значениями в столбцах.
3) т.к. наполнил таблицу открываю ключ для того, чтобы в DrawCell воспользоваться командой if MaxArray(ACol) = ARow then AdvStringGrid1.Canvas.Brush.color := clRed;
4) AdvStringGrid1.Invalidate;
5) В результате ничего не происходит(((


 
Сергей М. ©   (2007-12-07 14:41) [28]


> Плохиш ©   (07.12.07 14:34) [25]
>
> Что-то я не заметил в [7] отрисовки...
>


А это будет отдельная история с отдельными обидами)


 
Zheksik ©   (2007-12-07 14:42) [29]

Сергей М. ©   (07.12.07 14:41) [26]
)))


 
Плохиш ©   (2007-12-07 14:47) [30]


> 5) В результате ничего не происходит(((

А что должно происходить?


 
{RASkov} ©   (2007-12-07 14:51) [31]

> [27] Zheksik ©   (07.12.07 14:41)

Вот ты кисточку мокнул в краску, а дальше хочешь что б забор автоматом стал тем же цветом...


 
{RASkov} ©   (2007-12-07 14:52) [32]

> [27] Zheksik ©   (07.12.07 14:41)

и 4 пункт случаем не DrawCell??? :)


 
Zheksik ©   (2007-12-07 14:53) [33]

Плохиш ©   (07.12.07 14:47) [30]
упс...


if MArray[ACol] = ARow then
 begin
  AdvStringGrid1.Canvas.Brush.Color := clRed;
  AdvStringGrid1.Canvas.FillRect(Rect);
  AdvStringGrid1.Canvas.TextRect(Rect, Rect.Left, Rect.Top, AdvStringGrid1.Cells[ACol, ARow]);
 end;


по идее должны закрашиваться ечейки соответствующие индексам массива и их значениям.


 
{RASkov} ©   (2007-12-07 14:53) [34]

> не DrawCell


> 4) AdvStringGrid1.Invalidate;

Вот это случайно у тебя не в OnDrawCell?? )


 
Zheksik ©   (2007-12-07 14:57) [35]

{RASkov} ©   (07.12.07 14:53) [34]
нет конечно

Это сразу после окончания процедуры, которая наполняет массив


 
{RASkov} ©   (2007-12-07 14:58) [36]

> [33] Zheksik ©   (07.12.07 14:53)
>  AdvStringGrid1.Canvas.Brush.Color := clRed;
>  AdvStringGrid1.Canvas.FillRect(Rect);
>  AdvStringGrid1.Canvas.TextRect(Rect, Rect.Left, Rect.Top,
> AdvStringGrid1.Cells[ACol, ARow]);

Здесь практически верно, а вот здесь:

> if MArray[ACol] = ARow then

Проверять нужно....

Почему - практически?
потому как не красиво делать

> AdvStringGrid1.Canvas

У метода есть Сендер, вот его и нужно использовать. Это не требование, но так правильнее....
Так можно использовать один обработчик на всех и "не страшно" переименование грида....


> [35] Zheksik ©   (07.12.07 14:57)

:) я рад за тебя)


 
Zheksik ©   (2007-12-07 15:06) [37]


> :) я рад за тебя)

я конечно туповат, но не до такой степени ;)
а вообще, в моём сучае тупость сродни невнимательности.

в общем вопрос разрешился... как всегда моя невнимательность... ключ не перевёл в нужное положение.

спасибо. такому терпению в пятницу можно только позавидовать ;)


 
Германн ©   (2007-12-07 21:43) [38]


> {RASkov} ©   (07.12.07 14:53) [34]
>
> > не DrawCell
>
>
> > 4) AdvStringGrid1.Invalidate;
>
> Вот это случайно у тебя не в OnDrawCell?? )
>

Если бы он так сделал, то давно бы встал на уши от бр.


 
{RASkov} ©   (2007-12-07 21:49) [39]

> [38] Германн ©   (07.12.07 21:43)
> встал на уши от бр.

А что такое "бр." ? )


 
Германн ©   (2007-12-07 21:54) [40]


> А что такое "бр." ? )
>

Догадайся с трех раз :)
Или сам попробуй вызвать Invalidate в OnDrawCell.


 
{RASkov} ©   (2007-12-07 22:01) [41]

> [40] Германн ©   (07.12.07 21:54)
> Или сам попробуй вызвать Invalidate в OnDrawCell.

Легко:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
 StringGrid1.Canvas.Brush.Color:=clRed;
 StringGrid1.Canvas.TextRect(Rect,Rect.Left, Rect.Top, "бр.бр.бр.бр.");
 StringGrid1.Invalidate;
end;

:)
У меня это "бр." выглядит как мелькающие полоски по всему гриду)
но грид читаем и как указано - красный.....
Ладно.... я в шутку спросил впрочем как и этот пост....
:о)


 
Германн ©   (2007-12-07 22:05) [42]


> У меня это "бр." выглядит как мелькающие полоски по всему
> гриду)
> но грид читаем и как указано - красный.....
>

А ты добавь кроме грида еще что-нибудь. Кнопочки например. Тогда и увидишь последствия бесконечной рекурсии :)


 
{RASkov} ©   (2007-12-07 22:18) [43]

> [42] Германн ©   (07.12.07 22:05)

Ага.... понял что есть бр :)
Но у меня и в этом случае все тип-топ :)
Во:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
 StringGrid1.Canvas.Brush.Color:=clRed;
 StringGrid1.Canvas.TextRect(Rect,Rect.Left, Rect.Top, "бр.бр.бр.бр.");
 StringGrid1.Invalidate;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage("бр");
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
 Label1.Caption:=Edit1.Text;
end;

end.

Кнопочки тыкаются, сообщения показываются, текст метки меняется..... а в это время по гриду полоски бегаютЪ
Анамалия :)


 
Германн ©   (2007-12-08 02:18) [44]


> {RASkov} ©   (07.12.07 22:18) [43]
>
> > [42] Германн ©   (07.12.07 22:05)
>
> Ага.... понял что есть бр :)
> Но у меня и в этом случае все тип-топ :)


 
Германн ©   (2007-12-08 02:21) [45]


> Германн ©   (08.12.07 02:18) [44]
>
>
> > {RASkov} ©   (07.12.07 22:18) [43]
> >
> > > [42] Германн ©   (07.12.07 22:05)
> >
> > Ага.... понял что есть бр :)
> > Но у меня и в этом случае все тип-топ :)
>

Тогда попробуй сначала кинуть на форму кнопочки и другие компоненты, а потом StringGrid.


 
{RASkov} ©   (2007-12-08 11:49) [46]

> [45] Германн ©   (08.12.07 02:21)

:(
:)
Пострадал из набора (Грид, метка, кнопка, эдит) только эдит, остальные после первой полной перерисовки(свернуть-развернуть окно) нормолизовались
Ну все, Сергей, нужно завязывать с этими экспериментами......)

Одно скажу.... для автора вопроса и не только - Ни в коем случае не вызывайте Invalidate в OnDrawCell грида
это ужасно (
:о)


 
Германн ©   (2007-12-08 13:51) [47]


> Ну все, Сергей, нужно завязывать с этими экспериментами.
> .....)

Да я уже давно завязал :)


 
{RASkov} ©   (2007-12-08 14:04) [48]

> [47] Германн ©   (08.12.07 13:51)
> Да я уже давно завязал :)

А меня подталкивал на них.... не чесно :)


 
Германн ©   (2007-12-08 14:57) [49]


> А меня подталкивал на них.... не чесно :)

Ты сам напросился {RASkov} ©   (07.12.07 14:53) [34]
:)


 
{RASkov} ©   (2007-12-08 15:24) [50]

> [49] Германн ©   (08.12.07 14:57)
>
> > А меня подталкивал на них.... не чесно :)
>
> Ты сам напросился {RASkov} ©   (07.12.07 14:53) [34]
> :)

Я никуда не напрашивался :( Я просто поинтересовался у автора - не сделал-ли он глупость
:)



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

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

Наверх




Память: 0.6 MB
Время: 0.015 c
2-1197289338
..::KraN::..
2007-12-10 15:22
2008.01.06
Работа с потоками


6-1177360433
Sergey M.
2007-04-24 00:33
2008.01.06
Delphi&Cgi


2-1197110204
dr_creigan
2007-12-08 13:36
2008.01.06
Как скрыть приложение от Process Viewer в NT


2-1197028876
Мурзик
2007-12-07 15:01
2008.01.06
Как удалить выделенный контрол?


15-1196611902
Kostafey
2007-12-02 19:11
2008.01.06
С днем рождения ! 2 декабря