C++Builder
Начало
Форум
Помощь
Войти
Регистрация
C++Builder
>
Forum
>
Вопросы программирования
>
Общие вопросы программирования в C++Builder
>
Динамическое создание нескольких Image's
Страниц: [
1
]
Вниз
Печать
Автор
Тема: Динамическое создание нескольких Image's (Прочитано 27945 раз)
LiaHiM
Начинающий :))
Участник
Сказали спасибо: +0/-0
Offline
Сообщений: 34
Динамическое создание нескольких Image's
«
:
28 ноября 2007, 14:12:42 »
Доброго времени суток, уважаемые жители форума.
В создании динамических массивов почти полный профан
...как в общем-то и в С++
...всё Delphi...Delphi...
Нужно разработать приложение "Редактор блок-схем алгоритмов"
Каким образом можно создать несколько объектов типа TImage?
...и как к ним обращаться для того, чтобы изменить их свойства (высота, ширина, рисуемое изображение)
Думаю, что создам свой класс, хотя это не обязательно...описание примерно такое
Название класса Атрибуты Описание атрибутов Методы Назначение методов
TBlock TString *Text Содержит текст блока OnCreate() Создание блока.
TypeBlock Определяет тип блока, Выделение памяти
что в свою очередь влияет
на отображаемое изображение OnRepaint() Перерисовка блока
Может принимать одно
из фиксированных значений. OnDestroy() Освобождение
TImage *Pict Содержит выводимое изображение памяти
Приложение по типу MDI, поэтому придётся создавать двумерный динамический массив...хотя это уже мое усложнение задачи. Если не "въеду в тему "указатели-динамически массивы" " , то остановлюсь на SDI интерфейсе.
Возможно кто-то предложит более разумную реализацию
«
Последнее редактирование: 29 ноября 2007, 16:58:14 от LiaHiM
»
Записан
oxotnik
Глобальный модератор
Сказали спасибо: +100/-15
Offline
Сообщений: 2425
Re: Динамическое создание нескольких Image's
«
Ответ #1 :
28 ноября 2007, 14:16:30 »
юзай поиск "Динамическое создание объектов"
Записан
LiaHiM
Начинающий :))
Участник
Сказали спасибо: +0/-0
Offline
Сообщений: 34
Re: Динамическое создание нескольких Image's
«
Ответ #2 :
28 ноября 2007, 14:40:51 »
Извините, что поздно поиском воспользовался...что-то подобное уже есть...
«
Последнее редактирование: 28 декабря 2007, 16:06:55 от LiaHiM
»
Записан
LiaHiM
Начинающий :))
Участник
Сказали спасибо: +0/-0
Offline
Сообщений: 34
Re: Динамическое создание нескольких Image's
«
Ответ #3 :
03 декабря 2007, 12:01:04 »
Советы в реализации программы, не смотря на это, принимаются
Записан
oxotnik
Глобальный модератор
Сказали спасибо: +100/-15
Offline
Сообщений: 2425
Re: Динамическое создание нескольких Image's
«
Ответ #4 :
03 декабря 2007, 12:14:53 »
map <int, TImage *> myMap;
myMap[n] = Pict;
Записан
LiaHiM
Начинающий :))
Участник
Сказали спасибо: +0/-0
Offline
Сообщений: 34
Re: Динамическое создание нескольких Image's
«
Ответ #5 :
03 декабря 2007, 20:17:40 »
Краткость - сестра таланта...Спасибо,
oxotnik
Записан
LiaHiM
Начинающий :))
Участник
Сказали спасибо: +0/-0
Offline
Сообщений: 34
Re: Динамическое создание нескольких Image's
«
Ответ #6 :
11 декабря 2007, 10:16:21 »
Один курсовой сдал
по "Организации ЭВМ"...теперь нужно этот доделать
У кого-нибудь есть исходник на BorlandC++ для решении задачи подобно моей?
Я решил STL использовать.
Куда поместить описание этого вектора или списка или отображения, чтобы был доступен из любого обработчика. Если я создам, например вектор типа vector<TImage*> ImVec в OnCreate формы, то я не могу добавить элементы.
модуль vector подключил #include <vector>...но
[C++ Error] MainUnit.cpp(31): E2451 Undefined symbol 'vector'
Записан
oxotnik
Глобальный модератор
Сказали спасибо: +100/-15
Offline
Сообщений: 2425
Re: Динамическое создание нескольких Image's
«
Ответ #7 :
11 декабря 2007, 10:19:05 »
в заголовочном файле
только как ты с вектором потом будешь искать TImage? перебором?
или <vector<vector>>?
Записан
LiaHiM
Начинающий :))
Участник
Сказали спасибо: +0/-0
Offline
Сообщений: 34
Re: Динамическое создание нескольких Image's
«
Ответ #8 :
11 декабря 2007, 11:49:37 »
А если список по-любому придётся перебором...пробую с отображением
Цитата: oxotnik от 11 декабря 2007, 10:19:05
в заголовочном файле
пишу в MainUnit.h #include <vector>... в MainUnit.cpp ошибка в map <int, TImage *> ImMap;
[C++ Error] MainUnit.cpp(31): E2451 Undefined symbol 'map'
[C++ Error] MainUnit.cpp(31): E2188 Expression syntax
P.S. Файл vector.h есть в C:\Program Files\Borland\CBuilder6\Include\
Записан
LiaHiM
Начинающий :))
Участник
Сказали спасибо: +0/-0
Offline
Сообщений: 34
Re: Динамическое создание нескольких Image's
«
Ответ #9 :
11 декабря 2007, 11:55:37 »
написал
Код:
#include <oldstl/map.h>
Теперь море ошибок в
Код:
iterator.h
Код:
[C++ Error] iterator.h(74): E2238 Multiple declaration for 'input_iterator_tag'
[C++ Error] _iterator_base.h(45): E2344 Earlier declaration of 'input_iterator_tag'
[C++ Error] iterator.h(79): E2238 Multiple declaration for 'output_iterator_tag'
...
P.S. BC++6.0 (Build 10.155)
Записан
oxotnik
Глобальный модератор
Сказали спасибо: +100/-15
Offline
Сообщений: 2425
Re: Динамическое создание нескольких Image's
«
Ответ #10 :
11 декабря 2007, 11:55:45 »
Цитата: LiaHiM от 11 декабря 2007, 11:49:37
А если список по-любому придётся перебором...пробую с отображением
Цитата: oxotnik от 11 декабря 2007, 10:19:05
в заголовочном файле
пишу в MainUnit.h #include <vector>... в MainUnit.cpp ошибка в map <int, TImage *> ImMap;
[C++ Error] MainUnit.cpp(31): E2451 Undefined symbol 'map'
[C++ Error] MainUnit.cpp(31): E2188 Expression syntax
P.S. Файл vector.h есть в C:\Program Files\Borland\CBuilder6\Include\
#include <map>
а не
Цитировать
#include <vector>...
Записан
LiaHiM
Начинающий :))
Участник
Сказали спасибо: +0/-0
Offline
Сообщений: 34
Re: Динамическое создание нескольких Image's
«
Ответ #11 :
11 декабря 2007, 11:58:00 »
Исправил..
Код:
#include <map.h>
скомпилировался...теперь будем колдовать с map
Записан
oxotnik
Глобальный модератор
Сказали спасибо: +100/-15
Offline
Сообщений: 2425
Re: Динамическое создание нескольких Image's
«
Ответ #12 :
11 декабря 2007, 12:04:00 »
можно еще
set
использовать если надо чтобы ключ автоинкриментом был
Записан
LiaHiM
Начинающий :))
Участник
Сказали спасибо: +0/-0
Offline
Сообщений: 34
Re: Динамическое создание нескольких Image's
«
Ответ #13 :
11 декабря 2007, 12:08:56 »
oxotnik
, можешь в 2-х словах методику работы с отображением описать. Нет времени глубоко копать в итераторы, эллокаторы...После защиты курсового можно будет по "дебрям" STL прогуляться
...поразбирать алгоритмы...надеюсь, что время, потраченное на изучение STL, не окажется пустым
Записан
LiaHiM
Начинающий :))
Участник
Сказали спасибо: +0/-0
Offline
Сообщений: 34
Re: Динамическое создание нескольких Image's
«
Ответ #14 :
11 декабря 2007, 12:10:52 »
...в 2-х словах - это в образном понятии
Записан
oxotnik
Глобальный модератор
Сказали спасибо: +100/-15
Offline
Сообщений: 2425
Re: Динамическое создание нескольких Image's
«
Ответ #15 :
11 декабря 2007, 12:18:43 »
map <int, TImage *> myMap;
for (int Key = 0; Key <10; Key++)
{
// здесь определяем Pisct как указатель на картинку (объект)
myMap.insert(Key, Pisct);
}
Записан
LiaHiM
Начинающий :))
Участник
Сказали спасибо: +0/-0
Offline
Сообщений: 34
Re: Динамическое создание нескольких Image's
«
Ответ #16 :
11 декабря 2007, 12:27:45 »
А указатель на изображение создавать до вставки в map
т.е. Pict = new TImage (this);
а потом ImMap.insert(CountBlocks, Pict);
P.S. Вопросы могут быть тупыми...профессионал тоже когда был "чайником"
Записан
LiaHiM
Начинающий :))
Участник
Сказали спасибо: +0/-0
Offline
Сообщений: 34
Re: Динамическое создание нескольких Image's
«
Ответ #17 :
11 декабря 2007, 12:35:08 »
Не пойму куда мне map <int, TImage*> ImMap; писать
мне же нужно чтобы ImMap как глобальная...
Я же буду добавлять/удалять содержимое ImMap из разных функций...
нельзя же написать вроде этого map *ImMap
Записан
oxotnik
Глобальный модератор
Сказали спасибо: +100/-15
Offline
Сообщений: 2425
Re: Динамическое создание нескольких Image's
«
Ответ #18 :
11 декабря 2007, 13:45:00 »
Цитата: oxotnik от 11 декабря 2007, 10:19:05
в заголовочном файле
только как ты с вектором потом будешь искать TImage? перебором?
или <vector<vector>>?
я ж писал уже...
Код:
class TForm1 : public TForm
{
...
...
private:
map <int, TImage*> ImMap;
};
Записан
oxotnik
Глобальный модератор
Сказали спасибо: +100/-15
Offline
Сообщений: 2425
Re: Динамическое создание нескольких Image's
«
Ответ #19 :
11 декабря 2007, 13:50:24 »
Цитата: LiaHiM от 11 декабря 2007, 12:27:45
А указатель на изображение создавать до вставки в map
т.е. Pict = new TImage (this);
а потом ImMap.insert(CountBlocks, Pict);
P.S. Вопросы могут быть тупыми...профессионал тоже когда был "чайником"
TImage *Pict;
for (int Key = 0; Key <10; Key++)
{
Pict = new TImage (this);
// здесь определяем Pisct как указатель на картинку (объект)
myMap.insert(Key, Pisct);
}
Записан
oxotnik
Глобальный модератор
Сказали спасибо: +100/-15
Offline
Сообщений: 2425
Re: Динамическое создание нескольких Image's
«
Ответ #20 :
11 декабря 2007, 13:57:44 »
еще один способ:
сохранять в БД
компоненты сохраняются так(со всеми свойствами):
http://cbuilder.ru/index.php/topic,807.0.html
а в остальном все аналогично мапе
Записан
LiaHiM
Начинающий :))
Участник
Сказали спасибо: +0/-0
Offline
Сообщений: 34
Re: Динамическое создание нескольких Image's
«
Ответ #21 :
11 декабря 2007, 17:10:24 »
Код:
...
CountBlocks++;
Pict = new TImage (this);
ImMap.insert(CountBlocks, Pict);
...
[C++ Error] MainUnit.cpp(222): E2285 Could not find a match for 'map<int,TImage *,less<int>,allocator<pair<const int,TImage *> > >::insert(int,TImage *)'
Что бы это могло значить?
Записан
LiaHiM
Начинающий :))
Участник
Сказали спасибо: +0/-0
Offline
Сообщений: 34
Re: Динамическое создание нескольких Image's
«
Ответ #22 :
11 декабря 2007, 17:16:21 »
Цитата: oxotnik от 11 декабря 2007, 13:57:44
еще один способ:
сохранять в БД
компоненты сохраняются так(со всеми свойствами):
http://cbuilder.ru/index.php/topic,807.0.html
а в остальном все аналогично мапе
Спасибо, но наверное это лишнее. Надо ещё подумать над форматом файла блок-схемы...какой-нибудь бинарный замутить или обойтись *.ini файлами
Записан
oxotnik
Глобальный модератор
Сказали спасибо: +100/-15
Offline
Сообщений: 2425
Re: Динамическое создание нескольких Image's
«
Ответ #23 :
11 декабря 2007, 17:27:15 »
сорри, не правильно сказал...
вот такой код у меня работает:
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
btn = new TButton(this);
i++;
MyMap[i]= btn;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
for (int j = 0; j<i; j++)
delete MyMap[j];
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
TButton *b;
for (int j = 0; j<i; j++)
{
b = MyMap[j];
if (!b) continue;
b->Parent = this;
b->Top = j*20;
}
}
в заголовке:
Код:
class TForm1 : public TForm
{
...
...
private:
std::map<int, TButton*> MyMap;
TButton *btn;
int i;
...
...
};
Записан
LiaHiM
Начинающий :))
Участник
Сказали спасибо: +0/-0
Offline
Сообщений: 34
Re: Динамическое создание нескольких Image's
«
Ответ #24 :
12 декабря 2007, 22:52:54 »
Код:
...
private:
std::map <int, TImage*> ImMap;
bool move;
int CountBlocks, x0, y0;
TRect rec;
TImage *Pict;
...
Код:
//---------------------------------------------------------------------------
void __fastcall TMainForm::PictMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if (Button != mbLeft)
{
move = false;
}
else
{
move = true;
x0 = X;
y0 = Y;
rec = Pict->BoundsRect;
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::PictMouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
if (move)
{
MainForm->Canvas->DrawFocusRect(rec);
rec.Left = rec.Left + X - x0;
rec.Top = rec.Top + Y - y0;
rec.Right = rec.Right + X - x0;
rec.Bottom = rec.Bottom + Y - y0;
x0 = X;
y0 = Y;
MainForm->Canvas->DrawFocusRect(rec);
}
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::PictMouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if (move)
{
MainForm->Canvas->DrawFocusRect(rec);
Pict->SetBounds(rec.Left + X - x0,
rec.Top + X - x0,
Pict->Width, Pict->Height);
move = false;
}
}
Код:
void __fastcall TMainForm::FormClick(TObject *Sender)
{
if (ToolButtonStartStop->Down) // если нажата какая-то определённая кнопка
{
Pict = new TImage (this);
Pict->Parent = MainForm;
//операции ниже вынесу потом в отдельную функцию или попробую свой класс создать...не это сейчас основное для меня...
int a, b, r;
a = 100;
b = a / 4;
r = a / 2;
CountBlocks++;
Pict->Name = "StartStop_" + IntToStr(CountBlocks);
Pict->OnMouseMove = PictMouseMove;
Pict->OnMouseUp = PictMouseUp;
Pict->OnMouseDown = PictMouseDown;
Pict->BringToFront();
Pict->Transparent = true;
Pict->Width = a;
Pict->Height = b;
Pict->Top = Mouse->CursorPos.y - MainForm->Top;
Pict->Left = Mouse->CursorPos.x - MainForm->Left;
Pict->Canvas->Brush->Color = clBtnFace;
Pict->Canvas->FillRect(Rect(0,
0,
Pict->Width,
Pict->Height
)
);
Pict->Canvas->RoundRect(0, 0,
a, b,
r, r);
ListViewBlocks->AddItem(Pict->Name, Pict);
//А непонятное и основное вот это!!!!!!
ImMap[CountBlocks] = Pict;
//добавил ссылку в отображение ImMap, а как потом в обработчиках PictMouseUp/Move/Down обратиться к тому изображению,над которым курсор
}
ToolButtonPoint->Down = true;
}
P.S.
oxotnik
, в твоём варианте кода циклом перебираются все динамически созданные компоненты...а мне нужно обратиться к конкретному
Может как-нибудь проще можно? Использую указатели и массивы...слаб я в этой теме...понял только одно, что указатели и массивы тесно переплетены в С++))
Записан
oxotnik
Глобальный модератор
Сказали спасибо: +100/-15
Offline
Сообщений: 2425
Re: Динамическое создание нескольких Image's
«
Ответ #25 :
13 декабря 2007, 10:47:13 »
полезный FAQ:
http://netcode.ru/cpp/?lang=&katID=2&skatID=6&artID=32
держи проект:
Записан
Страниц: [
1
]
Вверх
Печать
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Вопросы программирования
-----------------------------
=> Общие вопросы программирования в C++Builder
=> Программирование с FMX
=> Работа с базами данных в C++Builder
=> Windows API
=> Технологии COM/DCOM, ActiveX
=> Аспекты и идеология профессиональной разработки ПО
=> Компьютерное железо и системное администрирование
=> студенческий городок
-----------------------------
Обсуждение материалов на сайте
-----------------------------
=> Обсуждений статей на сайте
=> Обсуждение материалов из файлового архива
=> Компоненты сторонних разработчиков к С++Builder
-----------------------------
Работа сайта и новости
-----------------------------
=> Ищу/предлагаю работу
=> Новости из мира программирования
=> Новости - события календаря
=> Голосования
=> Компьютерный юмор и приколы
=> Работа сайта
=> Флейм
-----------------------------
FAQ - частозадаваемые вопросы/ответы
-----------------------------
=> FAQ, общие вопросы, посвящённые C++Builder
=> FAQ, вопросы по базам данных
=> FAQ, вопросы по компонентам