С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
3 / 3 / 1
Регистрация: 23.02.2011
Сообщений: 18

Динамический StringGrid

23.02.2011, 16:13. Показов 5304. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте.
Помогите решить вопрос: я создаю n StringGrid(ов) количество зависит от решения задачи нужно закрасить ячейки каждого грида в процессе создания номера ячеек узнаются в ходе решения и меняются для каждой таблицы. Как закрасить ячейки или как объявить событие OnDrawCell для каждой таблицы? Событие создать получается, но вызвать его не получается. Вообщем обрисую немного ситуацию: нажимаю на кнопку создаются таблицы и заполняются числами нужно закрасить ячейки. Заранее благодарен!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.02.2011, 16:13
Ответы с готовыми решениями:

динамический StringGrid область видимости
Добрый день, помогите решить проблему. Решил заменить статический грид динамическим. в хедере формы объявил TStringGrid...

Считывание ячеек из StringGrid и запись их в динамический массив C++
Доброго времени суток! Совсем недавно начал осваивать Builder C++ и сам синтаксис языка плюсов (до этого изучал Си). Мне необходимо...

Вывести данные из StringGrid-ов на двух формах в StringGrid на третьей форме
Помогите,не разбираюсь,только учусь:(:wall:...Вообщем,имеется программа с 3 формами. На первой из них находится вводный StringGrid с...

12
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
23.02.2011, 16:56
почти та же проблема, см. пост уважаемого NiTan'а.
0
3 / 3 / 1
Регистрация: 23.02.2011
Сообщений: 18
23.02.2011, 17:54  [ТС]
Да видел ту тему. С кнопками все получается и нормально работает, но если бы здесь все получилось не было бы и темы. Вот код:
C++
1
2
3
4
5
6
7
8
    
void __fastcall Button1Click(TObject *Sender);
private:
public:
void __fastcall MyDrawCell(TObject *Sender, int ACol, int ARow,
          TRect &Rect, TGridDrawState State);
virtual __fastcall TSDIAppForm(TComponent *AOwner);
};
Пробовал перенести в секцию __published тоже не помогло
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __fastcall TSDIAppForm::MyDrawCell(TObject *Sender, int ACol, int ARow,
          TRect &Rect, TGridDrawState State)
{
 
}
//---------------------------------------------------------------------------
 
void __fastcall TSDIAppForm::Button1Click(TObject *Sender)
{
TStringGrid *StringGrid = new TStringGrid(SDIAppForm);
StringGrid->Parent = SDIAppForm;
StringGrid->OnDrawCell = MyDrawCell;
}
//---------------------------------------------------------------------------
Вот ошибка:
Code
1
[BCC32 Error] SDIMAIN.CPP(60): E2034 Cannot convert 'void (_fastcall * (_closure )(TObject *,int,int,TRect &,TGridDrawState))(TObject *,int,int,TRect &,TGridDrawState)' to 'TDrawCellEvent'
или например другая тема
https://www.cyberforum.ru/post637153.html
А когда прописываешь код события не видит что такое StringGrid хотя наверно это ожидаемо так как компонента нет на форме и как тогда обратиться к компоненту TStringGrid(Sender).Canvas.... так делал вроде работало, но исходя из предыдущего я не могу вызвать событие. Помогите пожалуйста решить данный вопрос.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
23.02.2011, 18:09
туманно все как-то...
C++
1
2
3
4
5
6
void __fastcall TSDIAppForm::Button1Click(TObject *Sender)
{
TStringGrid *StringGrid = new TStringGrid(SDIAppForm);
StringGrid->Parent = SDIAppForm;
MyDrawCell(StringGrid,ПРОЧИЕ_ПАРАМЕТРЫ);
}
Функция только в примере пустая ?
0
3 / 3 / 1
Регистрация: 23.02.2011
Сообщений: 18
23.02.2011, 18:36  [ТС]
Судя по этому посту
События динамически созданных компонентов...
B1->OnClick=BClick; так мы присвоили событие для кнопки
StringGrid->OnDrawCell = MyDrawCell; а так не получается
Вообщем когда я нажимаю на кнопку создаются таблицы и в каждой таблице нужно закрасить ячейки.
Например если таблица уже существуюет на форме то это не проблема будет примерно так:
C++
1
2
3
4
5
if(ACol == BasicGridINumber && ARow != 0 || ARow == BasicGridJNumber && ACol != 0)
{
StringGrid1->Canvas->Brush->Color = clHighlight;
StringGrid1->Canvas->FillRect(Rect);
}
где BasicGridINumber и BasicGridJNumber меняются в ходе решения
дак как можно объявить событие OnDrawCell и закрасить ячейки.
Для чего это:
Цитата Сообщение от LK Посмотреть сообщение
MyDrawCell(StringGrid,ПРОЧИЕ_ПАРАМЕТРЫ);
Нужно выделить примерно как на скиншоте только цвета выберу сам
Миниатюры
Динамический StringGrid  
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
23.02.2011, 19:48
Цитата Сообщение от BoyarskiyA Посмотреть сообщение
Для чего это:
я так понял, что вы определяете свою функцию, потом без лишних телодвижений ее необходимо вызвать для определенного контрола и с определенными параметрами. Если это стандартный обработчик, то для чего вы пихаете его то в приват, то в паблик?
0
3 / 3 / 1
Регистрация: 23.02.2011
Сообщений: 18
24.02.2011, 07:13  [ТС]
Хорошо спрошу проще. Как объявить событие OnDrawCell для динамических StringGrid(ов)?
События динамически созданных компонентов...-эта тема помогла только с динамическими Button.
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
03.03.2011, 23:18
BoyarskiyA, если я не ошибаюсь, то вам не надо вызывать обработчик OnDrawCell, он и так постоянно вызывается для отрисовки содержимого, вам остается только внутри анализировать параметры и красить ячейки... пока не могу понять, что не выходит-то? не красит?
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
04.03.2011, 01:28
Цитата Сообщение от BoyarskiyA Посмотреть сообщение
...
B1->OnClick=BClick; так мы присвоили событие для кнопки
StringGrid->OnDrawCell = MyDrawCell; а так не получается
...
мне выдало вот это:
[C++ Error] Unit1.cpp(25): E2034 Cannot convert
'void (_fastcall * (_closure )(TObject *,int,int,TRect &,TGridDrawState))(TObject *,int,int,TRect &,TGridDrawState)'
to
'void (_fastcall * (_closure )(TObject *,int,int,const TRect &,TGridDrawState))(TObject *,int,int,const TRect &,TGridDrawState)'

я присмотрелся, нашел что не сходится и дописал const
и все получилось

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
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TStringGrid *sg = new TStringGrid(Form1);
    sg->Parent = Form1;
    sg->Top = 0;
    sg->Left = 0;
    sg->Height = 400;
    sg->Width = 400;
    sg->OnDrawCell = MyDrawCell;
    sg->Show();
 
    // запоняем
    int hehe = 0;
    for(int i = 0; i < 5; i++)
    {
        for(int q = 0; q < 5; q++)
        {
            sg->Cells[i][q] = hehe++;
        }
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MyDrawCell(TObject *Sender, int ACol,
      int ARow, const TRect &Rect, TGridDrawState State)
{
    TStringGrid *SGX = dynamic_cast<TStringGrid*>(Sender);
 
    if(ACol == 3 && ARow != 0 || ARow == 3 && ACol != 0)
    {
        SGX->Canvas->Brush->Color = clGreen;
        SGX->Canvas->FillRect(Rect);
    }
}
//---------------------------------------------------------------------------

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
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Grids.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TButton *Button1;
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall MyDrawCell(TObject *Sender, int ACol, int ARow, const TRect &Rect, TGridDrawState State);
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
все красится =)
2
3 / 3 / 1
Регистрация: 23.02.2011
Сообщений: 18
04.03.2011, 09:23  [ТС]
Всем огромное спасибо все работает. Можно ракрывать.
0
3 / 3 / 1
Регистрация: 23.02.2011
Сообщений: 18
05.03.2011, 10:11  [ТС]
А если вот так примерно мой код выглядит
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
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int A,B;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
for(int k = 0; k < 5; k++)
    {
    TStringGrid *sg = new TStringGrid(Form1);
    sg->Parent = Form1;
    sg->Top = 0;
    sg->Left = 0;
    sg->Height = 400;
    sg->Width = 400;
    sg->OnDrawCell = MyDrawCell;
    sg->Show();
 
    // запоняем
    int hehe = 0;
    for(int i = 0; i < 5; i++)
    {
     A = //Какой нибудь строке меняется при каждой "k"
        for(int q = 0; q < 5; q++)
        {
         B = //Какому нибудь столбцу меняется при каждой "k"
            sg->Cells[i][q] = hehe++;
        }
    }
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MyDrawCell(TObject *Sender, int ACol,
      int ARow, const TRect &Rect, TGridDrawState State)
{
    TStringGrid *SGX = dynamic_cast<TStringGrid*>(Sender);
/*Надо закрасить строки и столбцы для каждой "k" а получается A,B значения последнего вычисления*/ 
    if(ACol == A && ARow != 0 || ARow == B && ACol != 0)
    {
        SGX->Canvas->Brush->Color = clGreen;
        SGX->Canvas->FillRect(Rect);
    }
}
//---------------------------------------------------------------------------
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
05.03.2011, 12:34
эм... а поконкретней можно?

C++
1
2
3
4
5
6
7
8
9
10
11
12
...
    int hehe = 0;
    for(int i = 0; i < 5; i++)
    {
     A = k; // ?
        for(int q = 0; q < 5; q++)
        {
         B = k; // ?
            sg->Cells[i][q] = hehe++;
        }
    }
...
0
3 / 3 / 1
Регистрация: 23.02.2011
Сообщений: 18
06.03.2011, 12:43  [ТС]
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
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int A,B;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
/*k - это количество проделанных итераций если решение найдено то в конце выходит их цикла при каждой инерации строится таблица*/
for(int k = 0; k < 5; k++)
    {
     //Тут строим таблицу если еще есть что решать
    TStringGrid *sg = new TStringGrid(Form1);
    sg->Parent = Form1;
    sg->Top = 0;
    sg->Left = 0;
    sg->Height = 400;
    sg->Width = 400;
    sg->OnDrawCell = MyDrawCell;
    sg->Show();
 
    // запоняем
    int hehe = 0;
    //Здесь происходит само решение задачи
    for(int i = 0; i < 5; i++)
    {
     A = /*Это номер строки в котором находится разрешающий элемент надо закрасить эту строку*/
        for(int q = 0; q < 5; q++)
        {
         B = /*Это номер столбца в котором находится разрешающий элемент надо закрасить этот столбец A и B изменяются в каждой итерации или "k"*/
            sg->Cells[i][q] = hehe++;
        }
    }
}
/*Как отсюда передать значения A и B при каждом "k" например 1,2,3 и т.д.*/
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MyDrawCell(TObject *Sender, int ACol,
      int ARow, const TRect &Rect, TGridDrawState State)
{
    TStringGrid *SGX = dynamic_cast<TStringGrid*>(Sender);
/*Но сюда возращаются значения A и B лишь последнего вычисления "k" а надо для каждого*/ 
    if(ACol == A && ARow != 0 || ARow == B && ACol != 0)
    {
        SGX->Canvas->Brush->Color = clGreen;
        SGX->Canvas->FillRect(Rect);
    }
}
//---------------------------------------------------------------------------
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.03.2011, 12:43
Помогаю со студенческими работами здесь

Сохранение из StringGrid массива в файл и загрузка из файла в StringGrid
Всем доброго времени суток =) У меня есть загрузка массива из StringGrid на Delphi 2010: //загрузка из файла procedure...

Как соединить StringGrid с другим StringGrid (Rad xe8)
Здраствуйте. Проблема заключается в следующем: Есть таблица которая указана на 1 изображении дание с которой нада синхронизировать с...

Есть 2 StringGrid в С++ Builder, и нужно взять оттуда данные и заполнить ими 3 StringGrid, как бы сложить 2 та
Код C++ void __fastcall TForm1::Button1Click(TObject *Sender) { int i,j; float p,p1; for (i = 0; i &lt; 48; i++) { ...

Перенос данных из одного StringGrid в другой StringGrid
Здравствуйте . Есть очередной вопрос с матрицами. Есть два StringGrid. В одном столбце первой матрицы есть цифровые значения. Есть Edit....

Возможность вручную писать данные в ячейки StringGrid и заполнение ячеек StringGrid данными из файла после нажатия кнопки
Здравствуйте! Помогите, пожалуйста. Мне необходимо сделать следующее: реализовать возможность вручную писать данные в ячейки StringGrid...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru