![]() |
| ||
|
|
Новости |
Поиск |
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-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] := '';
Или я не про то содержимое думаю?