Форум: "Начинающим";
Текущий архив: 2012.03.04;
Скачать: [xml.tar.bz2];
ВнизЦвет ячейки 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;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.005 c