CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Problem z tablicą obiektów

Problem z tablicą obiektów

dział ogólny

Problem z tablicą obiektów

Nowy postprzez Antonowski » poniedziałek, 23 maja 2011, 22:36

Witam. Mam problem z poniższym kodem. Przy próbie wykonania instrukcji program zwraca błąd First chance exception at $7C812AFB. Exception class EAccessViolation with message 'Access violation at address 51F248C9 in module 'rtl100.bpl'. Read of address 00000288'. Process Project1.exe (2484) Co najlepsze przez pewien czas, kiedy zastąpiłem pętlą wczytywanie danych z DBLookupów wszystko chodziło :zawiedziony: , ale do rzeczy:
Deklaracja tablicy:
KOD cpp:     UKRYJ  
TDBLookupComboBox *autor[5];


I funkcja, która się wywala:
KOD cpp:     UKRYJ  
void __fastcall TForm5::Button4Click(TObject *Sender)
{   int i,j,x,y,a,zm,pom;
       

j=StrToFloat(Form5->Edit5->Text);

DataModule1->Ksiazki->Insert();
DataModule1->Ksiazki->FieldValues["Tytul"]=Edit4->Text;
DataModule1->Ksiazki->FieldValues["Aktywne"]=true;
DataModule1->Ksiazki->FieldValues["Id_UKD"]=DBLookupListBox1->KeyValue;
DataModule1->Ksiazki->Post();

zm=RadioGroup3->ItemIndex+2;

        for (i=2; i<=zm; i++)
        {   pom=i;
                DataModule1->Autorzy_Ksiazki->Insert();
                DataModule1->Autorzy_Ksiazki->FieldValues["Id_Autora"]=autor[pom]->KeyValue; //w tym miejscu jest problem,
                DataModule1->Ksiazki->Last();
                x=DataModule1->Ksiazki->FieldValues["Id"];
                DataModule1->Autorzy_Ksiazki->FieldValues["Id_Ksiazki"]=x;
                DataModule1->Autorzy_Ksiazki->Post();
        }

for (i = 0; i < j; i++)
{

        DataModule1->Egzemplarze->Last();
        DataModule1->Egzemplarze->Insert();
        DataModule1->Ksiazki->Last();
        x=DataModule1->Ksiazki->FieldValues["Id"];
        DataModule1->Egzemplarze->FieldValues["Id_Ksiazki"]=x;
        DataModule1->Egzemplarze->FieldValues["Umiejscowienie"]=Form5->Edit9->Text;
        DataModule1->Egzemplarze->FieldValues["Data_Wprowadzenia"]=Date();
        DataModule1->Egzemplarze->FieldValues["Id_Wydawnictwa"]=DBLookupComboBox1->KeyValue;
        DataModule1->Egzemplarze->FieldValues["Rok_Wydania"]=Edit27->Text;
        DataModule1->Egzemplarze->FieldValues["Cena"]=Edit28->Text;
        DataModule1->Egzemplarze->FieldValues["Do_Wypozyczenia"]=1;
}
DataModule1->Egzemplarze->Post();
}


Siedzę nad tym od popołudnia i nie mogę dociec rozwiązania :(

P.S. Wcześniej napisałem bardzo prostą (i rozległą) funkcję, która była wyjściem dla powyższego:
KOD cpp:     UKRYJ  
void __fastcall TForm5::Button4Click(TObject *Sender)
{  int x,y,a,i,j;


DataModule1->Ksiazki->Insert();
DataModule1->Ksiazki->FieldValues["Tytul"]=Edit4->Text;
DataModule1->Ksiazki->FieldValues["Aktywne"]=true;
DataModule1->Ksiazki->FieldValues["Id_UKD"]=DBLookupListBox1->KeyValue;
DataModule1->Ksiazki->Post();

        j=StrToFloat(Form5->Edit5->Text);
for (i = 0; i < j; i++)
        {

                //x=DataModule1->Ksiazki->FieldValues["Id"];
                DataModule1->Egzemplarze->Last();
                DataModule1->Egzemplarze->Insert();
                DataModule1->Ksiazki->Last();
                DataModule1->Egzemplarze->FieldValues["Id_Ksiazki"]=DataModule1->Ksiazki->FieldValues["Id"];
                DataModule1->Egzemplarze->FieldValues["Umiejscowienie"]=Form5->Edit9->Text;
                DataModule1->Egzemplarze->FieldValues["Data_Wprowadzenia"]=Date();
                DataModule1->Egzemplarze->FieldValues["Id_Wydawnictwa"]=DBLookupComboBox1->KeyValue;
                DataModule1->Egzemplarze->FieldValues["Rok_Wydania"]=Edit27->Text;
                DataModule1->Egzemplarze->FieldValues["Cena"]=Edit28->Text;
                DataModule1->Egzemplarze->FieldValues["Do_Wypozyczenia"]=1;
        }
DataModule1->Egzemplarze->Post();


switch (RadioGroup3->ItemIndex) {
case 0:
        DataModule1->Autorzy_Ksiazki->Insert();
        DataModule1->Autorzy_Ksiazki->FieldValues["Id_Autora"]=DBLookupComboBox2->KeyValue;   /*Pobieranie wartości z tabeli autorzy*/
        DataModule1->Ksiazki->Last();                                                                                                            /*i wstawianie do tabelu autorzy_ksiazki */
        x=DataModule1->Ksiazki->FieldValues["Id"];                                            /*Pobieranie Id_Ksiazki*/
        DataModule1->Autorzy_Ksiazki->FieldValues["Id_Ksiazki"]=x;
        DataModule1->Autorzy_Ksiazki->Post();
        break;
case 1:
        DBLookupComboBox2->Enabled=True;
        DBLookupComboBox3->Enabled=True;
        DBLookupComboBox4->Enabled=False;
        DBLookupComboBox5->Enabled=False;
        DataModule1->Autorzy_Ksiazki->Insert();
        DataModule1->Autorzy_Ksiazki->FieldValues["Id_Autora"]=DBLookupComboBox2->KeyValue;
        DataModule1->Ksiazki->Last();
        x=DataModule1->Ksiazki->FieldValues["Id"];
        DataModule1->Autorzy_Ksiazki->FieldValues["Id_Ksiazki"]=x;
        DataModule1->Autorzy_Ksiazki->Next();
        DataModule1->Autorzy_Ksiazki->Refresh();
        DataModule1->Autorzy_Ksiazki->Insert();
        DataModule1->Autorzy_Ksiazki->FieldValues["Id_Autora"]=DBLookupComboBox3->KeyValue;
        DataModule1->Autorzy_Ksiazki->FieldValues["Id_Ksiazki"]=x;
        DataModule1->Autorzy_Ksiazki->Post();
        break;
case 2:
        DataModule1->Autorzy_Ksiazki->Insert();
        DataModule1->Autorzy_Ksiazki->FieldValues["Id_Autora"]=DBLookupComboBox2->KeyValue;
        DataModule1->Ksiazki->Last();
        x=DataModule1->Ksiazki->FieldValues["Id"];
        DataModule1->Autorzy_Ksiazki->FieldValues["Id_Ksiazki"]=x;
        DataModule1->Autorzy_Ksiazki->Next();
        DataModule1->Autorzy_Ksiazki->Insert();
        DataModule1->Autorzy_Ksiazki->FieldValues["Id_Autora"]=DBLookupComboBox3->KeyValue;
        DataModule1->Autorzy_Ksiazki->FieldValues["Id_Ksiazki"]=x;
        DataModule1->Autorzy_Ksiazki->Next();
        DataModule1->Autorzy_Ksiazki->Insert();
        DataModule1->Autorzy_Ksiazki->FieldValues["Id_Autora"]=DBLookupComboBox4->KeyValue;
        DataModule1->Autorzy_Ksiazki->FieldValues["Id_Ksiazki"]=x;
        DataModule1->Autorzy_Ksiazki->Post();
        break;
case 3:
        DataModule1->Autorzy_Ksiazki->Insert();
        DataModule1->Autorzy_Ksiazki->FieldValues["Id_Autora"]=DBLookupComboBox2->KeyValue;
        DataModule1->Ksiazki->Last();
        x=DataModule1->Ksiazki->FieldValues["Id"];
        DataModule1->Autorzy_Ksiazki->FieldValues["Id_Ksiazki"]=x;
        DataModule1->Autorzy_Ksiazki->Next();
        DataModule1->Autorzy_Ksiazki->Insert();
        DataModule1->Autorzy_Ksiazki->FieldValues["Id_Autora"]=DBLookupComboBox3->KeyValue;
        DataModule1->Autorzy_Ksiazki->FieldValues["Id_Ksiazki"]=x;
        DataModule1->Autorzy_Ksiazki->Next();
        DataModule1->Autorzy_Ksiazki->Insert();
        DataModule1->Autorzy_Ksiazki->FieldValues["Id_Autora"]=DBLookupComboBox4->KeyValue;
        DataModule1->Autorzy_Ksiazki->FieldValues["Id_Ksiazki"]=x;
        DataModule1->Autorzy_Ksiazki->Next();
        DataModule1->Autorzy_Ksiazki->Insert();
        DataModule1->Autorzy_Ksiazki->FieldValues["Id_Autora"]=DBLookupComboBox5->KeyValue;
        DataModule1->Autorzy_Ksiazki->FieldValues["Id_Ksiazki"]=x;
        DataModule1->Autorzy_Ksiazki->Post();
        break;
}
}
Avatar użytkownika
Antonowski
Bladawiec
Bladawiec
 
Posty: 16
Dołączył(a): czwartek, 21 października 2010, 17:56
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP SP3 x86 (dla kompilatora)
Kompilator: Borland Developer Studio 2006
SKYPE: vekh666
Gadu Gadu: 2743544
    Windows XPChrome

Re: Problem z tablicą obiektów

Nowy postprzez Cyfrowy Baron » wtorek, 24 maja 2011, 16:50

Antonowski napisał(a):
KOD cpp:     UKRYJ  
DataModule1->Autorzy_Ksiazki->FieldValues["Id_Autora"]=autor[pom]->KeyValue; //w tym miejscu jest problem,


Oczywiście, że jest problem. Masz tylko deklarację obiektu:

Antonowski napisał(a):
KOD cpp:     UKRYJ  
TDBLookupComboBox *autor[5];


a gdzie definicja, czyli coś w tym stylu:

KOD cpp:     UKRYJ  
for(int i = 0; i < 5; i++)
{
  autor[i] = new TDBLookupComboBox(this);
  autor[i]->Parent = Form5;
  autor[i]-> /* ... i tak po kolei dla każdego obiektu ustawiasz parametry początkowe */
}
Poza tym:

autor[pom]


pom nie może być mniejsze od 0 i nie może być większe od 4, gdyż tworzysz tylko pięć obiektów autor, czyli masz: autor[0]; autor[1]; autor[2]; autor[3]; autor[4];
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z tablicą obiektów

Nowy postprzez Antonowski » wtorek, 24 maja 2011, 18:30

Cyfrowy Baron napisał(a):a gdzie definicja, czyli coś w tym stylu:

KOD cpp:     UKRYJ  
for(int i = 0; i < 5; i++)
{
  autor[i] = new TDBLookupComboBox(this);
  autor[i]->Parent = Form5;
  autor[i]-> /* ... i tak po kolei dla każdego obiektu ustawiasz parametry początkowe */
}

To jest instrukcja tworząca na bieżąco nowe komponenty prawda? A ja tak właściwie chciałem się po prostu odwołać w pętli do istniejących obiektów.... No, ale pokombinuję coś z tym :)
Avatar użytkownika
Antonowski
Bladawiec
Bladawiec
 
Posty: 16
Dołączył(a): czwartek, 21 października 2010, 17:56
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP SP3 x86 (dla kompilatora)
Kompilator: Borland Developer Studio 2006
SKYPE: vekh666
Gadu Gadu: 2743544
    Windows XPChrome

Re: Problem z tablicą obiektów

Nowy postprzez Cyfrowy Baron » wtorek, 24 maja 2011, 20:49

Antonowski napisał(a):To jest instrukcja tworząca na bieżąco nowe komponenty prawda? A ja tak właściwie chciałem się po prostu odwołać w pętli do istniejących obiektów...


Możesz odwoływać się do istniejących komponentów, ale komponenty muszą istnieć. Deklaracja nie tworzy obiektów, więc z samą deklaracją nie istnieją. By powołać obiekty do istnienia trzeba je najpierw stworzyć poprzez operator new.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z tablicą obiektów

Nowy postprzez Antonowski » środa, 25 maja 2011, 11:55

http://i51.tinypic.com/foncb9.jpg

Projekt formularza wygląda tak jak na obrazku. Chciałem po prostu w pętli, której ilość przebiegów zależy od wybranej opcji z RadioGroup (1-4), wczytywać dane z odpowiedniego DBLookupComboBoxa.
Dobra... Poniższy kod dział - tak jakby ktoś jeszcze szukał podobnego rozwiązania... Może nie jest na razie jakoś super zrobione, ale zasadę działania widać :)
KOD cpp:     UKRYJ  
void __fastcall TForm5::Button4Click(TObject *Sender)
{   int i,j,x,y,a,zm;


j=StrToFloat(Form5->Edit5->Text);

DataModule1->Ksiazki->Insert();
DataModule1->Ksiazki->FieldValues["Tytul"]=Edit4->Text;
DataModule1->Ksiazki->FieldValues["Aktywne"]=true;
DataModule1->Ksiazki->FieldValues["Id_UKD"]=DBLookupListBox1->KeyValue;
DataModule1->Ksiazki->Post();

 zm=RadioGroup3->ItemIndex;

for (i=0; i<4;i++)
{
     autor[i] = new TDBLookupComboBox(this);
}

autor[0]=DBLookupComboBox1;
autor[1]=DBLookupComboBox2;
autor[2]=DBLookupComboBox3;
autor[3]=DBLookupComboBox4;

        for (i=0; i<=zm; i++)
        {   ShowMessage(autor[i]->KeyValue);
                DataModule1->Ksiazki->Last();
                x=DataModule1->Ksiazki->FieldValues["Id"];
                DataModule1->Autorzy_Ksiazki->Last();
                DataModule1->Autorzy_Ksiazki->Insert();
                DataModule1->Autorzy_Ksiazki->FieldValues["Id_Autora"]=autor[i]->KeyValue;
                DataModule1->Autorzy_Ksiazki->FieldValues["Id_Ksiazki"]=x;
                DataModule1->Autorzy_Ksiazki->Post();
                ShowMessage("Pętla autorów 2");
        }

for (i = 0; i < j; i++)
{


        DataModule1->Ksiazki->Last();
        x=DataModule1->Ksiazki->FieldValues["Id"];
        DataModule1->Egzemplarze->Last();
        DataModule1->Egzemplarze->Insert();
        DataModule1->Egzemplarze->FieldValues["Id_Ksiazki"]=x;
        DataModule1->Egzemplarze->FieldValues["Umiejscowienie"]=Form5->Edit9->Text;
        DataModule1->Egzemplarze->FieldValues["Data_Wprowadzenia"]=Date();
        DataModule1->Egzemplarze->FieldValues["Id_Wydawnictwa"]=DBLookupComboBox5->KeyValue;
        DataModule1->Egzemplarze->FieldValues["Rok_Wydania"]=Edit27->Text;
        DataModule1->Egzemplarze->FieldValues["Cena"]=Edit28->Text;
        DataModule1->Egzemplarze->FieldValues["Do_Wypozyczenia"]=1;
        ShowMessage("Pętla egzemplarzy");
        DataModule1->Egzemplarze->Post();
}


Edit4->Text="";
Edit5->Text="";
Edit9->Text="";
Edit27->Text="";
Edit28->Text="";
}
 

Damn... Niektóre rzeczy są tak proste, że aż głupio, że się nad nimi tyle siedzi... :o
Ostatnio edytowano środa, 25 maja 2011, 19:16 przez Cyfrowy Baron, łącznie edytowano 2 razy
Powód: Nie cytuyjemy całych postów.
Avatar użytkownika
Antonowski
Bladawiec
Bladawiec
 
Posty: 16
Dołączył(a): czwartek, 21 października 2010, 17:56
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows XP SP3 x86 (dla kompilatora)
Kompilator: Borland Developer Studio 2006
SKYPE: vekh666
Gadu Gadu: 2743544
    Windows XPChrome

Re: Problem z tablicą obiektów

Nowy postprzez Cyfrowy Baron » środa, 25 maja 2011, 19:32

Antonowski napisał(a):http://i51.tinypic.com/foncb9.jpg


Ten obrazek niczego nie wnosi do tematu.



Antonowski napisał(a):Dobra... Poniższy kod dział -


działa gdyż:

KOD cpp:     UKRYJ  
for (i=0; i<4;i++)
{
     autor[i] = new TDBLookupComboBox(this);
}


tworzysz obiekty poprzez operator new.

ale dalej to już absurd, co prawda działa, tylko po co taka kombinacja:

KOD cpp:     UKRYJ  
autor[0]=DBLookupComboBox1;
autor[1]=DBLookupComboBox2;
autor[2]=DBLookupComboBox3;
autor[3]=DBLookupComboBox4;


Skoro przepisujesz listę z istniejących obiektów typu TDBLookupComboBox2 do obiektów dynamicznych, to tworzenie obiektów dynamicznych nie ma sensu, gdyż można skorzystać z obiektów już istniejących.

Jak rozumiem chcesz się dobierać do odpowiedniej listy, bez podawania jej nazwy:

KOD cpp:     UKRYJ  
                DataModule1->Autorzy_Ksiazki->FieldValues["Id_Autora"]=autor[i]->KeyValue;


ale do tego nie trzeba wcale tworzyć obiektów dynamicznych, gdyż ten kod można z powodzeniem zastąpić takim kodem:

KOD cpp:     UKRYJ  
        for ( i = 0; i <= zm; i++)
        {   ShowMessage(autor[i]->KeyValue);
                DataModule1->Ksiazki->Last();
                x=DataModule1->Ksiazki->FieldValues["Id"];
                DataModule1->Autorzy_Ksiazki->Last();
                DataModule1->Autorzy_Ksiazki->Insert();
               
                DataModule1->Autorzy_Ksiazki->FieldValues["Id_Autora"] = dynamic_cast<TDBLookupComboBox *>( FindComponent( "DBLookupComboBox" + (String)(i + 1) ) )->KeyValue;

                DataModule1->Autorzy_Ksiazki->FieldValues["Id_Ksiazki"]=x;
                DataModule1->Autorzy_Ksiazki->Post();
                ShowMessage("Pętla autorów 2");
        }


Jak widzisz obiekty dynamiczne są zbędne. Powinieneś pamiętać, że zm nie może być większe od liczby obiektów, do których się odwołujesz i to zarówno w przypadku obiektów tworzonych dynamicznie jak i w przypadku zastosowanego przeze mnie polimorfizmu.

Jeżeli nie rozumiesz tego kodu to zajrzyj do serwisu Cyfrowy Baron:

dział: porady:
    Wyliczanie komponentów na formularzu, dostęp do komponentów poprzez pętlę.
    Dostęp do właściwości komponentów poprzez nazwę klasy.

dział: teoria -> Rzutowanie typów, przypisanie polimorficzne.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości