Šta je novo?

jos jedan problem u VC++

rocky

Čuven
Učlanjen(a)
25.07.2003
Poruke
39
Poena
604
U InitInstance() funkciji aplikacije postoji nesto otprilike sledece:
while(x==0)
{
....
CGlavniSheet dlg;
...
dlg.DoModal()
...
}
Prilikom prvog prolaska kroz petlju sve dobro radi dok se kod sledeceg dijalog pojavi samo na trenutak i odmah sam zatvara sa nekom bezveznom povratnom vrednoscu. Probao sam i da u drugom prolasku kroz petlju formiram
instancu CGlavniSheet klase kao dlg1 ali ni to nije radilo kako treba.

U sustini sta mi treba? U dlg-u imam tajmer koji broji jednu promenljivu. Na pritisak tastera tastature ili pomeranje misa, promenljiva se postavlja na nulu i ponovu se odbrojava. Ako dostigne odredjenu vrednost izvrsava se funkcija EndDialog() koja zatvara dlg. Ako se dijalog zatvori na ovaj nacin promenljiva x koja se nalazi u uslovu while petlje se ne menja i petlja bi trebalo ponovo da se izvrsava, ali javlja se problem kod izvrsavanja petlje koji sam gore naveo.
Zna li neko resenje ovoga?
 
Stavi breakpoint-e u OnInitDialog i u funkciju u kojoj pozivas EndDialog() da vidis da li je u redu vrednost promenljive x prilikom drugog startovanja.
 
Poslednja izmena:
OK je vrednost promenljive, jer se petlja izvrsava ponovo, ali se prozor ne dlg ne otvara kako treba.
 
rocky je napisao(la):
OK je vrednost promenljive, jer se petlja izvrsava ponovo, ali se prozor ne dlg ne otvara kako treba.

Kod:
#define TIMERID 1
#define INTERVAL 5000

TestDlg::TestDlg(CWnd* pParent /*=NULL*/)
	: CDialog(TestDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(TestDlg)
	//}}AFX_DATA_INIT

	m_nTimer = 0;   // initializacija timer'A
}


void TestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(TestDlg)
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(TestDlg, CDialog)
	//{{AFX_MSG_MAP(TestDlg)
	ON_WM_MOUSEMOVE()    
	ON_WM_KEYDOWN()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////


void TestDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
        // kod svakog pokretanja misa , instaliraj timer ponovo 
	InstallTimer(INTERVAL);

	CDialog::OnMouseMove(nFlags, point);
}

void TestDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// kod pritiskanja tastera , instaliraj timer ponovo 
	InstallTimer(INTERVAL);
	
	CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}

void TestDlg::OnTimer(UINT nIDEvent) 
{
	CDialog::OnTimer(nIDEvent);

	if(nIDEvent == TIMERID)  // ukoliko je vrijeme isteklo pokreni zatvaranje dialoga 
		EndDialog(0);

}

BOOL TestDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

        // instaliraj timer na 5 sekundi 
	InstallTimer(INTERVAL);
		
	return TRUE;
}


int TestDlg :: InstallTimer(UINT milisec)
{
	if(m_nTimer)    // ukoliko postoji vec timer prvo ga deinstaliraj 
		DeInstallTimer();

	return m_nTimer = SetTimer(TIMERID , milisec,NULL);
}

void TestDlg :: DeInstallTimer()
{
	KillTimer(TIMERID);  // ocisti Timer
        m_nTimer = 0; 
}



-----------------------------------------------------

U InitInstance methodi mozes onda postaviti tvoju petlju :

int x=0;

while(x==0)
{
	TestDlg td;

        td.DoModal();
}
 
Poslednja izmena:
Nazad
Vrh Dno