Ciao a tutti, sto cercando di fare una simulazione del sistema solare con c++ builder (la versione dell'embarcadero). Per farlo uso un'image su cui verranno via via disegnati il sole ed i pianeti. Dato che ad ogni intervallo di un timer dovrò disegnare una nuova Terra e dovrò cancellare la precedente, per ora ho creato una funzione nel file .h del progetto che disegna la nuova terra. Se non la uso nel file .cpp del programma, il compilatore compila normalmente il tutto e mi crea un eseguibile con il Sole e basta. Quando invece ho provato a usare la funzione nell' OnCreate del Form ed ho compilato, il compilatore mi ha mostrato il messaggio "Access violation at address 503E64C0 in module 'vcl160.bpl'. Read of address 000001 B8". Dopo ciò mi apre l'eseguibile senza però disegnarmi la Terra. Qualcuno sa dirmi perché?
l'header è questo:
codice:
//---------------------------------------------------------------------------
#ifndef codiceH
#define codiceH
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TImage *Image1;
TTimer *Timer1;
void __fastcall FormCreate(TObject *Sender);
private: // User declarations public:
// User declarations
__fastcall TForm1(TComponent* Owner); };
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
// funzione che disegna la Terra
int disegna_terra(float x,float y)
{
int centrox,centroy;
centrox=floor(x); //trova il centro in pixel della terra
centroy=floor(y); //trova il centro in pixel della terra
Form1->Image1->Canvas->Pen->Color=RGB(5,239,146); //cambia il colore del contorno della terra
Form1->Image1->Canvas->Brush->Style=bsSolid; //cambia il brush style su solid
Form1->Image1->Canvas->Brush->Color=RGB(5,239,146); //cambia il colore della terra
Form1->Image1->Canvas->Ellipse(centrox-5,centroy-5,centrox+5,centroy+5); //disegna la terra
}
#endif
(ho usato la funzione floor perché dovrò usare anche variabili non intere)
e questo è il frammento del codice principale di cui parlavo prima:
codice:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
xmax=Image1->Width; //inserisce la larghezza dell'Image in una variabile
ymax=Image1->Height; //inserisce l'altezza dell'Image in una variabile
Image1->Canvas->Brush->Color=RGB(4,49,117); //cambia il colore di sfondo
Image1->Canvas->Rectangle(0,0,xmax,ymax); //colora lo sfondo
Image1->Canvas->Brush->Color=RGB(253,193,55); //cambia il colore del Sole
Image1->Canvas->Ellipse(xmax/4,ymax/2-10,(xmax/4)+20,(ymax/2)+10); //crea il Sole
disegna_terra(580,ymax/2);
}