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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2014, 22:00   #1
Dmitri446
Пользователь
 
Регистрация: 17.05.2014
Сообщений: 19
По умолчанию Графическое отображение элементов StringGrid

Ребят, нужна помощь. Есть код:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i,j:word;//считчики и кол-во едениц
begin
  n:=SpinEdit1.Value;//считали значение спинэдита
  StringGrid1.RowCount:=n;//установили кол-во строк таблицы
  StringGrid1.ColCount:=n;//столбцов
  randomize();//генератор рандома
  for i:=1 to n do
    for j:=1 to n do//в цикле
    begin
      a[i,j]:=random(2);//генерируем элементы матрицы
      StringGrid1.Cells[j-1,i-1]:=IntToStr(a[i,j]);//сразу в таблицу заталкиваем
    end;
  isOk:=true;//заполненность - ок
  StringGrid1.Repaint;// вызываем событие перерисовки

end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i,j,count:word;//считчики и кол-во едениц
begin
 if not isOk then
 begin
   Application.MessageBox('Поле еще не сгенерировано','Ошибка',0)  ;
   exit;
 end;
 count :=0;
 for i:=1 to n do
  for j := 1 to n do
 if a[i,j]=1 then inc(count);

 Label1.Caption:='Число минных полей - ' + IntToStr(count);//выводим в Label кол-во едениц
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
if not isOk then exit;//если матрица не заполнена, то выходим
if StrToInt(StringGrid1.Cells[ACol,ARow])=1 then//иначе если элемент равен еденицу
    begin
      StringGrid1.Canvas.Brush.Color:=clRed;//ставим красный цвет
      stringGrid1.Canvas.FillRect(Rect);//заливаем область
      StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow]);//выводим значение матрицы
    end;

if not isOk then exit;//если матрица не заполнена, то выходим
if StrToInt(StringGrid1.Cells[ACol,ARow])=0 then//иначе если элемент равен еденицу
    begin
      StringGrid1.Canvas.Brush.Color:=clGreen;//ставим красный цвет
      stringGrid1.Canvas.FillRect(Rect);//заливаем область
      StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow]);//выводим значение матрицы
    end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
application.terminate;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var acol, arow:integer;
Rect: TRect;
begin
if StrToInt(StringGrid1.Cells[ACol,ARow])=1 then//иначе если элемент равен еденицу
    begin
      StringGrid1.Canvas.Brush.Color:=clOlive;//ставим красный цвет
      stringGrid1.Canvas.FillRect(Rect);//заливаем область
      StringGrid1.Canvas.TextOut(Rect.Left,Rect.Top,StringGrid1.Cells[ACol,ARow]);//выводим значение матрицы
    end;
end;

end.
Суть программы в следующем: В стринг выводятся рандомно еденицы и нули(еденица - минное поле, 0 - простое поле). 1 красится в красный цвет, 0 в зелёный. Хочу добавить несколько кнопок BitBtn и с их помощью переключать цвета. Например, стандартно 1 это красный, а с помощью кнопок BitBtn можно будет поменять цвет еденицы, например в зелёный, синий и тд. Сможете помочь?
Dmitri446 вне форума Ответить с цитированием
Старый 15.12.2014, 22:20   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids,
  ExtCtrls, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    DrawGrid1: TDrawGrid;
    Panel1: TPanel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure DrawGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
      aRect: TRect; aState: TGridDrawState);
    procedure FormCreate(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
const
  cls:array[0..2,1..5] of TColor=(
   (clBlue,clRed,clGreen,clLime,clCream),
   (clYellow,clCaptionText,clYellow,clBlack,clWhite),
   (clRed,clDkGray,clMaroon,clLime,clCream)
  );
var  a:array of array of byte;
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
var i,j:integer;
begin
  with DrawGrid1 do begin
    Align:=alClient;
    FixedRows:=0;
    FixedCols:=0;
    ColCount:=10;
    RowCount:=10;
    SetLength(a,RowCount,ColCount);
    for i:=0 to RowCount-1 do
     for j:=0 to ColCount-1 do
      a[i,j]:=random(5);
  end;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  with DrawGrid1 do begin
    DefaultColWidth:=self.Width div (ColCount+1);
    DefaultRowHeight:=self.Height div (RowCount+1);
  end;
end;

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
begin
  with TDrawGrid(Sender),TDrawGrid(Sender).Canvas do begin
   Brush.Color:=cls[self.Tag,a[aCol,aRow]];
   Font.Size:=DefaultRowHeight div 2;
   FillRect(aRect);
   TextOut(
    aRect.Left+(DefaultColWidth div 2)-(TextWidth('0') div 2),
    aRect.Top+(DefaultRowHeight div 2)-(TextHeight('0') div 2),
    IntToStr(a[aCol,aRow]));
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Tag:=0; DrawGrid1.Repaint;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  tag:=1;  DrawGrid1.Repaint;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Tag:=2; DrawGrid1.Repaint;
end;

end.
Угадал?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.12.2014, 23:47   #3
Dmitri446
Пользователь
 
Регистрация: 17.05.2014
Сообщений: 19
По умолчанию

может можно как то сделать проще без доп. кнопок? Чтобы я\ например нажал кнопку сгенерировать, еденицы перекрасили в один цвет, потом опять нажал сгенерировать, они перекрасились в другой?
Dmitri446 вне форума Ответить с цитированием
Старый 16.12.2014, 08:11   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну можно.
Что-то типа
Код:
if tag<3 then tag:=tag+1 else tag:=0;
в клик кнопки.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.12.2014, 14:27   #5
Dmitri446
Пользователь
 
Регистрация: 17.05.2014
Сообщений: 19
По умолчанию

окей, так тоже неплохо. Ещё вопрос, можно ли как то сделать чтобы мои минные поял, т.е еденицы не соприкасались?
Dmitri446 вне форума Ответить с цитированием
Старый 16.12.2014, 14:39   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну можно то можно, но сходу я не скажу )
минера давно писал, и алгоритм уже не помню.
Проверки нужно писать. Сначала расставляются мины, потом в каждую клеточку массива расставляется цифра согласно анализу, сколько в соседних мин.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Графическое отображение лайков и дизлайков как в youtube gufon PHP 2 06.06.2013 22:03
База данных + графическое отображение (язык не важен) oncheva Фриланс 5 13.05.2013 04:10
корявое отображение StringGrid Китос C++ Builder 10 02.02.2012 23:40
Графическое отображение БД svyatoi777 Помощь студентам 3 08.05.2011 21:06
графическое отображение CraZZy RabbIt Общие вопросы Delphi 15 14.04.2009 15:22