C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамическое создание нескольких Image's  (Прочитано 27944 раз)
LiaHiM
Начинающий :))
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 34


« : 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 Offline

Сообщений: 2425


« Ответ #1 : 28 ноября 2007, 14:16:30 »

юзай поиск "Динамическое создание объектов"
Записан
LiaHiM
Начинающий :))
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 34


« Ответ #2 : 28 ноября 2007, 14:40:51 »

Извините, что поздно поиском воспользовался...что-то подобное уже есть...
« Последнее редактирование: 28 декабря 2007, 16:06:55 от LiaHiM » Записан
LiaHiM
Начинающий :))
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 34


« Ответ #3 : 03 декабря 2007, 12:01:04 »

Советы в реализации программы, не смотря на это, принимаются  Строит глазки
Записан
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« Ответ #4 : 03 декабря 2007, 12:14:53 »

map <int, TImage *> myMap;
myMap[n] = Pict;
Записан
LiaHiM
Начинающий :))
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 34


« Ответ #5 : 03 декабря 2007, 20:17:40 »

Краткость - сестра таланта...Спасибо, oxotnik Веселый
Записан
LiaHiM
Начинающий :))
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 34


« Ответ #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 Offline

Сообщений: 2425


« Ответ #7 : 11 декабря 2007, 10:19:05 »

в заголовочном файле
только как ты с вектором потом будешь искать TImage? перебором?
или <vector<vector>>?
Записан
LiaHiM
Начинающий :))
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 34


« Ответ #8 : 11 декабря 2007, 11:49:37 »

А если список по-любому придётся перебором...пробую с отображением
в заголовочном файле
пишу в 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 Offline

Сообщений: 34


« Ответ #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 Offline

Сообщений: 2425


« Ответ #10 : 11 декабря 2007, 11:55:45 »

А если список по-любому придётся перебором...пробую с отображением
в заголовочном файле
пишу в 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 Offline

Сообщений: 34


« Ответ #11 : 11 декабря 2007, 11:58:00 »

Исправил..
Код:
#include <map.h>
скомпилировался...теперь будем колдовать с map Улыбка
Записан
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« Ответ #12 : 11 декабря 2007, 12:04:00 »

можно еще set использовать если надо чтобы ключ автоинкриментом был
Записан
LiaHiM
Начинающий :))
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 34


« Ответ #13 : 11 декабря 2007, 12:08:56 »

oxotnik, можешь в 2-х словах методику работы с отображением описать. Нет времени глубоко копать в итераторы, эллокаторы...После защиты курсового можно будет по "дебрям" STL прогуляться  Улыбка...поразбирать алгоритмы...надеюсь, что время, потраченное на изучение STL, не окажется пустым
Записан
LiaHiM
Начинающий :))
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 34


« Ответ #14 : 11 декабря 2007, 12:10:52 »

...в 2-х словах - это в образном понятии Веселый
Записан
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« Ответ #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 Offline

Сообщений: 34


« Ответ #16 : 11 декабря 2007, 12:27:45 »

А указатель на изображение создавать до вставки в map
т.е. Pict = new TImage (this);
а потом ImMap.insert(CountBlocks, Pict);

P.S. Вопросы могут быть тупыми...профессионал тоже когда был "чайником" Улыбка
Записан
LiaHiM
Начинающий :))
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 34


« Ответ #17 : 11 декабря 2007, 12:35:08 »

Не пойму куда мне  map <int, TImage*> ImMap; писать
мне же нужно чтобы ImMap как глобальная...
Я же буду добавлять/удалять содержимое ImMap из разных функций...
нельзя же написать вроде этого map *ImMap
Записан
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« Ответ #18 : 11 декабря 2007, 13:45:00 »

в заголовочном файле
только как ты с вектором потом будешь искать TImage? перебором?
или <vector<vector>>?
я ж писал уже...
Код:
class TForm1 : public TForm
{
...
...
private:
map <int, TImage*> ImMap;
};
Записан
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« Ответ #19 : 11 декабря 2007, 13:50:24 »

А указатель на изображение создавать до вставки в 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 Offline

Сообщений: 2425


« Ответ #20 : 11 декабря 2007, 13:57:44 »

еще один способ:
сохранять в БД
компоненты сохраняются так(со всеми свойствами): http://cbuilder.ru/index.php/topic,807.0.html
а в остальном все аналогично мапе
Записан
LiaHiM
Начинающий :))
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 34


« Ответ #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 Offline

Сообщений: 34


« Ответ #22 : 11 декабря 2007, 17:16:21 »

еще один способ:
сохранять в БД
компоненты сохраняются так(со всеми свойствами): http://cbuilder.ru/index.php/topic,807.0.html
а в остальном все аналогично мапе
Спасибо, но наверное это лишнее. Надо ещё подумать над форматом файла блок-схемы...какой-нибудь бинарный замутить или обойтись *.ini файлами
Записан
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« Ответ #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 Offline

Сообщений: 34


« Ответ #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 Offline

Сообщений: 2425


« Ответ #25 : 13 декабря 2007, 10:47:13 »

полезный FAQ: http://netcode.ru/cpp/?lang=&katID=2&skatID=6&artID=32

держи проект:
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в: