jericho666 Opublikowano 14 Maja 2007 Zgłoś Opublikowano 14 Maja 2007 Srodowisko to visual studio 2005 Aplikacja to okno dialogowe, w ktorym chce wykorzystać możliwości funkcji OnIdle, na początek jakis prosty licznik który bedzie sobie liczył podczas bezczynnosci programu. Problem pojawia się przy wywoływaniu przez funkcje OnIdle funkcji składowej klasy dialogu. kod funkcji OnIdle w głównej klasie aplikacji : BOOL CIdleTestDialogApp::OnIdle(LONG lCount) { BOOL bRtn=CWinApp::OnIdle(lCount); CIdleTestDialogDlg* wsk; wsk=(CIdleTestDialogDlg*)m_pMainWnd; wsk->LicznikIdle(); // <- to funkcja z klasy dialogu return bRtn; } przy takim wywołaniu funckji LicznikIdle(), odpowiadającej za liczenie program sie kompiluje ale nie działa Oprócz tej wersji próbowałem tworzyć własny wskaźnik do okna dialogowego // fragment kodu inicjujacego okno dialogowe CIdleTestDialogDlg dlg; m_pMainWnd = &dlg; // <- wskaznik standardowy wsk2=&dlg; // <- moj dodatkowy wskaznik (klasa wskaznika ta sama co moje okno dialogowe) przy odwoływaniu sie przez ten drugi wskażnik program tez sie kompiluje ale nie działa podejrzewam ze prawidlowo takie rzeczy robi sie to jakos za pomocą wskaznika m_pMainWnd ale nie wiem w jaki sposob :-| Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 15 Maja 2007 Zgłoś Opublikowano 15 Maja 2007 a prześledziłeś debugerem czy m_pMainWnd ma jakąś rozsądna wartość? Czy Twoja aplikacjaApp nie ma wskaźnika bezpośrednio na klasę oknaDlg? Aha już widzę.. zatem dialoga tworzysz statycznie... Prześledź debugerem gdzie wchodzi wsk->LicznikIdle(); jesli wsk będzie różne od NULLa i od głupich wartości typu 0f0f0f efefef etc.. Zamiast się ropzpisywać wystarczy zrzutować wskaźnik w locie ((CIdleTestDialogDlg*) m_pMainWnd)->LicznikIdle(); albo skorzystać z bardziej higienicznego (dynamic_cast<CIdleTestDialogDlg*>m_pMainWnd)->LicznikIdle(); ps. debuger najlepszym przyjacielem programisty :wink: Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
jericho666 Opublikowano 4 Czerwca 2007 Zgłoś Opublikowano 4 Czerwca 2007 (edytowane) fukcja OnIdle działa jak trzeba gdy skorzystam zamiast z Dialogu z SDI lub MDI Natomiast w aplikacji dialogowej przesledziłem debugerem wskażniki pokazujące na ten dialog i mają jednakową i raczej sensowną wartość, a gdy break point ustawie w ciele funkcji OnIdle to program sie nie zatrzymuje a więc wynika ze ta funkcja wogole nie jest uruchamiana, próbowałem znalezc cos w opcjach bo być może nie jest to domyślnie włączane w projekcji dialogu ale za bardzo nic nie znalazłem Byc może jest to jakies ograniczenie dialogu A i odpowiedzieć wczesniej nie mogłem bo to był program pomocniczy do pracy mgr ( obrona i takie tam :D) EDIT: Nie daje mi spokoju i powalczyłem teraz jeszcze toche z tym i wyszło że to przez modalne wywoływanie okna lecz niestety gdy wywołam okno w skosób niemodalny aplikacja sie automatycznie zamyka probowałem jeszcze otworzyć nowy projekt SDI powywalać z stamtąd wszystkie doki itp. i umiescić okno dialogowe i efekt był taki sam jak w przypadku projektu z zastosowanie samego dialogu czyli jak okno było modalne to głowna klasa aplikacji jest blokowana a jeżeli niemodalne to aplikacja sie poprostu kończyła odrazu po uruchomieniu Edytowane 4 Czerwca 2007 przez jericho666 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 6 Czerwca 2007 Zgłoś Opublikowano 6 Czerwca 2007 bo niemodalne okno nie zatrzymuje programu w miejscu wywołania :).. robi to tylko doModal(). Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...