Zmiana indeksu obiektu sterowana pętlą

0

Witam. Szukam rozwiązania, które pozwoliłoby mi na wczytywanie danych z kolejnych obiektów DBLookupComboBox, w zależności od tego ile z nich jest wybranych (jest to sterowane przez radiogroup).

a=RadioGroup3->ItemIndex;
for (i = 0; i = a; i++) {
	DataModule1->Autorzy_Ksiazki->Insert();
	DataModule1->Autorzy_Ksiazki->FieldValues["Id_Autora"]=DBLookupComboBoxi/*Tutaj indeks elementu ma przyjmować wartość i*/->KeyValue; 
	DataModule1->Ksiazki->Last();
	x=DataModule1->Ksiazki->FieldValues["Id"];
	DataModule1->Autorzy_Ksiazki->FieldValues["Id_Ksiazki"]=x;
	DataModule1->Autorzy_Ksiazki->Post();
} 

To jest hmmm... przykładowy kod, który ma zobrazować o co mi chodzi... Ma ktoś może takowe rozwiązanie w zanadrzu?

0

Utwórz sobie dynamicznie tablicę kontrolek i będzie spoko.

0

Czegoś takiego szukasz ? Znaczy - szukania komponentu "po nazwie" którą w locie robisz ?

int x,y,z;

// ... 

TLabel* label = dynamic_cast<TLabel*>( FindComponent( AnsiString().sprintf("PointLabel_%d_%d_%d", x,y,z) ) );
if(label) {
   // ...
   }
0

To raczej będzie rozwiązanie zasugerowane przez winerfresh'a... Tylko jak na razie nie mogę do końca ogarnąć o co mu chodzi ;-) a może lepiej powiedzieć - jak to wykonać... Bo w necie przykładów jest troszkę, ale większość do VBA...

0

Nie możesz ogarnąć o co chodzi, ale czujesz, że "to jest to". Jak nawet nie wiesz "co to jest" ? :| Nieeee - w taki sposób donikąd nie zajedziesz... Ten fragment o VBA też najlepiej zdaje się pokazywać, że coś nie halo się orientujesz sam czego chcesz, bo ... WTF - czego Ty szukasz, że w zapytaniu o obsługę VCLa wyskakuje Ci Visual Basic?! Przecież VCL nawet na ten język przeniesiony nie jest...

W przykładowym kodzie należało rozumiem to legendarne DBLookupComboBoxi zastąpić. No to masz, zwykłe "kopiuj wklej" niemalże Cię czeka. Masz nawet przykład x razy trudniejszy uklepany ...

Jeśli kontrolki na formę powstawiałeś, a teraz chcesz w nich grzebać... to dynamiczne tworzenie "czegokolwiek" jest absurdem.

0
Ranides napisał(a)

Nie możesz ogarnąć o co chodzi, ale czujesz, że "to jest to". Jak nawet nie wiesz "co to jest" ? :| Nieeee - w taki sposób donikąd nie zajedziesz... Ten fragment o VBA też najlepiej zdaje się pokazywać, że coś nie halo się orientujesz sam czego chcesz, bo ... WTF - czego Ty szukasz, że w zapytaniu o obsługę VCLa wyskakuje Ci Visual Basic?! Przecież VCL nawet na ten język przeniesiony nie jest...
Google = np. tablica kontrolek - same przykłady z VB. Dlatego napisałem, że nie wiem o co z tym chodziło... Bo pierwsze co mi się skojarzyło to tablica "DBLookupów" z chodzącym indeksem :-)

Ranides napisał(a)

W przykładowym kodzie należało rozumiem to legendarne DBLookupComboBoxi zastąpić. No to masz, zwykłe "kopiuj wklej" niemalże Cię czeka. Masz nawet przykład x razy trudniejszy uklepany ...
Tego kopiuj wklej właśnie chciałem uniknąć... Owszem mogę tak zrobić, ale wychodzi coś takiego:

switch (RadioGroup3->ItemIndex) {
case 0:
	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->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; 

**Nie śmiać się - to tylko kod na pokaz! ;-) ** Wszystko fajnie działa, ale chyba nie o to w programowaniu chodzi... Chociaż może tak? Nie wiem - uczę się... Miałem nadzieję, że istnieje sposób żeby można było uszczuplić ten kod bo po prawdzie to ta sama operacja wykonywana z różnymi danymi z różnych combo... Wszelkie pytania uprzedzam - muszą być cztery comba i to cztery różne...

Ranides napisał(a)

Jeśli kontrolki na formę powstawiałeś, a teraz chcesz w nich grzebać... to dynamiczne tworzenie "czegokolwiek" jest absurdem.
A i owszem... Ale od samego początku to nie ja się przy takim rozwiązaniu upierałem... Leniem nie jestem bo "nieco" czasu spędziłem na poszukiwaniach (masz rację, że nie wiem czego szukam) głupotą braku wiedzy nazwać nie można, więc nie denerwuj się ;-) Chciałem po prostu dowiedzieć się jak takie coś rozwiązałby doświadczony programista...

0

Ale ja nie o taki "kopiuj wklej", ja mówię o kopiuj wklej z mojego posta. Tam naprawdę siedzi to, czego Ci do szczęścia trzeba, no nie wiem jak to pokazać...

TDBLookupCombo* FindCombo(TForm* where, int index) {
    return dynamic_cast<TDBLookupCombo*>(where->FindComponent("DBLookupComboBox" + IntToStr(index) ) );
    }

// ...
for(int i=0; i<32; i++) {
    Memo1->Lines->Add( FindCombo(this, i)->KeyValue );
    }

A tekst o głupocie to stopka... muszę wywalić, bo co chwilę ktoś bierze do siebie, nie widząc, że to stopka jest ;)

0

Dobra problem rozwiązałem tak - zadeklarowałem tablicę elementów TDBLookupComboBox

TDBLookupComboBox *autor[4]; 

A następnie pobierając odpowiednio powiększoną wartość z RadioGroup jadę pętlą:

 
zm=RadioGroup3->ItemIndex + 1;

for (i=2; i<zm; i++)
{
	pom=i;
	DataModule1->Autorzy_Ksiazki->Insert();
	DataModule1->Autorzy_Ksiazki->FieldValues["Id_Autora"]=autor[pom]->KeyValue;   //illegal use of floating point
	DataModule1->Ksiazki->Last();
	x=DataModule1->Ksiazki->FieldValues["Id"];
	DataModule1->Autorzy_Ksiazki->FieldValues["Id_Ksiazki"]=x;
	DataModule1->Autorzy_Ksiazki->Post();
}

Miałem błąd kiedy wykorzystywałem i. I tyle.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.