163 / 163 / 9
Регистрация: 08.01.2011
Сообщений: 850
1

Добавить любой элемент на форму

09.01.2011, 13:27. Показов 3587. Ответов 11
Метки нет (Все метки)

Как оно делается?
Надо насоздавать TImage через цикл, как пример. И желательно показать, как потом к ним обращаться.
Вообще зачем оно надо: сделать на visual c++ крестики-нолики на бесконечном поле.

Вообще логики на саму игру хватает, а вот как автоматически добалять на поле места под крестики/нолики я не понял.

Само собой, желательно, что бы потом можно было использовать элементы.
Borland C++ builder 6 у меня

Как пряник, выложу потом игру тут и с комментариями.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2011, 13:27
Ответы с готовыми решениями:

Добавить новый элемент в форму
Пытался найти в гугле, так что не ругайтесь. Не знаю как сделать так, чтобы после нажатия кнопки в...

Как добавить на форму элемент RefEdit?
Добрый день! Подскажите, как добавить на форму элемент RefEdit? Если его нет в панели toolbox... А...

Как на форму добавить элемент TreeView?
Как на форму добавить элемент TreeView?

Как программно добавить элемент на форму
Подскажите, как программно добавить элемент на форму? #include "dartedit.h" #include...

11
599 / 567 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
09.01.2011, 13:34 2
попробуй создать 1 TImage, потом его же через цикл
0
163 / 163 / 9
Регистрация: 08.01.2011
Сообщений: 850
09.01.2011, 13:35  [ТС] 3
Я, честно говоря, не понимаю даже как один TImage вставить программно.
Перетянуть то с панели понимаю, а вот закодить появление...
0
LK
Заблокирован
09.01.2011, 14:07 4
Как - напоминаю -
C++
1
TImage *myImg = new TImage(this);
Динамическое создание нескольких однотипных объектов и управление ими
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
// заголовочный файл:
#include <map>
 
using namespace std;
 
class TForm1 : public TForm
{
...
...
private:    // User declarations
        map <int, TImage*> ImMap; // индексированный контейнер для хранения указателей
        void __fastcall ImageDblClick (TObject *Sender); // самописная ф-я - событие для динамических компонентов
public: 
...
};
 
// в *.cpp модуле формы:
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TImage *img;
  for (int i = 0; i < 10; i ++) // создаем 10 одинаковых объектов типа TImage
       {
          img = new TImage (this);
          img->Parent = this;
          img->Width = 100;
          img->Height = 100;
          img->Top = 100*i+10;
          img->Canvas->Rectangle(0,0, 100, 100); 
          img->OnDblClick = ImageDblClick; // присваиваем самописный обработчик события
          ImMap[i] = img;
       }
}
// --------------------------------------------------------------------------------------------
// свой обработчик события
void __fastcall TForm1::ImageDblClick(TObject *Sender)
{
   TImage *img = dynamic_cast<TImage*>(Sender); // приводим TObject *Sender к типу TImage 
   if (!img) return;
// делаем с img что угодно
}
// --------------------------------------------------------------------------------------------
// удаление динамических компонентов 
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  for (unsigned int j = 0; j<ImMap.size(); j++)
      delete ImMap[j];
  ImMap.clear();
}
2
163 / 163 / 9
Регистрация: 08.01.2011
Сообщений: 850
09.01.2011, 15:17  [ТС] 5
Спасибо, ну, теперь жди игру

По форуму я порылся, попробую сделать ту, которую здесь советовали пару лет назад, но тема почему-то не пошла...
Тоесть с самообучением и прочими пряниками.

Добавлено через 52 минуты
Цитата Сообщение от LK Посмотреть сообщение
Как - напоминаю -
C++
1
TImage *myImg = new TImage(this);
Динамическое создание нескольких однотипных объектов и управление ими
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
// заголовочный файл:
#include <map>
 
using namespace std;
 
class TForm1 : public TForm
{
...
...
private:    // User declarations
        map <int, TImage*> ImMap; // индексированный контейнер для хранения указателей
        void __fastcall ImageDblClick (TObject *Sender); // самописная ф-я - событие для динамических компонентов
public: 
...
};
 
// в *.cpp модуле формы:
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TImage *img;
  for (int i = 0; i < 10; i ++) // создаем 10 одинаковых объектов типа TImage
       {
          img = new TImage (this);
          img->Parent = this;
          img->Width = 100;
          img->Height = 100;
          img->Top = 100*i+10;
          img->Canvas->Rectangle(0,0, 100, 100); 
          img->OnDblClick = ImageDblClick; // присваиваем самописный обработчик события
          ImMap[i] = img;
       }
}
// --------------------------------------------------------------------------------------------
// свой обработчик события
void __fastcall TForm1::ImageDblClick(TObject *Sender)
{
   TImage *img = dynamic_cast<TImage*>(Sender); // приводим TObject *Sender к типу TImage 
   if (!img) return;
// делаем с img что угодно
}
// --------------------------------------------------------------------------------------------
// удаление динамических компонентов 
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  for (unsigned int j = 0; j<ImMap.size(); j++)
      delete ImMap[j];
  ImMap.clear();
}
C++
1
2
3
4
5
6
// удаление динамических компонентов 
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  for (unsigned int j = 0; j<ImMap.size(); j++)
      delete ImMap[j];
  ImMap.clear();
Выдает ошибку

[C++ Error] Unit1.cpp(41): E2316 '_fastcall TForm1::FormClose(TObject *,TCloseAction &)' is not a member of 'TForm1'

Нипанимаю.

Добавлено через 11 минут
И еще одна мелочь. Как сделать вот это:
C++
1
2
int r;
  r = this->Edit1->Text;
?
0
Супер-модератор
8761 / 2492 / 140
Регистрация: 07.03.2007
Сообщений: 11,810
09.01.2011, 15:22 6
KoIIIeY,
Цитата Сообщение от KoIIIeY Посмотреть сообщение
[C++ Error] Unit1.cpp(41): E2316 '_fastcall TForm1::FormClose(TObject *,TCloseAction &)' is not a member of 'TForm1'
у вас нет прототипа этой функции в заголовочном файле
0
163 / 163 / 9
Регистрация: 08.01.2011
Сообщений: 850
09.01.2011, 18:34  [ТС] 7
Ага, нашел, спасибо.

Добавлено через 2 часа 47 минут
Не понимаю, как делать что-либо с созданным обьектом. Оно не работает, что-то.

UPD. Понял, как оно работает.

Добавлено через 8 минут
C++
1
map <int, TImage*> ImMap; // индексированный контейнер для хранения указателей
Я правильно понимаю, что вызвать контейнер можно везде в классе?
Или как оно тут?
И распространяется ли класс TForm1 на основной .cpp файл?
0
LK
Заблокирован
09.01.2011, 22:44 8
И распространяется ли класс TForm1 на основной .cpp файл?
- класс TForm1 "распространяется" на тот файл .cpp , в заголовочном файле которого он объявлен, все это создается автоматом при создании проекта VCL Form Application. И строки типа
C++
1
_fastcall TForm1::FormClose(TObject *,TCloseAction &)
тоже следует создавать "автоматом" в Инспекторе объектов на вкладке События (Events), а не копипастить.
0
163 / 163 / 9
Регистрация: 08.01.2011
Сообщений: 850
21.02.2011, 13:20  [ТС] 9
Сразу не плюйтесь, но правда не могу понять, как сделать.
Мне нужен img->name = 'panel1'; А вот этот 1 == int I.

что бы циклом насоздавать элементов.

C++
1
2
3
4
5
6
7
8
9
10
11
12
char* str = "panel";
          char* str2;
          char* itoa(i, str2, 0);
          strcat(str, str2);
          img = new TPanel (this);
          img->Parent = this;
          img->Width = 25;
          img->Height = 25;
          img->Left = 25+25*s;
          img->Caption = i;
         img->Name = str;
          img->OnClick = ImageDblClick;
Код не рабочий.
Вопрос: как к строке в конец добавить int?

Добавлено через 19 минут
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
TPanel *img;
  int r, s, d, e;
  d = 1;
  s = 0;
  r = 8;
  r = r*r;
  for (int i = 0; i < r; i ++)
       {
          char* str = "panel";
          char * str2 = new char[20];
          itoa(i, str2, 10);
          strcat(str, str2);
          img = new TPanel (this);
          img->Parent = this;
          img->Width = 25;
          img->Height = 25;
          img->Left = 25+25*s;
          img->Caption = str;
          img->Name = str;
          img->OnClick = ImageDblClick;
          s++;
 
          img->Top = 25*d;
          if(s == sqrt(r)){
              s = 0;
              d++;
          }
          ImMap[i] = img;
       }
Вот этот код работает, но функция itoa ведет себя странно.
Вместо правильного перевода int в char, она пишет мне всякие 1231234, 124321, 734234 и тд, а должно бы быть 1, 2, 3, 4 и тд.
Хелп
0
163 / 163 / 9
Регистрация: 08.01.2011
Сообщений: 850
21.02.2011, 14:30  [ТС] 10
Во вложении пример работы. Там должно быть 1, 2, 3, 4 ... тд.
А есть вот.
0
Миниатюры
Добавить любой элемент на форму  
2054 / 1529 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
17.06.2015, 19:06 11
Цитата Сообщение от KoIIIeY Посмотреть сообщение
ообще логики на саму игру хватает, а вот как автоматически добалять на поле места под крестики/нолики я не понял.
Вообще лучше создать 1 TImage, а для изменения размеров поля менять его размеры и т,д. А то у компа на твою логику ни быстродействия ни памяти не хватит
0
Практикантроп
4680 / 2600 / 496
Регистрация: 23.09.2011
Сообщений: 5,580
17.06.2015, 23:23 12
Цитата Сообщение от KoIIIeY Посмотреть сообщение
Вместо правильного перевода int в char, она пишет мне всякие 1231234, 124321, 734234 и тд,
Попробуй
C++
1
char str[] = "panel";
вместо
C++
1
char* str = "panel";
. Похоже, по старому адресу str сохраняются все варианты итераций.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2015, 23:23

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Как добавить на форму элемент типа grid?
Хочу работать с БД, listbox кажется неудобным. Возможно ли, и если да, то как, добавить что-то типа...

Как в подчиненную форму программно добавить элемент управления?
Всем добрый день. Собственно проблема - заголовк. Не могу никак из кода программы добавить элемент...

Простой вопрос (не бейте меня). Как программно добавить элемент на форму?
Есть форма, надо добавить на нее новый элемент (кнопку, текст...)

При нажатии на кнопку в зависимости от состояния чекбокса на вторую форму добавить элемент
Нужно что бы при нажатии на кнопку Button1 на Form1, в том случае если checkBox1.Cheked = True на...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.