Dodawanie obrazu do obiektu w klasie C++ Builder

0

Witam. Chcę stworzyć klasę z obiektami, które będą zawierać obraz (Timage czy jest lepszy sposób?). Program kompiluje mi bez błędów, ale gdy klikam przycisk tworzący obiekt, to wyskakuje mi komunikat:

Access violation at address 50DBFCC in module 'vcl270.bpl'. Read of address 000001D8.

Pytanie 1: Jak sobie z tym poradzić?

Main.cpp:

#include <vcl.h>
#include <iostream>
#pragma hdrstop
#include "Main.h"
#include "Envi.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
void __fastcall Startgame()
{
    Envi Tree1("tree",100,100);
      Tree1.Postaw();
}
void __fastcall TForm1::BOKClick(TObject *Sender)
{
      Startgame();
}

Envi.cpp:

#include <Classes.hpp>
#include <vcl.h>
#include "Envi.h"
#include <Main.h>
 Envi::Envi(AnsiString typ, int to, int le)
{
   typek=typ;
    tto=to;
    lle=le;
    }
     Envi::~Envi()
    {};
    void __fastcall Envi::Postaw()
   {
    TImage *Image1;
        if(typek=="tree")
   {
    Image1 -> Picture = Form1 -> Tree0 -> Picture;
      }
         Image1 -> Top = tto;
    Image1 -> Left = lle;
     }

Gdzie Tree0 jest częścią Main.h:

    TImage *Tree0;

Pytanie 2: Czy w Envi.cpp linijkę:

    Image1 -> Picture = Form1 -> Tree0 -> Picture;

zamienić na:

  Image1 -> Picture ->LoadFromFile("source/drzewo.png");

i nie powoływać się na Tree0 (w zasadzie będzie niepotrzebny i można usunąć)?

Envi.h:

#include <Classes.hpp>
#include <Controls.hpp>
#include <vcl.h>
class Envi
{
  public:
  AnsiString typek;
  int tto, lle;
  Envi(AnsiString="tree", int=0, int=0);
  ~Envi();
   void __fastcall Postaw();
1
Herwin napisał(a):

Witam. Chcę stworzyć klasę z obiektami, które będą zawierać obraz

Zamiar jest chwalebny.

realizacja: wszystko na nie. Między innymi klasa NIE ZAWIERA obrazu.

Konstruktor, który nie konstruuje (konieczny jest Postaw)
który to Postaw bierze z danych globalnych (i to jedynej formy danych jakie znają rycerze od Buildera - TForm)
typ / sposób działania wyznaczany stringiem
używanie zmiennym niezainicjowanych (kompilator aż wyje od ostrzeżeń)
używanie zmiennych bez rozumienia samej idei, czym zmienna jest.

tego się czytać nie da, nie mam zamiaru w tym szukać opcji błędu która zachodzi

Read of address 000001D8.

Chcesz odczytać coś do jest null-em z małym offsetem.

Mam dla ciebie przykrą wiadomość:
posiadanie (mniej czy bardziej pirackiego) Buildera i myszki nie oznacza umiejętności programowania.

0

Tak - nie umiem programować, ale chcę się tego nauczyć. I pewnie niejeden błąd popełnię, ale od tego są fora internetowe, by szukać pomocy, nieprawda?

Mogę prosić o radę jak dodać obraz? Oraz zainicjować zmienne?

0

Pomijając już wspomniane (i niewspomniane) kwestie, błąd masz zapewne w tym, że Image1 to niezainicjalizowany wskaźnik, którego próbujesz używać -> stąd access violation.

0

Envi.cpp wygląda teraz tak:

Envi::Envi(AnsiString typ, int to, int le) : typek(typ), tto(to),lle(le)
{ TImage *Image1 = new TImage(Form1);
if(typek=="tree")
{
Image1 -> Picture = Form1 -> Tree0 -> Picture;
}
}

Błąd access violation już się nie pojawia, ale obrazu wciąż nie widać.

1

C++ Builder to nie moja działka, ale coś w ten design

Image1->Picture->Bitmap->LoadFromFile("Images/bitmapa.bmp" );

Dodaje link do kursu C++ Builder 6 link

0
Herwin napisał(a):

Envi.cpp wygląda teraz tak:

Envi::Envi(AnsiString typ, int to, int le) : typek(typ), tto(to),lle(le)
{ TImage *Image1 = new TImage(Form1);
if(typek=="tree")
{
Image1 -> Picture = Form1 -> Tree0 -> Picture;
}
}

Błąd access violation już się nie pojawia, ale obrazu wciąż nie widać.

Po co klasa, która NIC nie działa tak jak klasa, nie przenosi żadnych danych itd
Weź jakaś ksiazkę o C++ i zobacz, o co chodzi w tych całych klasach, bo na razie to jesteś nieskalany wiedzą ksiazkową.

0

Zobacz tutaj, obok.
To wątek też bardzo początkującego, nie ze wszystkim sobie radzi, ale rozumie co to znaczy "przechowywać dane w klasie"

https://4programmers.net/Forum/C_i_C++/360163-klasa_bigint_ktora_bedzie_przechowywac_liczbe_i_pozwalac_za_pomoca_metod_skladowych_typu_addconst_bigint_oraz_subtractconst_bigint_na_obliczenia?p=1838742#id1838742

Twoja klasa niczego nie przechowuje, CO GORSZE próbuje spowodować efekty w najgorszym stylu: na nienazwanych porządnie zmiennych globalnych (najgorszy możliwy styl programowania w Builderze / Delhi)

1 użytkowników online, w tym zalogowanych: 0, gości: 1