Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/34: Рейтинг темы: голосов - 34, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 06.12.2010
Сообщений: 4
1

StringGrid, работа с ячейками.

20.12.2010, 12:33. Показов 6946. Ответов 7
Метки нет (Все метки)

Здравствуйте. Тему создал новую, так как все остальные перешарил по данному вопросу, и ничего конкретного не нашел. Я работаю на C++ Builder 6. Компонента StringGrid. Задача состоит в том, что необходимо закрасить нужную ячейку в красный цвет по щелчку мыши, и вернуть обратный цвет, если кликнуть по данной ячейке ещё раз.
Написал условие, вроде правильное, но почему то в красный красит, а в зеленый обратно не возвращает. Ну здесь же явно какая нибудь маленькая ошибочка просто гдето и я её не замечаю? Заранее спасибо.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
bool flag=false;
void __fastcall TKino1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
          TGridDrawState State)
{
   StringGrid1->Canvas->FillRect(Rect);
   if(flag)
{
         if(StringGrid1->Color ==clGreen)
        {
           StringGrid1->Canvas->Brush->Color =clMaroon;
 
        }
         if(StringGrid1->Color ==clMaroon)
        {
            StringGrid1->Canvas->Brush->Color =clGreen;
 
        }
        StringGrid1->Canvas->FillRect(Rect);
   }
}
 
//---------------------------------------------------------------------------
void __fastcall TKino1::StringGrid1Click(TObject *Sender)
{
 flag = true;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.12.2010, 12:33
Ответы с готовыми решениями:

StringGrid работа с ячейками.
Доброго времени суток. Работаю в С++ Builder 6. задача стоит такая, нужно, чтобы по клику на...

Работа с ячейками StringGrid
При нажатии на определённую ячейку она должна закрашиваться в синий цвет if...

StringGrid, как сделать сетку оранжевого цвета между ячейками?
Много ячеек, много данных, все сливается, как сделать сетку между ячейками по толщине допустим 0,2...

Работа с ячейками StringGrid
Скажите, как можно добавить в ячейки StringGrid одним оператором?

7
1 / 1 / 0
Регистрация: 14.12.2009
Сообщений: 4
20.12.2010, 17:18 2
как я понял, изначально StringGrid1->Color = clGreen, тогда программа не работает из-за не правильного условия.
if (StringGrid1->Color == clGreen)
оно ни когда не даст адекватного результата, ведь ты ни где не меняешь свойство цвета таблицы. даже если ты его поменяешь адекватности это не добавит.
тебе надо определить цвет ячейки, а потом уже его сравнивать с зеленым или красным...

у тебя ячейки постоянного размера?
0
Эксперт С++
3947 / 1802 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
20.12.2010, 20:17 3
Лучший ответ Сообщение было отмечено как решение

Решение

IGGOR92, задание элементарное, только подошли вы к нему неправильно.
Вам же нужно цвет в ячейке проверять... а вы зачем-то цвет фона контрола проверяете.
А ещё лучше - не забывать о том, что TCanvas в TStringGrid имеет свойство перерисовывать, следовательно, нужно хранить значения в массиве.
Цитата Сообщение от aka_messiah Посмотреть сообщение
у тебя ячейки постоянного размера?
Это не должно иметь значения.




Решение:
1. В заголовочном файле, в области public объявите:
C++
1
2
bool **CellMatrixState;
int x, y;
2. Конструктор формы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
  x = 3, y = 3;
  StringGrid1->FixedRows = 0;
  StringGrid1->FixedCols = 0;
  StringGrid1->RowCount = y;
  StringGrid1->ColCount = x;
 
  CellMatrixState = new bool * [x];
  for (int i = 0; i < x; i++) {
    CellMatrixState[i] = new bool [y];
  }
 
  for (int i = 0; i < x; i++) {
    for (int j = 0; j < y; j++) {
      CellMatrixState[i][j] = false;
    }
  }
}
3. Событие OnDrawCell:
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
                    TGridDrawState State)
{
  if (CellMatrixState[ACol][ARow]) {
    StringGrid1->Canvas->Brush->Color = clLime;
  } else {
    StringGrid1->Canvas->Brush->Color = clRed;
  }
  StringGrid1->Canvas->Rectangle(Rect);
}
4. Событие OnSelectCell:
C++
1
2
3
4
5
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow,
                    bool &CanSelect)
{
  CellMatrixState[ACol][ARow] = !CellMatrixState[ACol][ARow];
}
5. Событие OnClose для формы:
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  for (int i = 0; i < x; i++) {
    delete []CellMatrixState[i];
  }
  delete []CellMatrixState;
  CellMatrixState = NULL;
}
3
0 / 0 / 0
Регистрация: 06.12.2010
Сообщений: 4
21.12.2010, 13:07  [ТС] 4
MikeSoft,
спасибо, все работает, огромное спасибо.

Добавлено через 6 часов 56 минут
MikeSoft привет. Начал разбираться, а все строки кода разобрать не могу, гугл не хочет помогать вообще.
Можешь, пожалуйста, прокомментировать строки, где я поставил дабл слэш?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
bool **CellMatrixState; //
int x, y;
void __fastcall TKino1::FormCreate(TObject *Sender) //Не понимаю для чего этот обработчик
{
  x = 20, y = 20; //Сетка 20х20 ячеек
  StringGrid1->FixedRows = 0;//Убрал фиксированные ряды
  StringGrid1->FixedCols = 0;//Убрал фиксированные столбцы
  StringGrid1->RowCount = y;
  StringGrid1->ColCount = x;
 
  CellMatrixState = new bool * [x];
  for (int i = 0; i < x; i++)
  {
    CellMatrixState[i] = new bool [y];
  }
 
  for (int i = 0; i < x; i++)
  {
    for (int j = 0; j < y; j++)
    {
      CellMatrixState[i][j] = false; //
    }
  }
}
 
//---------------------------------------------------------------------------
void __fastcall TKino1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
                                        TGridDrawState State)
 
 
 {
   if (CellMatrixState[ACol][ARow])
  {
    StringGrid1->Canvas->Brush->Color = clMaroon;
  }
  else
  {
    StringGrid1->Canvas->Brush->Color = clGreen;
  }
  StringGrid1->Canvas->Rectangle(Rect);
}
 
//---------------------------------------------------------------------------
void __fastcall TKino1::StringGrid1SelectCell(TObject *Sender, int ACol,
      int ARow, bool &CanSelect) //
{
   CellMatrixState[ACol][ARow] = !CellMatrixState[ACol][ARow];//
}
 
 
//---------------------------------------------------------------------------
 
void __fastcall TKino1::FormClose(TObject *Sender, TCloseAction &Action)//
{
for (int i = 0; i < x; i++)
  {
    delete []CellMatrixState[i];
  }
  delete []CellMatrixState;
  CellMatrixState = NULL;//
 
}
Заранее благодарю.
0
Эксперт С++
3947 / 1802 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
21.12.2010, 13:30 5
Цитата Сообщение от IGGOR92 Посмотреть сообщение
C++
1
void __fastcall TKino1::FormCreate(TObject *Sender) //Не понимаю для чего этот обработчик
По поводу FormCreate я вообще ничего не писал.
Объявите действия в конструкторе класса.
Цитата Сообщение от IGGOR92 Посмотреть сообщение
C++
1
CellMatrixState[i][j] = false; //
Данное действие выполняется в цикле. Происходит инициализация созданного массива начальными значениями. То есть, все элементы массива примут значение false.

Цитата Сообщение от IGGOR92 Посмотреть сообщение
C++
1
2
void __fastcall TKino1::StringGrid1SelectCell(TObject *Sender, int ACol,
 int ARow, bool &CanSelect) //
Это обработчик события OnSelectCell.
Событие наступает тогда, когда пользователь выбирает ячейку в объекте класса TStringGrid.

Цитата Сообщение от IGGOR92 Посмотреть сообщение
C++
1
CellMatrixState[ACol][ARow] = !CellMatrixState[ACol][ARow];//
Данное действие присваивает элементу его обратное значение. Так сказать, "сокращённая запись".
Если рассматривать данное действие с использованием if, то вид будет примерно следующий:
C++
1
2
3
4
5
if (CellMatrixState[ACol][ARow] == true) {
  CellMatrixState[ACol][ARow] = false;
} else {
  CellMatrixState[ACol][ARow] = true;
}
Цитата Сообщение от IGGOR92 Посмотреть сообщение
C++
1
void __fastcall TKino1::FormClose(TObject *Sender, TCloseAction &Action)//
Событие OnClose наступает тогда, когда пользователь принимает решение закрыть форму (при условии того, что успешно выполнено OnCloseQuery).
1
0 / 0 / 0
Регистрация: 06.12.2010
Сообщений: 4
22.12.2010, 12:36  [ТС] 6
MikeSoft,
Спасибо, в коде разобрался. Но одна проблема сейчас возникла. Не могу пронумеровать ячейки. Если нумеровать ячейки с помощью текста, который написан в едите, то получается цвет ячейки поверх символа. Мне надо пронумеровать ячейки от 1-20 на каждый ряд. Не подскажешь какой самый простой способ, пожалуйста. Заранее благодарю.
0
Эксперт С++
3947 / 1802 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
22.12.2010, 20:30 7
IGGOR92, для нанесения текста используйте функцию TextOut, или TextOutW (для проектов, поддерживающих юникод).

Для примера, измените событие OnDrawCell:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol, int ARow, TRect &Rect,
                    TGridDrawState State)
{
  if (CellMatrixState[ACol][ARow]) {
    StringGrid1->Canvas->Brush->Color = clLime;
  } else {
    StringGrid1->Canvas->Brush->Color = clRed;
  }
  StringGrid1->Canvas->Rectangle(Rect);
 
  String StateText = BoolToStr(CellMatrixState[ACol][ARow],true);
  int StateTextWidth = StringGrid1->Canvas->TextWidth(StateText);
  int StateTextHeight = StringGrid1->Canvas->TextHeight(StateText);
  int StateTextLeft = Rect.Left + Rect.Width()/2 - StateTextWidth/2;
  int StateTextTop = Rect.Top + Rect.Height()/2 - StateTextHeight/2;
  StringGrid1->Canvas->TextOutW(StateTextLeft,StateTextTop,StateText);
}
Все функции прекрасно описаны во встроенной справочной системе.
0
3 / 3 / 1
Регистрация: 06.09.2010
Сообщений: 68
02.04.2011, 04:22 8
Мне тоже помогло это, но у меня задание немного другое, мне нужно вызывать процедуру смены цвета не по клику а программно, то есть внутри другой процедуры, как это сделать можно?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.04.2011, 04:22
Помогаю со студенческими работами здесь

Работа с ячейками StringGrid
Как занести значение переменной в ячейку StringGrid из переменной?

StringGrid работа с ячейками
Доброе время . Решил сделать кодер изображений для вывода их на различные дисплеи с помощью мк. ...

Математические операции с ячейками StringGrid
на форме 11 strinngrid. ( надеюсь праграмма выдержит ). если кто спросит зачем столько strinngrid...

Сохранение stringgrid c многострочными ячейками
Подскажите как сохранить содержимое stringgrig в файл, чтобы потом обратно можно было его загрузить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru