Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Цвет ячейки StringGrid по условию [D7, XP]


Страницы:   1 2 3

Laguna ©   (2011-11-25 12:34:00) 

Необходимо по определенным условиям присвоить цвет ячейке. Делаю так :

 InfoStringGrid.Cells[X, Y] := S;
 if S <> 'бла'  then
  InfoStringGrid.Objects[X, Y] := Pointer(1);
...
procedure TMainFrm.InfoStringGridDrawCell(Sender: TObject; ACol,
                  ARow: Integer; Rect: TRect; State: TGridDrawState);
var
 A_Col: longint absolute ACol;
 A_Row: longint absolute ARow;
 Buf: array[byte] of char;
begin
 with (Sender as TStringGrid), Canvas do
 begin
   StrPCopy(Buf, Cells[A_Col, A_Row]);
   if Objects[ARow, ACol] <> nil then
     Brush.Color := clAqua
   else
     Brush.Color := clBtnFace;
   FillRect(Rect);
   DrawText(Handle, Buf, -1, Rect, DT_CENTER or DT_SINGLELINE or DT_VCENTER or DT_NOCLIP);
 end;
end;


Не работает так как нужно, точнее один раз ячейка самая верхняя левая зарисовывается и все на этом.


Laguna   (2011-11-26 16:47:00) [1]

>megavoid ©   (26.11.11 10:53) [47]

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


megavoid   (2011-11-26 10:53:00) [2]

Велосипеды - это хорошо, но гугл - ещё лучше.

Ищем ZColorStringGrid (странно, первая ссылка ведёт куда надо), качаем юнит, используем его:
uses ZColorStringGrid;

заменяем
InfoStringGrid: TStringGrid;
на:
InfoStringGrid: TZColorStringGrid;

Далее в программе всё становится просто:
if (условие) then InfoStringGrid[7.15].BGColor := clAqua;
плюс множество дополнительных плюшек...


Laguna   (2011-11-26 03:59:00) [3]


> Ну нельзя осваивать "любой язык программирования", да и
> вообще "программирование" только на примерах из И-нета!

Это понятно. Литературу тоже почитываю. Кстати, спасибо за [40], работает как положено.


Германн   (2011-11-26 02:26:00) [4]


> Я уже отвечал, взято из DelphiWord.

Дык тебе уже сказали.
Код работает, но это код разработан в эпоху Д1.
Да к тому же он глючный даже на Д1.
Ну нельзя осваивать "любой язык программирования", да и вообще "программирование" только на примерах из И-нета!


Laguna   (2011-11-26 01:46:00) [5]


> А автор по какой-то причине других и не находит. Боится
> что-ли, что не поймет?

Зря вы так, уважаемый, просто первое что попалось на глаза, подходящее под решаемую задачу ;) . А по правде говоря нэт пестрит попугайской переписью одного и того же кода в разной цветовой гамме...


Laguna   (2011-11-26 01:44:00) [6]


> PS. А статья первокласника. Прикольно, создать объект, присвоить
> массиву и вместо того, что бы использовать полученную при
> создании ссылку, несколько раз выбирать этот объект из массива,
>  да ещё и дважды проверять его тип...

Вот в том то и дело, что не всему писаному можно верить(в [20] я убирал двойные проверки на тип), поэтому на форуме и хочется уточнить у мастеров.

> P.S.Остался вопрос. А для чего в топике существуют:var  A_Col:
>  longint absolute ACol;  A_Row: longint absolute ARow;

Я уже отвечал, взято из DelphiWord.

подправил после ликбеза

  begin
    InfoStringGrid.Cells[X, Y] := S;
    if FlagObj then
     InfoStringGrid.Objects[X, Y] := TObject(clAqua);
  end
.....

procedure TMainFrm.InfoStringGridDrawCell(Sender: TObject; ACol,
                  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
 with (Sender as TStringGrid), Canvas do
  begin
    if Objects[ACol, ARow] <> nil then
     Brush.Color := TColor(Objects[ACol, ARow])
    else
     Brush.Color := clBtnFace;
    FillRect(Rect);
    DrawText(Handle, PChar(Cells[ACol, ARow]), length(Cells[ACol, ARow]),
             Rect, DT_CENTER or DT_SINGLELINE or DT_VCENTER or DT_NOCLIP);
  end;
end;

Сейчас все правильно? Или еще какой лоск нужно навести?


Германн   (2011-11-26 01:28:00) [7]


> А статья первокласника.

А автор по какой-то причине других и не находит. Боится что-ли, что не поймет?


Плохиш   (2011-11-26 00:50:00) [8]


> Laguna ©   (25.11.11 22:52) [37]


> Посмотри как там уничтожается объект и ничего за собой больше
> не подчищает.

Ты, наверное, обратил внимание, где объекты уничтожаются?

PS. А статья первокласника. Прикольно, создать объект, присвоить массиву и вместо того, что бы использовать полученную при создании ссылку, несколько раз выбирать этот объект из массива, да ещё и дважды проверять его тип...


Германн   (2011-11-26 00:41:00) [9]


> Т.е. как правильно объявлять, присваивать значение объекту
> ячейки, очищать и т.д.

Присваивать:
StringGrid.Objects[X, Y] := TObject(clYellow);
Очищать:
StringGrid.Objects[X, Y] := TObject(0);
Это лишь пример. Но создавать специальный класс TCellsColor для раскраски  грида это измышления воспаленного мозга.

P.S.
Остался вопрос. А для чего в топике существуют:
var
 A_Col: longint absolute ACol;
 A_Row: longint absolute ARow;

?


Laguna   (2011-11-25 23:46:00) [10]

В приведенном примере заполнение ячейки неким цветом зависит от значения этой ячейки. Этот способ не представляет трудностей, а посему остается пока как запасной вариант. Я хотел именно с Objects[ARow, ACol] разобраться досканально. Т.е. как правильно объявлять, присваивать значение объекту ячейки, очищать и т.д. Разбираясь с приведенным примером [37] впринципе получил то что хотел, пока не коснулось уничтожения объектов.

ps
>>Jeer ©   (25.11.11 23:13) [38]
ведь можно оказывается и по человечески общаться :)


Jeer   (2011-11-25 23:13:00) [11]


> Laguna ©   (25.11.11 22:52) [37]
>
>


Начиная с размышлений (простейших), а не копирования.

Вот тебе простейший пример:

Есть стандартный TStringGrid.

На событие OnDrawCell навешиваем вот такой простой код:

procedure TfmMain.sgDrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
begin
 if (ACol = 0) or (ARow = 0) then Exit;
 with TStringGrid(Sender), Canvas.Brush do begin
   if pos('-',Cells[ACol, Arow]) > 0 then
     Color := clBlue
   else
     if Length(Cells[ACol, Arow]) = 0 then
       Color := clWhite
     else
       Color := clYellow;
   Canvas.FillRect(Rect);
 end;
end;

Добавляем кнопку на заполнение грида и код OnClick:

procedure TfmMain.btnFillGridClick(Sender: TObject);
var
 i, j: integer;
begin
 sg.RowCount := 5;
 sg.ColCount := 10;
 for i := 1 to sg.ColCount do
   for j := 1 to sg.RowCount do
     sg.Cells[i, j] := Format('%f', [2 * Random - 1]);
end;

Наслаждаемся эффектом раскраски ячеек.

P.S.
Заполнение ячеек текстом ( численными значениями по примеру ) - домашнее задание.


Laguna   (2011-11-25 22:52:00) [12]


> Jeer ©  

Хорошо, уважаемый критик, что скажешь про этот пример? http://korzh.net/2011-04-razukrashivanie-yacheek-u-stringgrid.html.Я на его базе пытался найти решение к соей задаче. Посмотри как там уничтожается объект и ничего за собой больше не подчищает. Насколько верно там изложено? Мне кажется что есть нюансы.


Jeer   (2011-11-25 22:33:00) [13]

google "Раскраска TStringGrid" дает ответы на все мыслимые и не мыслимые вопросы, в т.ч. и примеры на такие вопросы.
Насчет "жевать" - в стойло.


Jeer   (2011-11-25 22:25:00) [14]


> где.. можно найти ответ по конкретному вопросу..?


только самому, иначе - см. выше.


Laguna   (2011-11-25 22:07:00) [15]


> Изучение Delphi random-методом равносильно попытке воспроизвести
> труд "Война и Мир" посредством пальцев и мозга шимпанзе,
>  а то и лемура.

Ну не всем же суждено быть занатта умными бакалаврами, посему приходится постигать науку любыми доступными средствами. Было бы желание и заинтересованность. А тут я смотрю знатоки стараются ровнять по себе. Напомню, вопрос задан в разделе "Начинающим"
• «Начинающим»(вспомогательная конференция. если вам трудно понять самим, что вам нужно или есть желание и способности помогать новичкам— вам сюда)
Я думаю, что веткой я не ошибся. Неужели так трудно дать нормальный ответ или ссылку на литературу, где самому можно найти ответ по конкретномувопросу, а не плодить ненужные поддевочные посты?


Jeer   (2011-11-25 16:58:00) [16]


> Пардон, я понял, написал, потом почитал, что ерунду написал


Изучение Delphi random-методом равносильно попытке воспроизвести труд "Война и Мир" посредством пальцев и мозга шимпанзе, а то и лемура.


Германн   (2011-11-25 16:48:00) [17]


> Надо проверять именно на наличие Objects[ACol, ARow] as
> TCellsColor).BrushColor

Это тоже ерунда. Вместо Free используй FreeAndNil


Laguna   (2011-11-25 16:39:00) [18]

Пардон, я понял, написал, потом почитал, что ерунду написал. Надо проверять именно на наличие Objects[ACol, ARow] as TCellsColor). BrushColor
Тока в каком месте именно это проверять ...


RWolf   (2011-11-25 16:34:00) [19]

Cells и Objects — разные свойства, при изменении одного другое не меняется.


Laguna   (2011-11-25 16:30:00) [20]

Так я при инициализации делаю принудительную очистку

 with InfoStringGrid do
   for i := 0 to ColCount - 1 do
     for k := 0 to RowCount - 1 do
      Cells[i, k] := '';

Или я не про то содержимое думаю?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо