Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2010, 14:17   #1
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
Вопрос Странные проблемы с загрузкой изображения

Доброго времени суток!
Возникла проблема, весь мозг себе сломал.
Суть в том, что создаю я себе для игры редактор карт, в частности, пишу создание игровых объектов. При нажатии на кнопку "Добавить объект" на Form3 появляется окно Form4, имеющее поля для ввода значений (размеры объекта и т.п.), а также PaintBox для отображения картинок анимации объекта.
На экран этого PaintBox'а отображаются помимо изображений иконки-кнопки типа "добавить анимацию"-"сменить анимацию" а также информация о типе анимации (см. вложение). При щелчке на области, где находится иконка происходит вызов диалога открытия файла с последующей загрузкой анимации и ее отображением.
И все вроде бы хорошо, но если загрузить хотя бы одно изображение, нажать на кнопку "Отмена" и после этого на Form3 вновь нажать "Добавить объект", то вылетает ошибка
Код:
"Cannot open file MapMakerImages\AddAnimation.bmp"
- это изображение иконки-кнопки (вторую иконку тоже не может открыть), хотя до этого прекрасно открывалось и отображалось.
Теперь немного об анатомии приложения. За создание игрового объекта отвечает класс EditedObject, экземпляр которого (под именем NewObject) создается каждый раз при нажатии на кнопку "Добавить объект" на Form3, и удаляется при нажатии на кнопку "Отмена" на Form4. Загрузка изображений иконок-кнопок происходит в конструкторе EditedObject.
Ну и несколько выдержек из кода:
Модуль Form3:
Код:
//Создание формы
void __fastcall TForm3::FormCreate(TObject *Sender)
{
Form4 = new TForm4(this);
Form4 -> Visible = false;
Interface::NewObject = 0;
}

//Нажатие кнопки "Добавить объект"
void __fastcall TForm3::Button1Click(TObject *Sender)
{
if (Interface::NewObject)
   delete Interface::NewObject;
Interface::NewObject = new Interface::EditedObject(Form4 -> ObjectScreen -> Canvas, Form4 -> OpenDialog1);

Form4 -> Visible = true;
Form3 -> Enabled = false;
}
Модуль Form4:
Код:
//Создание формы
void __fastcall TForm4::FormCreate(TObject *Sender)
{
Interface::NewObject = 0;
}

//Закрытие формы, разблокировка Form3
void __fastcall TForm4::FormClose(TObject *Sender, TCloseAction &Action)
{
dynamic_cast<TForm*>(Form4 -> Owner) -> Enabled = true;
}

//Щелчок по экрану PaintBox
void __fastcall TForm4::ObjectScreenClick(TObject *Sender)
{
NewObject -> Click(MyPoint(xx, yy));   //Передаем координаты щелчка обработчику EditedObject
SaveBtn -> Enabled = NewObject -> IsCompletelyDefined();   //Кнопку "Сохранить" можно нажать только если все данные об объекте указаны
}

//Нажатие на кнопку "Отмена"
void __fastcall TForm4::CancelBtnClick(TObject *Sender)
{
delete NewObject;
NewObject = 0;
NameEdit -> Text = "";
WidthEdit -> Text = "";
HeightEdit -> Text = "";
PointsEdit -> Text = "";
Form4 -> Close();
}
И далее в следующем посте...
Изображения
Тип файла: jpg Окно создания объекта.JPG (51.6 Кб, 120 просмотров)
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 09.09.2010, 14:17   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Функции класса EditedObject:
Код:
//Конструктор
Interface::EditedObject::EditedObject(TCanvas* screen, TOpenDialog* changeanimdialog):
   Name(0), Size(MyPoint(0, 0)), NumAnims(1),
   Points(0), SelectedType(TILE),
   Screen(screen), ChangeAnimDialog(changeanimdialog)
   {
   ObjAnimList = new Graphics::TBitmap*[1];   //Список изображений - у разного типа объектов их разное число
   ObjAnimList[0] = 0;
   FileNameList = new char*[1];   //Пути к файлам изображений
   FileNameList[0] = 0;
   AddAnimImg = new Graphics::TBitmap;   //Изображение иконки "добавить анимацию"
   AddAnimImg -> LoadFromFile("MapMakerImages\\AddAnimation.bmp");
   ChangeAnimImg = new Graphics::TBitmap;   //Изображение кнопки "изменить анимацию"
   ChangeAnimImg -> LoadFromFile("MapMakerImages\\ChangeAnimation.bmp");
   }

Interface::EditedObject::~EditedObject()
   {
   if (Name) delete[] Name;
   for (int i = 0; i < NumAnims; i++)
      if (ObjAnimList[i])
         {
         delete ObjAnimList[i];
         delete[] FileNameList[i];
         }
   delete[] FileNameList;
   delete[] ObjAnimList;
   delete AddAnimImg;
   delete ChangeAnimImg;
   }

//Обработчик щелчка по экрану
void Interface::EditedObject::Click(MyPoint pos)
   {
   if (SelectedType == TILE || SelectedType == LANDSCAPE || SelectedType == DIAMOND)
      {   //У трех типов объектов всего по одному изображению, поэтому и позиция иконки-кнопки всегда постоянна
      if (pos.X >= 10 && pos.X < 30 && pos.Y >= 10 && pos.Y < 30)
         ClickAnimIcon(0);   //Щелчок по иконке, относящейся к 1-й анимации
      }
   else if (SelectedType == MONSTER)
      {   //Здесь уже 4 анимации и если отображается несколько картинок, то положение нижних иконок меняется
      bool clicked = false;
      int dy = 0;   //Смещение иконок относительно начального (когда не отображаются никакие изображения)
      for (int i = 0; i < 4; i++)
         if (!clicked)
            {
            if (pos.X >= 10 && pos.X < 30 && pos.Y >= 10 + dy && pos.Y < 30 + dy)
               {
               clicked = true;
               ClickAnimIcon(i);   //Щелчок по соответствующей иконке
               }
            if (ObjAnimList[i] == 0)
               dy += 30;   //Изменяем сдвиг в зависимости от того, есть изображение или нет
            else
               dy += (ObjAnimList[i] -> Height + 30);
            }
      }
   }

//Щелчок по иконке-кнопке
void Interface::EditedObject::ClickAnimIcon(int NumAnim)
   {
   if (ChangeAnimDialog -> Execute())   //Выбираем изображение
      {   //Здесь идут танцы с бубном для того, чтобы позволить загружать изображения только из каталога с игрой (точнее, с редактором карт) или внутренних подкаталогов
      AnsiString PathToAppFolder = Application -> ExeName;
      int pos = PathToAppFolder.Pos("MapMaker.exe");
      PathToAppFolder.Delete(pos, 12);
      if (ChangeAnimDialog -> FileName.Pos(PathToAppFolder))   //Если изображение где надо
         {
         if (ObjAnimList[NumAnim])   //Удаляем старое, если есть
            delete ObjAnimList[NumAnim];
         if (FileNameList[NumAnim])   //И удаляем путь к его файлу
            delete FileNameList[NumAnim];
         ObjAnimList[NumAnim] = new Graphics::TBitmap;
         ObjAnimList[NumAnim] -> LoadFromFile(ChangeAnimDialog -> FileName);

         AnsiString RelativePath = ChangeAnimDialog -> FileName;   //Вычисляем путь к файлу относительно исполняемого файла редактора
         RelativePath.Delete(1, PathToAppFolder.Length());
         FileNameList[NumAnim] = new char[RelativePath.Length()];
         strcpy(FileNameList[NumAnim], RelativePath.c_str());
         }
      else
         MessageBox(0, "Вы можете загружать изображения только из каталога с игрой или из вложенных каталогов", "Внимание!", MB_OK);
      Draw();   //В любом случае заново отображаем экран
      }
   }
Вот такая вот катавасия. Непонятно, почему изображение не может быть снова загружено. Очень надеюсь на вашу помощь, я уже спасовал перед этой проблемой
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 10.09.2010, 17:28   #3
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Что, неужели ни у кого никаких идей на этот счет?
Почему вообще может не открываться файл рисунка?
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 10.09.2010, 18:06   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я правильно понимаю здесь ошибка вылезает?
Цитата:
ObjAnimList[NumAnim] -> LoadFromFile(ChangeAnimDialog -> FileName);
Путь хоть правильный?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.09.2010, 18:20   #5
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Stilet, нет, не здесь. В конструкторе:
Код:
   AddAnimImg = new Graphics::TBitmap;   //Изображение иконки "добавить анимацию"
   AddAnimImg -> LoadFromFile("MapMakerImages\\AddAnimation.bmp");
   ChangeAnimImg = new Graphics::TBitmap;   //Изображение кнопки "изменить анимацию"
   ChangeAnimImg -> LoadFromFile("MapMakerImages\\ChangeAnimation.bmp");
Собственно строки 2-я и 4-я. При этом в первый раз загружается нормально.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 10.09.2010, 18:32   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Слушай а у тя путь к текущему каталогу изменится не мог? Ты же крутишь OpenDialog? Так он по-моему изменяет CurrentDirectory. Поскольку у тя прописан относительный путь при запуске текущий каталог +MapMakerImages указывает куда надо, а после ChangeAnimDialog -> Execute() текущий каталог уже становится каталогом, который ты в нем выбрал. Вот и получается что не находит там такого файла.

Ты бы лучше там использовал полный путь. Получай его через ExtractFilePath(ParamStr(0)) (помоему в Борланд Си есть оно) и приплюсовывай свои MapMakerImages\\AddAnimation.bmp - так надежнее и не зависишь от нестабильного CurrentDirectory
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.09.2010, 19:33   #7
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

А откуда у привидения мотор?(не удержался )
the_deer_one вне форума Ответить с цитированием
Старый 11.09.2010, 10:13   #8
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Stilet, в яблочко!))) Теперь наконец-то работает! Огромное спасибо!)))

the_deer_one, так знамо дело - новый селекционный сорт!
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с загрузкой... Девочка-ромашка Компьютерное железо 2 02.08.2010 14:46
Проблемы с загрузкой DSAproger Компьютерное железо 18 01.08.2010 12:21
Проблема с загрузкой изображения в Image artemavd Общие вопросы Delphi 6 26.02.2010 20:40
странные проблемы с с++ Plastilin Общие вопросы C/C++ 9 21.02.2010 03:50
Ajax проблемы с загрузкой slips JavaScript, Ajax 7 07.12.2009 18:01