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-25 16:30:00) [21]

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

 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:27:00) [22]


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

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


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

Хм, проблема. Когда 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;


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


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

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


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


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

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


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

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


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


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

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


RWolf   (2011-11-25 15:39:00) [28]

-1


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

Переписал

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 13:57:00) [30]

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


RWolf   (2011-11-25 13:56:00) [31]


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

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


Anatoly Podgoretsky   (2011-11-25 13:56:00) [32]

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

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


Anatoly Podgoretsky   (2011-11-25 13:51:00) [33]


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


И


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


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


Laguna   (2011-11-25 13:50:00) [34]

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

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

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

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

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

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


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


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

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


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


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

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


Laguna   (2011-11-25 13:40:00) [37]

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

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

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


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

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

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


RWolf   (2011-11-25 13:36:00) [39]


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

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


Laguna   (2011-11-25 13:32:00) [40]

> Германн ©

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


Этот код уже давно был взят из 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);


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

Наверх

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