Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2010, 21:37   #1
Lost'яра))
 
Регистрация: 02.10.2010
Сообщений: 4
Печаль Выделение цветом ячеек в StringGrid (Delphi)

Добрый вечер, уважаемые форумчане
Задание: Подсчитать количество диагональных элементов, у которых ненулевых элементов столбца больше ненулевых элементов строки. (данные элементы "подсветить": изменить цвет их ячейки)

Не получается именно изменить цвет ячейки...
В Интернете много примеров кода с использованием события "OnDrawCell", но оно срабатывает при прорисовке (как я понял)
Мне же надо сначала вычислить эти элементы, а уже затем менять их цвет
Нашёл также другой пример кода, однако при нажатии на кнопку "Вычислить" нужная ячейка просто моргает указанным цветом и вновь становится стандартной
Код (опыт работы с Делфи невелик)
Код:
...
var
  i, j: Integer;
  s: Integer; //счётчик результата
  sstr, sst: Integer; // счётчик результата строки и столбца
  B: array [1..5,1..5] of byte;
  rec:Trect; {для определения прямоугольника, который занимает ячейка}
...
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
if RadioButton9.Checked=True then //если выбрано 9-е из 10 заданий
begin

s:=0;
sstr:=0;
sst:=0;

//a11
i:=1;
for j:=2 to 5 do
if b[i,j]>0 then sst:=sst+1 else sst:=sst;
j:=1;
for i:=2 to 5 do
if b[i,j]>0 then sstr:=sstr+1 else sstr:=sstr;
if sst>sstr then s:=s+1 else s:=s;

//высветить а11
with StringGrid2 do
 begin
  StringGrid2.Canvas.Brush.Color:=clYellow; {определяем цвет, которым будут закрашены таблицы}
  for i:=0 to colcount-1 do    {передвигаемся по строкам }
  for j:=0 to colcount-1 do     {и столбцам до конца таблицы}
  if sst>sstr then                {если гл диагональ и условие}
  begin
  rec:=StringGrid2.cellrect(0,0); {в переменную считывается положение прямоугольника, который занимает текущую ячейку}
 stringGrid2.Canvas.FillRect(rec); {закрашиваем указанный прямоугольник}
 end;
 end;

sstr:=0;
sst:=0;

//a22
i:=2;
for j:=1 to 5 do
begin
if j=2 then sst:=sst else
if b[i,j]>0 then sst:=sst+1 else sst:=sst;
end;
j:=2;
for i:=1 to 5 do
begin
if i=2 then sstr:=sstr else
if b[i,j]>0 then sstr:=sstr+1 else sstr:=sstr;
end;
if sst>sstr then s:=s+1 else s:=s;

with StringGrid2 do
 begin
  StringGrid2.Canvas.Brush.Color:=clYellow;
  for i:=0 to colcount-1 do
  for j:=0 to colcount-1 do    
  if sst>sstr then                
  begin
  rec:=StringGrid2.cellrect(1,1);
stringGrid2.Canvas.FillRect(rec);
 end;
 end;

sstr:=0;
sst:=0;

//a33
i:=3;
for j:=1 to 5 do
begin
if j=3 then sst:=sst else
if b[i,j]>0 then sst:=sst+1 else sst:=sst;
end;
j:=3;
for i:=1 to 5 do
begin
if i=3 then sstr:=sstr else
if b[i,j]>0 then sstr:=sstr+1 else sstr:=sstr;
end;
if sst>sstr then s:=s+1 else s:=s;

with StringGrid2 do
begin
 StringGrid2.Canvas.Brush.Color:=clYellow;
 for i:=0 to colcount-1 do   
  for j:=0 to colcount-1 do     
  if sst>sstr then                
  begin
  rec:=StringGrid2.cellrect(2,2);
 stringGrid2.Canvas.FillRect(rec);
 end;
 end;

sstr:=0;
sst:=0;

//a44
i:=4;
for j:=1 to 5 do
begin
if j=4 then sst:=sst else
if b[i,j]>0 then sst:=sst+1 else sst:=sst;
end;
j:=4;
for i:=1 to 5 do
begin
if i=4 then sstr:=sstr else
if b[i,j]>0 then sstr:=sstr+1 else sstr:=sstr;
end;
if sst>sstr then s:=s+1 else s:=s;

with StringGrid2 do
 begin
  StringGrid2.Canvas.Brush.Color:=clYellow;
  for i:=0 to colcount-1 do   
  for j:=0 to colcount-1 do     
  if sst>sstr then              
  begin
 rec:=StringGrid2.cellrect(3,3); 
 stringGrid2.Canvas.FillRect(rec); {закрашиваем указанный прямоугольник}
 end;
 end;

sstr:=0;
sst:=0;

//a55
i:=5;
for j:=1 to 4 do
if b[i,j]>0 then sst:=sst+1 else sst:=sst;
j:=5;
for i:=1 to 4 do
if b[i,j]>0 then sstr:=sstr+1 else sstr:=sstr;
if sst>sstr then s:=s+1 else s:=s;

with StringGrid2 do
begin
StringGrid2.Canvas.Brush.Color:=clYellow;
 for i:=0 to colcount-1 do    
for j:=0 to colcount-1 do     
 if sst>sstr then                
  begin
  rec:=StringGrid2.cellrect(4,4); 
 stringGrid2.Canvas.FillRect(rec); 
 end;
 end;

//вывод итогов
Label12.Caption:='Таких строк - '+inttostr(s);
end;
end;
Подскажите, как можно выделить-таки эти чёртовы ячейки по ходу работы, ибо заранее они неизвестны, т.к. СтрингГрид забивается по нажатии кнопки рандомно нулями и единицами
Заранее спасибо
Lost'яра)) вне форума Ответить с цитированием
Старый 02.10.2010, 23:17   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Особо не проверял но решение может выглядеть так:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i,j:integer;
begin   randomize;
 with StringGrid1 do
  for i:=0 to RowCount-1 do
   for j:=0 to ColCount-1 do Cells[i,j]:=IntToStr(random(2));

end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var i,r,c:integer;
begin    c:=0;r:=0;
 with TStringGrid(sender) do begin
  for i:=0 to ColCount-1 do if Cells[i,ARow]='0' then inc(r);
   r:=ColCount-r;
  for i:=0 to RowCount-1 do if Cells[ACol,i]='0' then inc(c);
   c:=ColCount-c;
  if (c>r)and(acol=arow) then begin
   with Canvas do begin
    Brush.Color:=clRed;
    FillRect(Rect);
    TextOut(Rect.Left,Rect.Top,Cells[acol,arow]);
   end;
  end;
 end;
end;

end.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.10.2010, 10:55   #3
Lost'яра))
 
Регистрация: 02.10.2010
Сообщений: 4
По умолчанию

Спасибо большое
Всё коротко ясно, чётко и понятно
Работает на "ура" ))
Lost'яра)) вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделение цветом еще не правленных ячеек DYm00n Microsoft Office Excel 12 10.09.2010 18:01
Выделение ячейки цветом - StringGrid. Chudo4258 Помощь студентам 1 01.04.2009 07:03
Выделение цветом определённых ячеек Bbalt Microsoft Office Excel 5 13.02.2009 12:07
выделение строк цветом в StringGrid kate158 Помощь студентам 1 06.08.2008 09:56
как сцепить несколько ячеек чтобы сохранилось выделение цветом или жирным шрифтом gribkow Microsoft Office Excel 7 23.04.2008 09:27