Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinApi] ComboBox - ustalanie listy wyboru drugiego Combo w zaleznosci od wybrania pozycji z pierwszego

Ostatnio zmodyfikowano 2014-07-22 09:43
Autor Wiadomość
nairu
Temat założony przez niniejszego użytkownika
[WinApi] ComboBox - ustalanie listy wyboru drugiego Combo w zaleznosci od wybrania pozycji z pierwszego
» 2014-07-21 22:27:29
Witam,

Mam problem - nie wiem jak uzaleznic elementy wyswietlane w comboboxie od wyboru konkretnego elementu z pierwszego comboboxa.

Mam dwie listy - pierwsza z mozliwosciami wyboru "aaa" i "bbb". Jesli wybiore "aaa", to w drugim comboboxie chce, zeby pojawily sie do wyboru opcje "111" i "222", natomiast jesli w pierwszym wybiore "bbb", to chcialbym w drugim moc wybrac miedzy "333" i "444". Kod, ktory mam, niestety nie dziala zbyt dobrze. W main.cpp nic nie robilem, wiec wklejam sam LRESULT CALLBACK WindowProcedure. Calosc funkcji siedzi w combo.cpp, wiec ten plik wklejam w calosci. Plik naglowkowy to tylko deklaracje funkcji, wiec tez nie wklejam.

Bede wdzieczy za pomoc.

main.cpp:

C/C++
LRESULT CALLBACK WindowProcedure( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    switch( message ) /* handle the messages */
    {
    case WM_CREATE:
        {
            CreateCbox( hwnd );
            CzytajPlik( 1 );
            break;
        }
    case WM_COMMAND:
        {
            switch( LOWORD( wParam ) ) {
            case 101:
                {
                   
                    SprawdzWartosc();
                    break;
                }
            case 102:
                {
                   
                    CzytajPlik( 2 );
                    break;
                }
            }
            break;
        }
       
    case WM_DESTROY:
        PostQuitMessage( 0 ); /* send a WM_QUIT to the message queue */
        break;
        default: /* for messages that we don't deal with */
        return DefWindowProc( hwnd, message, wParam, lParam );
    }
   
    return 0;
}

plik combo.cpp:

C/C++
#include <windows.h>
#include <fstream>
#include <sstream>
#include <string>
#include "combo.h"

using namespace std;

HWND cbox1, cbox2;

int aa =- 1;

void CreateCbox( HWND shwnd ) {
    cbox1 = CreateWindowEx( NULL, "COMBOBOX", NULL, WS_CHILD | WS_VISIBLE | CBS_DROPDOWN, 10, 10, 150, 100, shwnd,( HMENU ) 101, GetModuleHandle( NULL ), NULL );
    cbox2 = CreateWindowEx( NULL, "COMBOBOX", NULL, WS_CHILD | WS_VISIBLE | CBS_DROPDOWN, 200, 10, 150, 100, shwnd,( HMENU ) 102, GetModuleHandle( NULL ), NULL );
}
void CzytajPlik( int box ) {
    string liniabiezaca;
    string typ, wartosc;
    fstream plik( "baza.txt" );
    while( getline( plik, liniabiezaca ) ) {
        plik >> typ >> wartosc;
        switch( box ) {
        case 1:
            {
                if( typ == "data1" ) {
                    SendMessage( cbox1, CB_ADDSTRING, 0,( LPARAM ) wartosc.c_str() );
                }
                break;
            }
        case 2:
            {
                if( aa = 0 ) {
                    if( typ == "dataaaa" ) {
                        SendMessage( cbox2, CB_ADDSTRING, 0,( LPARAM ) wartosc.c_str() );
                    }
                }
                else if( aa = 1 ) {
                    if( typ == "databbb" )
                         SendMessage( cbox2, CB_ADDSTRING, 0,( LPARAM ) wartosc.c_str() );
                   
                }
                break;
            }
        }
       
       
       
    }
}
void SprawdzWartosc() {
    aa = SendMessage( cbox1, CB_GETCURSEL, 0, 0 );
    /*int indexcombo=SendMessage(cbox1,CB_GETCURSEL,0,0);
        ostringstream convert;
        convert<<indexcombo;
        string wartosc=convert.str();
        MessageBox(NULL,wartosc.c_str(),"wartosc",MB_OK);
        aa=indexcombo;
    */
}

korzystam z zapisanej w pliku tekstowym bazy danych:

------pierwszy box-----
data1 aaa
data1 bbb

-----drugi box-----------
dataaaa 111
dataaaa 222

databbb 333
databbb 444

P-114176
Monika90
» 2014-07-21 23:56:08
Nie dość że używasz zmiennych globalnych, to jeszcze mają nic nie mówiące nazwy jak np. aa.

if( aa = 0 ) {
warunek nigdy nie jest spełniony, na dodatek zmienia wartość aa

else if( aa = 1 ) {
warunek zawsze jest spełniony i zmienia wartość aa
P-114183
nairu
Temat założony przez niniejszego użytkownika
» 2014-07-22 09:43:02
Hah, tragiczna w skutkach literowka :D. Tak, uzywam zmiennej globalnej w tym przykladzie - kod pisany na potrzeby pokazania mechanizmu reakcji comboboxow. W programie, do ktorego to potrzebuje jest zamiast tego obpowiednie zmienna w ramach obiektu - tak mam nadzieje moze juz byc.

Nawet jednak po poprawie literowki program nie robi tego, co powinien. Dla zainteresowanym rozwiazaniem jest wyczyszczenie zawartosci comboboxa:
SendMessage( cbox2, CB_RESETCONTENT, 0, 0 );
. Ta linijka wyladowala w funkcji
Sprawdz wartosc
.

Zastanawia mnie natomiast dlaczego gdy wrzuce
Sprawdz wartosc
 do case 101, czyli odczytania wiadomosci z cbox1, a do case 102
CzytajPlik( 2 );
, to w cbox2 pojawia mi sie cztery pozycje, zamiast dwoch. Rozwiazaniem jest umieszczenie wszyzstkiego w procedurze zdarzeniowej dla cbox1, ale wciaz nie wiem dlaczego tak sie dzieje.

Bede wdzieczny za odpowiedz.
P-114186
« 1 »
  Strona 1 z 1