Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1321418542
Tin52
2011-11-16 08:42
2012.03.04
Печать из Word


15-1320602490
Vladimir12
2011-11-06 21:01
2012.03.04
Глюки в XE2 Update2


2-1322215244
Aleks
2011-11-25 14:00
2012.03.04
Как определить событие OnClik в динамически созданном объекте Bu


2-1321906467
lars
2011-11-22 00:14
2012.03.04
String Grid Подскажите, пожалуйста, как получить номера выбранных


15-1321010130
SQLEX
2011-11-11 15:15
2012.03.04
Просьба подсказать по java





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский