Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
4 / 4 / 1
Регистрация: 04.11.2012
Сообщений: 72

Загрузка и вывод изображения на форму

09.07.2013, 11:27. Показов 4270. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется главная форма, на которой будут выводится разные изображения. Изображения решил выводить в отдельном классе. В классе динамически создал объект TBitmap и в него благополучно вроде бы загрузил изображение. Код откомпилировался, однако во время запуска приложения выдаёт ошибку:

Access violation at address 00401B2C in module 'Project1.exe'. Read of address 00000000.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "Tank.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
Tank *t1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormPaint(TObject *Sender)
{
  t1->CreatePlayer();
}
Созданный класс:
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
//---------------------------------------------------------------------------
 
#ifndef tank
#define tank
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include "Unit1.h"
 
Graphics::TBitmap *player = new Graphics::TBitmap();
 
class Tank {
    public:
      void CreatePlayer();
};
 
 
void Tank::CreatePlayer() {
   player->LoadFromFile("D:\\кодгир\\Tanchiki\\Picture\\player.bmp");
   Form1->Canvas->Draw(10,10,player);
}
 
#endif
Подскажите пожалуйста, что я сделал неверно?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.07.2013, 11:27
Ответы с готовыми решениями:

Загрузка изображения на форму
Добрый день! Подскажите пожалуйста как сделать так что бы компонент image брал изображения через путь. Например image1.путь...

Загрузка изображения на форму
В VB полный ноль пока, так что не журите за легкий вопрос. Вопрос в следующем - как сделать так, что нейкое изображение появлялось на...

Загрузка изображения в форму
Есть картинка,есть кнопка,есть вопрос.... Как сделать чтобы при нажатии на кнопку показывалась картинка в определенном месте?

16
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 11
09.07.2013, 11:38
Где инициализация класса (проще говоря - вызов его конструктора)?
0
4 / 4 / 1
Регистрация: 04.11.2012
Сообщений: 72
09.07.2013, 11:40  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
Где инициализация класса (проще говоря - вызов его конструктора)?
Немного не понял вас..
Обязательно делать конструктор класса tank ???
0
19 / 19 / 4
Регистрация: 27.05.2013
Сообщений: 119
10.07.2013, 11:18
Цитата Сообщение от Vlad708 Посмотреть сообщение
Немного не понял вас..
Обязательно делать конструктор класса tank ???
имелось в виду что то вроде:

C++
1
2
3
4
5
void __fastcall TForm1::FormPaint(TObject *Sender)
{
  t1 = new Tank;
  t1->CreatePlayer();
}
плюс

C++
1
2
3
4
5
6
7
8
9
10
11
//Graphics::TBitmap *player = new Graphics::TBitmap();
class Tank {
    public:
      void CreatePlayer();
     TBitmap *player;
};
void Tank::CreatePlayer() {
   Graphics::TBitmap *player = new Graphics::TBitmap();
   player->LoadFromFile("D:\\кодгир\\Tanchiki\\Picture\\player.bmp");
   Form1->Canvas->Draw(10,10,player);
}
0
4 / 4 / 1
Регистрация: 04.11.2012
Сообщений: 72
10.07.2013, 15:48  [ТС]
Цитата Сообщение от Olex Посмотреть сообщение
имелось в виду что то вроде:
Эх жаль, всё равно ошибка((
Сначала выдавало что нельзя делать так: "TBitmap *player;"
Но я исправил на: Windows::TBitmap *player;

Однако, ошибка та же самая вылетает про память(
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 11
10.07.2013, 16:08
Проверил на чистом проекте - ничего не вылетает. Так что показывай свой проект полностью, что-то там не так... И совсем не в этом коде.
0
4 / 4 / 1
Регистрация: 04.11.2012
Сообщений: 72
10.07.2013, 16:17  [ТС]
Unit1.cpp

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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "Tank.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
Tank *t1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
   //   t1.CreatePlayer();
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::FormPaint(TObject *Sender)
{
    t1 = new Tank;
    t1->CreatePlayer();
}
tank.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef tank
#define tank
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include "Unit1.h"
 
//Graphics::TBitmap *player = new Graphics::TBitmap();
class Tank {
    public:
      void CreatePlayer();
     TBitmap *player;
};
void Tank::CreatePlayer() {
   Graphics::TBitmap *player = new Graphics::TBitmap();
   player->LoadFromFile("D:\\кодгир\\Tanchiki\\Picture\\player.bmp");
   Form1->Canvas->Draw(10,10,player);
}
 
#endif
Наверно где-то неправильно #include`ы прописал
0
19 / 19 / 4
Регистрация: 27.05.2013
Сообщений: 119
10.07.2013, 16:40
У меня тоже не вылетает ничего

Для теста кинь на форму OpenDialog, Image,Button

и напиши:
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
class Tank{
 
 
      public:
      Tank(){};
      Graphics::TBitmap *Bitmap1 ;
      LoadBmp(AnsiString path,TCanvas *canvas);
};
 
Tank::LoadBmp(AnsiString path,TCanvas *canvas){
      Bitmap1 = new Graphics::TBitmap();
      Bitmap1->LoadFromFile(path);
      canvas->Draw(0,0,Bitmap1);
}
 
 
Tank *Tank1;
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 Tank1 = new Tank();
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 OpenDialog1->Execute();
 
 Tank1->LoadBmp(OpenDialog1->FileName,Image1->Canvas);
}
//---------------------------------------------------------------------------
Выбери какой ни будь *.bmp и смотри что будет
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 11
10.07.2013, 16:46
Вынеси реализацию Tank::CreatePlayer() в отдельный CPP-файл, не надо делать это в Header-е.
0
19 / 19 / 4
Регистрация: 27.05.2013
Сообщений: 119
10.07.2013, 17:05
Ну можно же пройтись в отладчике построчно и сказать где вылетает, на какой строке!... я реально измучался где же ето может быть... )))))

Добавлено через 11 минут
C++
1
2
3
4
5
void __fastcall TForm1::FormPaint(TObject *Sender)
{
    t1 = new Tank;
    t1->CreatePlayer();
}
Походу , после вырисовки БМП ))))) событие Paint клацает до бесконечноси..., и снова и снова...
0
4 / 4 / 1
Регистрация: 04.11.2012
Сообщений: 72
16.07.2013, 12:53  [ТС]
Вообщем разобрался я с выводом изображения. Занёс класс Tank в Unit1.cpp.
Теперь начал делать карту местности с помощью Canvas. Прочитал в просторах интернета, что делается это всё с помощью блокнота и циклом, который проверяет символ и выводит что я поставил. Вроде бы всё нормально, но вырисовка происходит неверно. В блокноте координаты одни сделал, а на форме всё по другому.

Реализация вырисовки в UNIT1.cpp:
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
class Tank {
    public:
      Tank() {};
      int map[15][10]; //shirina-dlina
      char tmp;
      void CreateMap();
      void del();
};
void Tank::CreateMap() {
  Graphics::TBitmap *player = new Graphics::TBitmap;
  player->LoadFromFile("D:\\кодгир\\Tanchiki\\Picture\\player.bmp");
  Graphics::TBitmap *stena = new Graphics::TBitmap;
  stena->LoadFromFile("D:\\кодгир\\Tanchiki\\Picture\\stena.bmp");
  FILE *f = fopen("D:\\кодгир\\Tanchiki\\map.txt","r");
  if (f) {
    for (int i = 0; i < 15; i++) {
      for (int j = 0; j < 11; j++) {
        tmp = fgetc(f);
        switch(tmp) {
            case '0': map[i][j] = 0; break;
            case '1': map[i][j] = 1; break;
            case '5': map[i][j] = 5; break;
        }
      }
    }
  fclose(f);
  }
 
  for (int i=0; i<15; i++) {
    for (int j=0; j<10; j++) {
      switch(map[i][j]) {
          case 0: Form1->Canvas->Brush->Color = clBlack; break;
          case 1: Form1->Canvas->Draw(i,j,player); break;
          case 5: Form1->Canvas->Brush->Color=clRed; break;
      }
      //Form1->Canvas->Rectangle(i*40,j*40,i*40+40,j*40+40);
      Form1->Canvas->Rectangle(i*40,j*40,i*40+40,j*40+40);
    }
  }
  player->Free();
  stena->Free();
}
 
Tank *t1 = new Tank();
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
 
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
   t1->CreateMap();
}
Карта в блокноте:

5000000000000000000000000
5000000000000000000000000
0000000000000000000000000
0000000000000000000000000
0000000000000000000000000
0000000000000000000000000
0000000000000000000000000
0000000000000000000000000
0000000000000000000000000
0000000000000000000000000

http://i5.pixs.ru/thumbs/8/9/0... 472890.jpg

"Пятерки" рядом расположены, но на форме всё совсем по другому.
Кто знает, может подскажет в чём проблемы?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33374 / 21499 / 8235
Регистрация: 22.10.2011
Сообщений: 36,894
Записей в блоге: 11
16.07.2013, 17:07
C++
1
int map[15][10]; // 15 строк по 10 символов, как бы тебе не хотелось, чтобы было иначе
, в одном месте ты работаешь с 10 символами, в другом - с 11-ю, но факт остается фактом: ты перепутал индексы местами... И потом: у тебя в файле 10 строк по 25 символов, то есть, просто заменив описание массива map на map[10][15] (и обращение к нему) ты ничего не добьешься. Учти так же, что fgetc читает из файла всё подряд, включая и '\n'...
1
 Аватар для name?
201 / 172 / 52
Регистрация: 01.06.2010
Сообщений: 371
16.07.2013, 17:17
так же лучше считывать через fscanf и не нужно думать о переводе строк и тд. в файле
C++
1
2
3
4
5
6
7
        FILE*fl;
        fl=fopen(OpenDialog1->FileName.c_str("map.txt","r") , "r");
        for (int j=0;j<10;j++) {
                for (int i=0;i<25;i++)
                        fscanf(fl, "%d", &map[i][j]);
        }
      fclose(fl);
1
4 / 4 / 1
Регистрация: 04.11.2012
Сообщений: 72
16.07.2013, 20:01  [ТС]
Ну вот сейчас я забил в блокноте 10 строк, по 20 символов.
Начинаю считывать в массив по вашим рекомендациям:

C++
1
2
3
4
5
6
7
8
9
char map[10][20];
FILE *f = fopen("D:\\map.txt","r");
  if (f) {
    for (int j = 0; j < 10; j++) {
      for (int i = 0; i < 20; i++)
        fscanf(f,"%s",&map[i][j]);
    }
  fclose(f);
  }
Теперь рисование:
C++
1
2
3
4
5
6
7
8
9
for (int i=0; i<10; i++) {
    for (int j=0; j<20; j++) {
      switch(map[i][j]) {
          case '0': Form1->Canvas->Brush->Color = clBlack; break;
          case '1': Form1->Canvas->Draw(i,j,player); break;
          case '5': Form1->Canvas->Brush->Color=clRed; break;
      }
      Form1->Canvas->Rectangle(i*40,j*40,i*40+40,j*40+40);
    }
Всё равно ширина поля меньше чем надо, а длина больше. Также красные квадраты неверно вырисовываются((
0
 Аватар для name?
201 / 172 / 52
Регистрация: 01.06.2010
Сообщений: 371
16.07.2013, 23:05
быстренько набросал и все работает как надо
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include <stdio>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
Graphics::TBitmap*background;
int map[10][20];
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
background = new Graphics::TBitmap(); //Çàäíèé áóôôåð
background->Width=Form1->Width;
background->Height=Form1->Height;
 
FILE*fl;
        fl=fopen("lvl.txt","r");
        for (int j=0;j<10;j++) {
                for (int i=0;i<25;i++)
                        fscanf(fl, "%d ", &map[i][j]);
        }
      fclose(fl);
}
//---------------------------------------------------------------------------
void TForm1::onDraw(){
background->Canvas->Brush->Color=clWhite;
        for(int x = 0; x < 25; x ++){
                for(int y = 0; y < 15; y++){
                switch(map[x][y]) {
                case 0: background->Canvas->Brush->Color = clBlack; break;
                //case 1: Form1->Canvas->Draw(i,j,player); break;
                case 5: background->Canvas->Brush->Color=clRed; break;
                }
                background->Canvas->Rectangle(x * 30,y * 30,x * 30 + 30, y * 30 + 30);
                }
        }
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
onDraw();
Form1->Canvas->Draw(0,0,background);
}
//---------------------------------------------------------------------------
Добавлено через 8 минут
Цитата Сообщение от Vlad708 Посмотреть сообщение
Карта в блокноте:

5000000000000000000000000
5000000000000000000000000
0000000000000000000000000
0000000000000000000000000
0000000000000000000000000
0000000000000000000000000
0000000000000000000000000
0000000000000000000000000
0000000000000000000000000
0000000000000000000000000
ошибка в карте вы считаете что у вас по 20 чисел хотя на самом деле 25

0000000000000000000000000
1234567890123456789012345

потому и происходит смещение
1
4 / 4 / 1
Регистрация: 04.11.2012
Сообщений: 72
17.07.2013, 12:08  [ТС]
name?, А вот вопрос у меня, массив вы объявили такой: int map[10][20];

А в циклах такие данные используете:
C++
1
2
3
4
for (int j=0;j<10;j++) {
                for (int i=0;i<25;i++)
for(int x = 0; x < 25; x ++){
                for(int y = 0; y < 15; y++)
Почему они разные?
0
 Аватар для name?
201 / 172 / 52
Регистрация: 01.06.2010
Сообщений: 371
17.07.2013, 16:01
Цитата Сообщение от Vlad708 Посмотреть сообщение
name?, А вот вопрос у меня, массив вы объявили такой: int map[10][20];

А в циклах такие данные используете:
C++
1
2
3
4
for (int j=0;j<10;j++) {
                for (int i=0;i<25;i++)
for(int x = 0; x < 25; x ++){
                for(int y = 0; y < 15; y++)
Почему они разные?
ошибся
C++
1
2
for(int x = 0; x < 25; x ++){
                for(int y = 0; y < 10; y++)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.07.2013, 16:01
Помогаю со студенческими работами здесь

Загрузка изображения в форму
Работаю в Builder'e. Нужно загрузить изображение в форму кнопкой Обзор. То есть, я сам должен в OpenDialog выбрать изображение для...

Загрузка изображения на форму
как сделать, чтобы кнопку не было видно, а при нажатии кнопки, там появлялось изображение?

Загрузка изображения на форму
На форме есть поле &quot;АдресКартинки&quot;, где отображается картинка. Проблемы в следующем: 1) Сделать так, чтобы картинка вставала под...

Загрузка изображения с формы 1 на форму 2
Добрый день. Есть форма 1 на ней мини просмотр изображения (picturebox), как при нажатии на кнопку открыть это изображения на форме 2 в...

Загрузка изображения на сервер через форму
Добрый день! Я пишу сайт для стоматологического кабинета, и у меня возникли проблемы с загрузкой изображений. Все имена полей формы и...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru