dynamiczne obiekty cd.

0

Jak odnieść sie do obiektu dynamicznie stworzonego gdzies poza wywolaniem ktore je stworzylo ?? czyli mam cos takiego:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TImage **my = new TImage*[8];
    for(int i = 0; i <7; i++)
    {
      my[i] = new TImage(this);
      my[i]->Parent = Panel1;
      my[i]->Left = 168-1*i;
      my[i]->Top = 32+9*i;
      my[i]->OnClick=ImageClick;
      my[i]->Picture->LoadFromFile("sciezka");
     }
}

czyli po kliknieciu na Button1->Tworzy sie 7 obiektow. Jak zrobić żebym mogl sie do nich odwolac w np. void __fastcall Tform1::Button2Click. Gdy robie to tak:
my[1]->Left+=40 //wyswietla sie blad Cannot access in inactive scope
jak zrobic zeby to dzialalo ??

// używaj znaczników służących do kolorowania składni danego języka, tutaj <cpp></cpp> - LKS

0

Po co piszesz

TImage **my = new TImage*[8];

jak z góry znasz ilość obiektów??
Aby odwoływać się z innych funkcji musisz zadeklarować wskaźnik globalnie:Wpisz w sekcji private/public

TImage **my

. I teraz odwołujesz się do konkretnego obiektu poprzez indeks.

0

Imp!! zrobilem juz to co mi powiedziales(umiescilem w private TImage **my) i nie dziala. W kodzie mam TImage *my = new TImage[8];//rozmiar tablicy musialem podac bo kompilator wywala blad ze rozmiar tablicy jest unknown or zero. Nie mogoe w wywolaniu buttona dodac np.
my[1]->Left-=30;
nie wiem wlasnie dlaczego.
o co chodzi ????

0

zamiast

TImage **my = new TImage*[8];

możesz napisać TImage *my[8]

. Pierwszą wersje stosuje się wtedy gdy przed kompilacją nie wiesz ile będzie obiektów.
<font color=green>//dopisane</span>
"Cannot access in inactive scope" - błąd przy kompilaci czy przy wykonywaniu ?
0

Blad pojawia sie po kompilacji(gdy naciskam Buttona). Czemu nie jest aktyywny pionter Timage **my jesli jest zadeklarowany w private. Ja rozumiem ze wyswietli taki komunikat gdyby to bylo zadeklarowane lokalnie ale nie jest. wiec o co chodzi ??

0

hmmm u mnie działa wszystko ok. Może sprawdzaj czy przydział pamięci zakończył się sukcesem np.

if(my[i] == NULL) ShowMessage("Przydział pamięci dla obiektu nr. "+i+" zakończył się fiaskiem")

A i jeszcze jedna sprawa: nie pisz

for(int i = 0; i < 7; i++) 

tylko for(int i = 0; i <= 7; i++)

 lub <code class="cpp"> for(int i = 0; i < 8; i++)
0

Jestem zdesperowany bo dalej nie dziala. Walne kod jak to u mni wyglada moze ktos bedzie wiedzial co jest zle;
<font size="4"> <font color="red"><projekt.h></span>private:
<font color="green">TImage *my[];</span>
<font color="red"><projekt.cpp></span>

<font color="green">void __fastcall TForm1::Button1Click(TObject Sender)
{
TImage my[8];
for(int i = 0; i <8; i++)
{
my[i] = new TImage(this);
my[i]->Parent = Panel1;
my[i]->Left = 168-1
i;
my[i]->Top = 32+9
i;
my[i]->OnClick=ImageClick;
my[i]->Picture->LoadFromFile("sciezka\\obrazek.bmp");
}
my[1]->Left+=10; //tu jeszcze dziala. Mozna zrobic cokolwiek z obrazkiem.
my[1]->Top+=20;
}

void __fastcall TForm1::ImageClick(TObject *Sender)
{
TImage *cos = (TImage *) Sender;
cos->Visible=false;
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
my[1]->Left-=6;
}
i tu lezy problem.gdy po skompilowaniu klikniemy na ten button2 (oczywiscie wczesniej klikamy Button1) wyrzuca exeption:class EAccessViolation with Message 'Access violation at address ..... i E2208 Cannot access an innactive scope</span></span>

0

Deklarujesz globalnie i lokalnie zmienną my. Wywal tą lokalną w private wpisz:

TImge *my[8];
0

Wielkie dzieki Imp. Ale jestem glupi. Przeciez to bylo oczywiste :-D . Swoja droga program juz dziala ale nie wiem dlaczego na koniec programu(jak go zamykam) wyskakuje blad. Powinnienem uzyc drestuktora??Chyba nie bo wskazujac Parent->panel1 powinnien sam wykonac destrukcje. To z czego wynika ten blad na koncu programu: Jest tresci podobnej do poprzedniej :exception EAccess violation with message access violation at adress..... Sprawdzilem i blad wyskakuje jak stworze te obiekty(klikniecie Button1) i wyjde czyl wcisniecie button2 nie ma nic do rzeczy tutaj ?????

0

i znowu u mnie działa wszystko ok. Możesz spróbować zwolnić pamięc, np. w zdarzeniu OnCloseQuery wpisać:

for(int i = 0; i <= 7; i++)
     delete my[i];

Najlepiej przedtym zrestartuj kompa - nie wiadomo czy badziewie nie zostało w pamięci.

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