[C++] Przy próbie przesunięcia TImage wywala program

0

Jak w temacie.

//---------------------------------------------------------------------------

#include <vcl.h>
#include <dos.h>
#pragma hdrstop

#include "move.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TImage *Image1;
const int m1=10;
const int m2=18;
const int m3=23;
const int m4=25;
int HovDir=1;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}




//---------------------------------------------------------------------------


//---------------------------------------------------------------------------

void __fastcall TForm1::OnCreate(TObject *Sender)
{
        Image1->Picture->LoadFromFile("test_trasa_256.bmp");
        Image1->Left=-100;
        Image1->Top=-100;
}
//---------------------------------------------------------------------------
void MapMove(int x)
{
        switch (x)
        {
                case 1:
                Image1->Top=((Image1->Top)+m4);
                break;
                case 2:
                {
                Image1->Left=((Image1->Left)-m1);
                Image1->Top=((Image1->Top)+m3);
                }
                break;
                case 3:
                {
                Image1->Left=((Image1->Left)-m2);
                Image1->Top=((Image1->Top)+m2);
                }
                break;
                case 4:
                {
                Image1->Left=((Image1->Left)-m3);
                Image1->Top=((Image1->Top)+m1);
                }
                break;
                case 5:
                Image1->Left=((Image1->Left)-m4);
                break;
                case 6:
                {
                Image1->Left=((Image1->Left)-m3);
                Image1->Top=((Image1->Top)-m1);
                }
                break;
                case 7:
                {
                Image1->Left=((Image1->Left)-m2);
                Image1->Top=((Image1->Top)-m2);
                }
                break;
                case 8:
                {
                Image1->Left=((Image1->Left)-m1);
                Image1->Top=((Image1->Top)-m3);
                }
                break;
                case 9:
                Image1->Top=((Image1->Top)-m4);
                break;
                case 10:
                {
                Image1->Left=((Image1->Left)+m1);
                Image1->Top=((Image1->Top)-m3);
                }
                break;
                case 11:
                {
                Image1->Left=((Image1->Left)+m2);
                Image1->Top=((Image1->Top)-m2);
                }
                break;
                case 12:
                {
                Image1->Left=((Image1->Left)+m3);
                Image1->Top=((Image1->Top)-m1);
                }
                break;
                case 13:
                Image1->Left=((Image1->Left)+m4);
                break;
                case 14:
                {
                Image1->Left=((Image1->Left)+m3);
                Image1->Top=((Image1->Top)+m1);
                }
                break;
                case 15:
                {
                Image1->Left=((Image1->Left)+m2);
                Image1->Top=((Image1->Top)+m2);
                }
                break;
                case 16:
                {
                Image1->Left=((Image1->Left)+m1);
                Image1->Top=((Image1->Top)+m3);
                }
                break;

        }
}

void __fastcall TForm1::OnKeyDown(TObject *Sender, WORD &Key,
      TShiftState Shift)
{
        if(Key == VK_LEFT)
        {
            HovDir=((HovDir-1)%16);
            if(HovDir==0)
            HovDir=16;
            MapMove(HovDir);

        }
        if(Key == VK_RIGHT)
        {
            HovDir=((HovDir+1)%16);
            if(HovDir==0)
            HovDir=1;
            MapMove(HovDir);
        }
}

H

//---------------------------------------------------------------------------

#ifndef moveH
#define moveH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Graphics.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE-managed Components
        TImage *Image1;

        void __fastcall OnKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift);
        void __fastcall OnCreate(TObject *Sender);


private:	// User declarations
public:		// User declarations
        __fastcall TForm1(TComponent* Owner);

};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

I teraz jak naciśne strzałkę (lewo/prawo) to wywala mi progam, nie wiem dalczego nie moge się odwołać do pozycji obrazka??????

0

A nie prościej funkcję

void MapMove(int x)

zrobić składową klasy TForm1? Zapomniałeś ustawić wartość wskaźnika Image1

 :P
0

Chyba nie bardzo rozumiem :-|

0
<sup napisał(a)

saint</sup>>Chyba nie bardzo rozumiem :-|

No twoja funkcja

MapMove

odwołuje się do wskaźnika Image1

, któremu nie przypisałeś żadnej wartości i stąd ten błąd.
0

Czy możesz napisać dokładnie jak to ma wygladać bo przecież ten Image1 jest wstawiony na forme jako komponent a nie jest generowany dynamicznie wiec po co i jak mam niby nadać wskażnikowi wartość???
Ten Image nie jest dynamiczyn!
A i jak zadeklarować MapMove w pliku .h bo jakoś nie moge tego dobrze zrobić.
Prosze o konkretny kod

0

Po pierwsze to przeczytaj dokładnie to http://avocado.risp.pl/files/texts/od0dogk/html/1_6.html ;)

[...] przecież ten Image1 jest wstawiony na forme jako komponent a nie jest generowany dynamicznie wiec po co i jak mam niby nadać wskażnikowi wartość???

A co robi wskaźnik

TImage *Image1;

na początku pliku *.cpp? ON NIE WCHODZI W SKŁAD KLASY TForm1 więc ma się nijak do tego co znajduje sie na/wewnątrz formy!!! Z kolei funkcja void MapMove(int x)

, nie wiedzieć czemu, nie jest częścia klasy <code class="cpp">TForm1

a chce się odwoływać do danych, które zawiera.

Wskaźniki...

#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TImage *Image1; //<--- ten
...

i...

...
__published:        
        TImage *Image1; //<--- ten
...

...nie są tymi samymi wskaźnikami. Są tego samego typu i maja te same nazwy ale mogą przechowywać różne wartości. I tak z pierwszego korzysta

MapMove

, a z drugiego np. TForm1::OnCreate

.


> Ten Image nie jest dynamiczyn!

Wierz mi, jest :) tyle, że to VCL już za ciebie robi.


> A i jak zadeklarować MapMove w pliku .h bo jakoś nie moge tego dobrze zrobić.
> Prosze o konkretny kod

Kodu nie dostaniesz. Przeczytaj <a href="http://avocado.risp.pl/files/texts/od0dogk/html/1_6.html">to</a>, co podałem na początku.

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