![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Цвет ячейки StringGrid по условию [D7, XP]
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);