Przesyłanie nazwy obiektu w funkcji.

0

Witam, jestem w trakcie pisania programu. Mam kłopot z przesłaniem nazwy obiektu jako argument w funkcji. Kod poniżej na pewno pozwoli zrozumieć co dokładnie mam na myśli.

void wczytajj_ComboBox(char* plik, int klasa);
//-------------------------------------------------

void wczytaj_ComboBox(char* plik, int klasa)
{
         //inicjujemy INI
        TIniFile * Ini = new TIniFile(ExtractFileDir(Application->ExeName) + plik);

        //deklarujemy zmienną int "ilosc" i przypisujemy jej wartosc z INI
        int ilosc = Ini->ReadInteger("main", "numer", 0);

        //deklarujemy zmienne
        AnsiString odczyt;

         //usuwamy zawartość listboxa
        if(klasa == 1) { Form1->CB_Dystrybutor->Clear(); }
        if(klasa == 2) { Form1->CB_Producent->Clear(); }

        //każdy przebieg wprowadza dane do wykonywanego ComboBox
        for(ilosc; ilosc >=1 ; ilosc--)
        {
                //odczytujemy nasze zmienne z pliku INI
                odczyt = Ini->ReadString(ilosc, "pozycja", " ERROR ");

                //dodajemy do listboxa pozycję z danymi
                if(klasa == 1) { Form1->CB_Dystrybutor->Items->Add(odczyt); }
                if(klasa == 2) { Form1->CB_Producent->Items->Add(odczyt); }
        }
}

W funkcja wczytaj używa argumentu klasa do identyfikacji obiektu, dodawanie kolejnych obiektu jest uciążliwe nie mówiąc o tym, że jeżeli ktoś zmieni nazwę obiektu to program się wysypie. Proszę o pomoc jak zastąpić int klasa, parametrem dla obiektu.

0
      for(ilosc; ilosc >=1 ; ilosc--)
        {
                //odczytujemy nasze zmienne z pliku INI
                odczyt = Ini->ReadString(ilosc, "pozycja", ""); // wartosc domyslna pusta bedzie bardziej poreczna

                if(odczyt.isEmpty()) // odczyt ==""
                     continue; // ignoruj brak wpisu
                     // throw TExeption("pusty wpis") // abo wyjatek

                //dodajemy do listboxa pozycję z danymi
                if(klasa == 1) { Form1->CB_Dystrybutor->Items->Add(odczyt); }
                if(klasa == 2) { Form1->CB_Producent->Items->Add(odczyt); }
        }

Co do błędnych wpisów, to z tego kodu i opisu nie wiadomo o co ci chodzi, bo nie wiadomo co to jest CB_Dystrybutor i jego składowe (to samo CB_Producent).
Nawet zakładając, że to jest ComboBox to nadal nie wiadomo, co robisz z zawartością tego combo boxa.

0

Tak jest to ComboBox, na Formie znajduje się ich kilka, pisanie dla każdego z nich funkcji wczytującej pozycje, które pobierane są z pliku ini było by uciążliwe. Funkcja otrzymuję jako argument nazwę pliku z którego ma pobrać rekordy do ComboBox oraz liczbę określającą do jakiego ComboBox ma wprowadzić pobrane dane. Uciążliwe będzie dodawanie kolejnych if-ów aby poprawie określić do jakiego ComboBox mają zostać wprowadzone dane np. CB_Producent, czy CB_Dystrybutor, dlatego pytam w jaki sposób w funkcji przekazać obiekt jako argument ?

0

Dobra teraz rozumiem o co ci chodzi. Ty chcesz to po prostu źle zrobić. To powinno być tak:

void Form1::wczytajUstawieniaZIni(char* plik)
{
     TIniFile * ini = new TIniFile(ExtractFileDir(Application->ExeName) + plik);
     try {
          CB_Dystrybutor->Items = wczytajListe(ini, "Dystybutorzy");
          CB_Producent->Items = wczytajListe(ini, "Producenci");
     }
    __finally { // nie pamiętam tego keyword'a
         delete ini;
    }
}

TStrings Form1::wczytajListe(TIniFile * ini, const AnsiString& sekcja)
{
     TStrings result;

     const int count = ini->ReadInteger(sekcja, "items_count");

     for(int i=1; i<=count; ++i) {
         AnsiString entry = ini->ReadString(sekcja, AnsiString("pozycja ")+i, "");
         if(entry.isEmpty())
             continue;
         result.append(entry);
     }
     return result;
}

napisane z palca (na dodatek dawno nie używałem BCB), więc mogłem poprzekręcać nazwę metod, ale widać o co chodzi, jest bardziej przejrzyste i bardziej uniwersalnie (teraz możesz więcej wpakować do jednego pliku ini).

0

No można i tak.... I tak jak napisałeś bardziej uniwersalne.
Ale z ludzkiej ciekawości zapytam o to jak wstawić ten obiekt jako argument w funkcji?

0

przez wskaźnik. Nie ejstem pewien o co ci chodzi.
Poza tym nazywaj wszystko bardziej ostrożnie, bo przez to, że w nazwach zmiennych stosujesz pojecie, które kojarzą się z czymś innym (klasa to typ złoży w programowaniu, a nie a nie okreslenie co powinno być w combo box), zrozumienie o co ci chodzi (lub kodu) jest 5 razy trudniejsze.

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