• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Tworzenie obiektów z obrazem w C++ Builder

VPS Starter Arubacloud
0 głosów
229 wizyt
pytanie zadane 30 marca 2022 w C i C++ przez gaughan Nowicjusz (120 p.)

Witam. Chcę aby aplikacae tworzyła obiekty danej klasy wraz z obrazem.

C++ Builder 10.4 nie wywala błędów, ale po uruchomieniu i kliknięciu odpowiedniego przycisku nic się nie pojawia.

Main.cpp:

#include <vcl.h>
#include <iostream>
#include <windows.h>
#include <time.h>
#pragma hdrstop

#include "Main.h"
#include "Envi.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
...
void __fastcall TForm1::BNewClick(TObject *Sender)
{
 void __fastcall Startgame();
}

void __fastcall Startgame()
{
	Envi Tree1("tree",100,100);
	Tree1.Postaw();
}

Envi.cpp:
 

#include <Classes.hpp>
#include <vcl.h>
#include "Envi.h"
Envi::Envi(AnsiString typ, int to, int le)
{
   typek=typ;
	tto=to;
	lle=le;
	}

   void __fastcall Envi::Postaw()
   {		TImage *Image1;
		if(typek=="tree")
   {
	Image1 -> Picture ->LoadFromFile("source/drzewo.png");
	 }
	Image1 -> Top = tto;
	Image1 -> Left = lle;
	Image1 ->  Height = 32;
	Image1 -> Width = 32;
	Image1 -> Visible = true;
	}

Envi.h:

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

 

1 odpowiedź

0 głosów
odpowiedź 30 marca 2022 przez j23 Mędrzec (194,920 p.)

i kliknięciu odpowiedniego przycisku nic się nie pojawia.

Nie pojawia się, bo nic się w on-clicku nie dzieje:

void __fastcall TForm1::BNewClick(TObject *Sender)
{
        void __fastcall Startgame();
}

Wstawiłeś tam deklarację funkcji, która nie robi nic w kodzie. Jeśli już, to powinno być tak:

void __fastcall TForm1::BNewClick(TObject *Sender)
{
        Startgame();
}

ale:

void __fastcall Envi::Postaw()
{
    TImage* Image1;
    if (typek == "tree") {
        Image1->Picture->LoadFromFile("source/drzewo.png");
    }

    Image1->Top = tto;
    ...
}

Odwołujesz się do lokalnego wskaźnika Image1, który jest niezainicjalizowany. Ergo - program się wyłoży. Jeśli to Image jest na formie, to możesz odwoływać się do niego przez Form1->Image1, tylko musisz załączyć w Envi.cpp: nagłówek Main.h.

komentarz 31 marca 2022 przez gaughan Nowicjusz (120 p.)

Dzięki, nie wywala już błędów. Ale mam nowy problem: gdy uruchomię program, kliknę w  przycisk Bnew, to mi wyskakuje okienko z napisem:

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

A obiekt dalej się nie pojawia.

komentarz 31 marca 2022 przez j23 Mędrzec (194,920 p.)
Bez kodu po poprawkach nic nie poradzę.
komentarz 31 marca 2022 przez gaughan Nowicjusz (120 p.)

Main.cpp:

#include <vcl.h>
#include <iostream>
#include <windows.h>
#include <time.h>
#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;
	  Image1 ->  Height = 32;
	   Image1 -> Width = 32;
	Image1 -> Visible = true;

	}

 

komentarz 31 marca 2022 przez j23 Mędrzec (194,920 p.)

Tak jak podejrzewałem. Przeczytaj jeszcze raz to, co napisałem w odpowiedzi po "ale".

komentarz 31 marca 2022 przez gaughan Nowicjusz (120 p.)

Przegrzebałem internet i dalej nie wiem, jak to zainicjalizować.

Powiedzmy, że Envi.cpp staje na:
 

#include <Classes.hpp>
#include <vcl.h>
#include "Envi.h"
#include <Main.h>
 
TImage *Image1;

Envi::Envi(AnsiString typ, int to, int le)
{
   typek=typ;
    tto=to;
    lle=le;
    }
 
    Envi::~Envi()
    {};
   void __fastcall Envi::Postaw()
   {    
        if(typek=="tree")
   { 
    Image1 -> Picture = Form1 -> Tree0 -> Picture;
      }
    }

Gdzie Tree0 jest w klasie nadrzędnej.

komentarz 31 marca 2022 przez j23 Mędrzec (194,920 p.)

Czym jest Tree0?

komentarz 1 kwietnia 2022 przez gaughan Nowicjusz (120 p.)
edycja 11 kwietnia 2022 przez gaughan

TImage.


EDIT:

Main.h:
 

	TImage *Tree0;

EDIT 2:
Zmodyfikowałem Envi.cpp i już nie pojawia się to okienko z błędem. Ale obrazu dalej nie widać.

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;

	 }
	}


 

Podobne pytania

0 głosów
1 odpowiedź 363 wizyt
pytanie zadane 3 czerwca 2017 w HTML i CSS przez czujek22 Dyskutant (7,670 p.)
0 głosów
0 odpowiedzi 256 wizyt
0 głosów
1 odpowiedź 76 wizyt
pytanie zadane 3 kwietnia 2017 w C i C++ przez sebastian.chwil Początkujący (300 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...