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

Вниз

Цвет ячейки StringGrid по условию   Найти похожие ветки 

 
Laguna ©   (2011-11-25 12:34) [0]

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

 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;


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


 
Германн ©   (2011-11-25 13:01) [1]

Откуда содран сей код?


 
Anatoly Podgoretsky ©   (2011-11-25 13:03) [2]

Откуда не важно, а вот понимания о Дельфи как не было, так и нет


 
RWolf ©   (2011-11-25 13:12) [3]

неправильный порядок индексов в Objects[].


 
И. Павел ©   (2011-11-25 13:14) [4]

> [0] Laguna ©   (25.11.11 12:34)

with (Sender as TStringGrid), Canvas do
Скорее всего запятую на точку нужно поменять :)


 
И. Павел ©   (2011-11-25 13:14) [5]

> [4] И. Павел ©   (25.11.11 13:14)

Хотя нет. Но в любом случае нужно использовать Canvas стринг грида, а вы используете канвас формы.


 
Laguna ©   (2011-11-25 13:23) [6]


> Откуда не важно, а вот понимания о Дельфи как не было, так
> и нет

Код как раз таки работает прекрасно. Проблема с присвоением объету данных, которая впринципе уже решена.


 
Anatoly Podgoretsky ©   (2011-11-25 13:27) [7]

Работает говоришь.


 
Германн ©   (2011-11-25 13:28) [8]


> Код как раз таки работает прекрасно

А понимания все равно нет.


 
Laguna ©   (2011-11-25 13:32) [9]

> Германн ©

> Откуда содран сей код?


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

 TCellsColor = class(TObject)
 public
   BrushColor: TColor; // Нужный цвет
 end;
...

procedure TMainFrm.CreateStringGridObj(Obj: TStringGrid; ARow, ACol : Integer);
begin
 with Obj do
  begin
    Objects[ARow, ACol] := TCellsColor.Create; // Связываем объект с ячейкой
   (Objects[ARow, ACol] as TCellsColor).BrushColor := clAqua;
  end;
end;
...
 InfoStringGrid.Cells[X, Y] := S;
  if StrToInt(S) < 30 then
   CreateStringGridObj(InfoStringGrid, X, Y);


 
RWolf ©   (2011-11-25 13:36) [10]


> Код как раз таки работает прекрасно.

запиши в ячейку грида строку длиной эдак в триста символов и удивись.


 
И. Павел ©   (2011-11-25 13:39) [11]

> with Obj do
>  begin
>    Objects[ARow, ACol] := TCellsColor.Create; // Связываем
> объект с ячейкой

Тут вам не Net. Перед тем, как писать
Objects[ARow, ACol] := TCellsColor.Create;
Убедитесь, что старый объект (если он есть) удален.


 
Laguna ©   (2011-11-25 13:40) [12]

> RWolf ©   (25.11.11 13:36) [10]

> запиши в ячейку грида строку длиной эдак в триста символов и удивись.

Для какой цели? Для решения конкретной задачи , в которой StringGrid получает два символа в ячейку все работает. Будет другая цель - будем искать другие решения.


 
RWolf ©   (2011-11-25 13:44) [13]


> Laguna ©   (25.11.11 13:40) [12]

поясняю. вместо короткого, читабельного и безглючного кода (простое PChar(Cells[])) применён длинный, кривой и глючный. это плохое решение.


 
Германн ©   (2011-11-25 13:48) [14]


> Этот код уже давно был взят из DelphiWord6

Дела давно минувших дней
Преданья старины глубокой


 
Laguna ©   (2011-11-25 13:50) [15]

> RWolf ©   (25.11.11 13:44) [13]

> > поясняю. вместо короткого,
>  читабельного и безглючного кода (простое PChar(Cells[]))
> применён длинный, кривой и глючный. это плохое решение.

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

> И. Павел ©   (25.11.11 13:39) [11]

>Тут вам не Net. Перед тем, как писать Objects[ARow, ACol] := >TCellsColor.Create;
> Убедитесь, что старый объект (если он есть) удален.

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


 
Anatoly Podgoretsky ©   (2011-11-25 13:51) [16]


> Код как раз таки работает прекрасно.


И


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


Не понятно где врешь?


 
Anatoly Podgoretsky ©   (2011-11-25 13:56) [17]

> Laguna  (25.11.2011 13:50:15)  [15]

Какие грабли, когда "Код как раз таки работает прекрасно"


 
RWolf ©   (2011-11-25 13:56) [18]


> как заметить "правильным"

DrawText(Handle, Buf, PChar(Cells[]), …), очевидно.
а костыль Buf выкинуть.


 
RWolf ©   (2011-11-25 13:57) [19]

тьфу, сам уже запутался.
DrawText(Handle, PChar(Cells[]), …), конечно.


 
Laguna ©   (2011-11-25 15:15) [20]

Переписал

procedure TMainFrm.InfoStringGridDrawCell(Sender: TObject; ACol,
                  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
 with (Sender as TStringGrid), Canvas do
  begin
    if Objects[ACol, ARow] is TCellsColor then
     Brush.Color := TCellsColor(Objects[ACol, ARow]).BrushColor
    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;

Правда не совсеп понял с параметром lpString, точнее то , что он в зависимости от следующего nCount ?. Здесь же на сайте нашел разъяснение функии и там написано :

lpString
  Строка для вывода. Если параметр nCount равен -1, строка должна быть нуль-терминированная (null-terminated), то есть заканчиваться символом #0.


Так когда правильно ставить nCount = -1 или length(s)?


 
RWolf ©   (2011-11-25 15:39) [21]

-1


 
Омлет ©   (2011-11-25 15:40) [22]


> Так когда правильно ставить nCount = -1 или length(s)?

Хоть как, там же PChar передается.


 
Омлет ©   (2011-11-25 15:42) [23]

Хотя лучше передавать реальную длину, чтобы DrawText не искала конец строки.


 
RWolf ©   (2011-11-25 15:47) [24]


> Омлет ©   (25.11.11 15:42) [23]

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


 
Омлет ©   (2011-11-25 16:01) [25]


> RWolf ©   (25.11.11 15:47) [24]

Я тебя не заставляю )


 
Laguna ©   (2011-11-25 16:20) [26]

Хм, проблема. Когда SG работает без добавления объектов, то все нормально. Стоит мне их добавить, а потом очистить, то при повторной инициализации пустого SG вылетает AV.

procedure TMainFrm.InfoStringGridDrawCell(Sender: TObject; ACol,
                  ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
 with (Sender as TStringGrid), Canvas do
  begin
    if Objects[ACol, ARow] is TCellsColor then
     Brush.Color := TCellsColor(Objects[ACol, ARow]).BrushColor
    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;

Удаляю объекты вот так

procedure TMainFrm.FreeStringGridObj(Obj: TStringGrid);
var
i, j: Integer;
begin
 for i := 0 to Obj.ColCount - 1 do
  for j := 0 to Obj.RowCount - 1 do
   if Obj.Objects[i, j] is TCellsColor then
    (Obj.Objects[i, j] as TCellsColor).Free;
end;


 
RWolf ©   (2011-11-25 16:27) [27]


> (Obj.Objects[i, j] as TCellsColor).Free;

объект уничтожен, но содержимое Obj.Objects[i, j] не изменилось.
перед тем, как работать со ссылкой на объект, нужно убедиться, что объект существует.


 
Laguna ©   (2011-11-25 16:30) [28]

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

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

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


 
Laguna ©   (2011-11-25 16:30) [29]

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

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

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


 
RWolf ©   (2011-11-25 16:34) [30]

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


 
Laguna ©   (2011-11-25 16:39) [31]

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


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


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

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


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


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


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


 
Laguna ©   (2011-11-25 22:07) [34]


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

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


 
Jeer ©   (2011-11-25 22:25) [35]


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


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


 
Jeer ©   (2011-11-25 22:33) [36]

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


 
Laguna ©   (2011-11-25 22:52) [37]


> Jeer ©  

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


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


> 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 23:46) [39]

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

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


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


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

Присваивать:
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;

?



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

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

Наверх




Память: 0.58 MB
Время: 0.014 c
2-1322338716
Крестовый туз
2011-11-27 00:18
2012.03.04
Билдер на Delphi


15-1321213096
black2008
2011-11-13 23:38
2012.03.04
ищу автора или исходники (лото 2005) yurec66.narod.ru


15-1321342175
oleg1963lora
2011-11-15 11:29
2012.03.04
Анимация *.gif объектов


4-1254988754
teapo1989
2009-10-08 11:59
2012.03.04
Получение handle окон


15-1320987591
Perevamon
2011-11-11 08:59
2012.03.04
Почему запрос выводит лишние строки?