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:
(ho usato la funzione floor perché dovrò usare anche variabili non intere)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
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); }

Rispondi quotando