Witam. Stworzyłem własną listę opierającą się na tworzeniu własnych przycisków i ustawianiu ich kolejno pod sobą.
Na początku przedstawię funkcje:
- Funkcja dodania kontrolki
bool fList_DodajElement(char *sciezka, HWND *hwnd){
//strcat(tekst2, "start: ");
//strcat(tekst2, sciezka);
//strcat(tekst2, "\r\n");
int ID = fList_WyszukajWolneID();
HWND hNew = CreateWindowEx(WS_EX_ACCEPTFILES, "WH_LISTCLASSELEMENT", sciezka, WS_CHILD | WS_VISIBLE, 0, int(hListaElementy.size())*21, 250, 21, hListaOdtwarzania, (HMENU)ID, *hInstance, NULL);
if(hwnd == NULL)
{
char tekst[5];
itoa(ID, tekst, 10);
MessageBox(0, tekst, "liczba", MB_OK);
hListaElementy.push_back(&hNew);
}
return true;
}
- Funkcja wyszukiwania wolnego ID dla kontrolki (aby 2 kontrolki nie miały takiego samego ID)
int fList_WyszukajWolneID(){ // blad
//strcat(tekst2, "fList_WyszukajWolneID()\r\n");
int ID=0;
bool znalezione=false;
while(!znalezione)
{
ID++;
///========================================================
//strcat(tekst2, "fList_WolneID z arg: ID =");
//char tekst[5];
//itoa(ID, tekst, 10);
//strcat(tekst2, tekst);
//strcat(tekst2, "\r\n");
///========================================================
znalezione = fList_WolneID(ID);
}
strcat(tekst2, "znaleziono wolne ID\r\n");
return ID;
}
- Funkcja pomocnicza do powyższej - sprawdza, czy podane ID posiada już jakas kontrolka.
bool fList_WolneID(int ID){
for(int n=0; n<(int)hListaElementy.size(); n++)
{
///========================================================
//strcat(tekst2, ">> sprawdzanie ID kontrolki (n = ");
//char tekst[5];
//itoa(n, tekst, 10);
//strcat(tekst2, tekst);
//strcat(tekst2, "): ");
//itoa(GetDlgCtrlID( *hListaElementy[n]), tekst, 10);
//strcat(tekst2, tekst);
//strcat(tekst2, "\r\n");
///========================================================
if(ID == GetDlgCtrlID( *hListaElementy[n]))
{
//strcat(tekst2, ">> Podane ID istnieje ! \r\n");
return false;
}
}
//strcat(tekst2, ">> Nie istnieje podane ID !\r\n");
return true;
}
- Dodatkowo vector na przechowywanie uchwytów kontrolek
vector <HWND*> hListaElementy;
Opis problemu:
Funkcja znajdująca unikatowe ID dla kontrolki zawsze zaczyna od ID = 1. Jeżeli jest zajęte przez jakąś kontrolkę z kontenera sprawdza ID = 2 itd. Niestety... Pierwsza kontrolka dostaje ID=1, druga kontrolka dostaje ID=2, natomiast 3 kontrolka dostaje ID=1 (powinno być 3).
Moje działania w celu znalezienia problemu:
Stworzyłem tablice znaków i sprawiłem, aby podane funkcje wypisywały w kontrolce Edit każdy swój ruch. problem pojawił się na samym końcu.
imgur.com/VISk7ue
Jak widzicie faktycznie tworzenie kontrolki 1 oraz 2 przebiega bez zarzutu. Kontrolka 1 otrzymuje ID1, kontrolka 2 otrzymuje ID2. Przy tworzeniu kontrolki nr 3, program sprawdza dostępne ID.
- sprawdza czy wolne jest ID: 1
- sprawdza ID pierwszej kontrolki (tu jest błąd, ponieważ kontrolka takowa ma ID = 1, a nie jak jest napisane: 2)
- sprawdza ID drugiej kontrolki (tu wynik jet prawidłowy - id wynosi 2)
- Stwierdza, że nie wystąpiło nigdzie ID = 1 i przypisuje kolejnej kontrolce ID=1.
O co proszę:
Mógłby ktoś podpowiedzieć, co jest w tym kodzie źle? czyżbym źle odczytywał ID kontrolek? Używam funkcji GetDlgCtrlID(). Z góry dziękuję za pomoc.