|
Well, it's your program huh. Just use 100,200,300 etc. for your timer IDs. Its better not to have too many timers active at any one time. You dont have to worry about other timers in other programs.
Nish
[Signature temporarily down]
|
|
|
|
|
you always right but not replying to my question
i want to get any error/assert when i'm starting already running id to use different value
and i see no legal way
what when your nr 100 uses your base class? (of course not necessary uses in that moment but that is another kind of problem, we can suppose in testing time i will find conflicts ignoring manual solutions like "use spy tool with filter to wm_timer")
t!
|
|
|
|
|
As far as I see, the only strightforward way to achieve this, is to have an array of timerIDs, which is maintained manually. I dont see any other way to enumerate existing timers. Maybe there are other more advanced means available like global hooks, not sure though...
Nish
[Signature temporarily down]
|
|
|
|
|
No, there's no unique-within-the-class requirement. Just like SDK, it must be unique per CWnd.
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
Tomasz Sowinski wrote:
No, there's no unique-within-the-class requirement. Just like SDK, it must be unique per CWnd.
That's what I meant when I said CWnd derived class, under the assumption that any particular CWnd derived class would hopefully not deal with more than one HWND
Nish
[Signature temporarily down]
|
|
|
|
|
That's what you wrote in first reply:
Nish [BusterBoy] wrote:
The ID needs to be unique only within your CWnd class [assuming you are using this from an MFC CWnd derived class]
Class is not an object, and vice versa
Tomasz Sowinski -- http://www.shooltz.com
|
|
|
|
|
Tomasz Sowinski wrote:
Class is not an object, and vice versa
The error is regretted
I am sure glad you were not high school teacher. I wouldn't have passed even now
Thanks anyway Tomasz
Nish
[Signature temporarily down]
|
|
|
|
|
you just have to keep up wich numbers you've already used. In a CList<int,int> for instance or just an static int in the function you use for creating your timers...
-------------------------------
Greetz,
MG
|
|
|
|
|
no enought
f.e. system conrols create their own timers
do you know to say their ids are platform independent?
t!
|
|
|
|
|
what do you mean by system controls?
They are not in your program/Window so they don't bother you.
-------------------------------
Greetz,
MG
|
|
|
|
|
i have class derived from tree or list control and i want to create own timer there
t!
|
|
|
|
|
so your tree or listcontrol will receive the timer message of the timers you create. and you can just create a timer like settimer(1,500,NULL); that's all.
You think your tree control will receive timermessages from another control?? That's not true.
If this is not your problem, please explain it to me/us.
-------------------------------
Greetz,
MG
|
|
|
|
|
if i in my tree class create own timer with id 42 it will fight with tree control created one (sure for w2000) - i can eat its timer event thinking its mine
t!
|
|
|
|
|
I've never seen a simple tree control that uses timer events, unless I made them myself
-------------------------------
Greetz,
MG
|
|
|
|
|
i have in own program tree example with sending afer every l-click and example without it - can't get to search what is difference in tree properties can cause it
the same timer ids are when spy-ing regedit or explorer (but here we can't be so sure it is system tree)
any way - for simplicity try imagine you using not system control but another you have no sources
t!
|
|
|
|
|
ok, it seems not-sending was because of my click handling
not depended on control state
do you realy have no WM_TIMER messages?
t!
|
|
|
|
|
no, sorry.
I realy don't know why a tree-control should use timer events, for what purpose?
Is it just a tree-control or a ActiveX kind of tree-control?
-------------------------------
Greetz,
MG
|
|
|
|
|
tree control
first example i recalled:
when i l-click to last half visible item (maing it selected) it selects it and scrolls down after short delay (doubleclicktime)
when you do it by keyboard it scrolls imediately
t!
|
|
|
|
|
Hello I am having a problem I don't understand. What I wanted was to have only one instance of a certain document open at once. So I overrided the On_File new of the app like this:
void CEditorApp::OnFileNew()
{
// TODO: Add your command handler code here
pMyTemplate->CloseAllDocuments(TRUE);
CNewDSNDlg pDlg;
pDlg.DoModal();
}
Obviously this dosn't open a new document , the document in question is opened elsewhere. If there is not a document open it dosn't have a problem. If there is one, this throws an assertion for some reason. One thing that confuses me is it only throws the assertion when compiled in debug mode but not when compiled in release. The exemption it throws is in OBJCORE.CPP and is refered to as a User Breakpoint:
// check to make sure the VTable pointer is valid
ASSERT(sizeof(CObject) == sizeof(void*));
if (!AfxIsValidAddress(*(void**)pOb, sizeof(void*), FALSE))
{
TRACE0("ASSERT_VALID fails with illegal vtable pointer.\n");
if (AfxAssertFailedLine(lpszFileName, nLine))
AfxDebugBreak();
return; // quick escape
}
Could someone explain why this assertion is only being thrown in debug and also wether or not I should even care? I am worried this will cause a memory leak or something.
Thx,
Richard
|
|
|
|
|
The ASSERT and TRACE macros are defined for DEBUG mode only. In RELEASE mode the ASSERT and TRACE macros are defined as ((void)0), so in RELESE mode the folloing line:
ASSERT(sizeof(CObject) == sizeof(void*));
Will be changed by preprocessor to:
((void)0) (sizeof(CObject) == sizeof(void*));
and the compiler will ignore that line, so even all arguments will not get valuated.
That’s why there is no assertion in RELEASE mode.
BTW, this is different from another approach when a macro gets defined for RELEASE like this:
#define ASSERT
In that case all macro arguments get valuated even in RELEASE mode.
Serge
|
|
|
|
|
Asserts are there to catch bugs in your code. An object is being deleted or blown away before it should be. You don't give enough info to tell what you're doing wrong, but look at the stack trace when the assert fires, and see what part of MFC is doing the validation and on what object.
--Mike--
Best score on the mini-putt game: 26
My really out-of-date homepage
Sonork - 100.10414 AcidHelm
Big fan of Alyson Hannigan and Jamie Salé.
|
|
|
|
|
Do not use CloseAllDocuments. This is why:
CDocTemplate::CloseAllDocuments
virtual void CloseAllDocuments( BOOL bEndSession );
Parameters
bEndSession
Specifies whether or not the session is being ended. It is TRUE if the session is being ended; otherwise FALSE.
Remarks
Call this member function to close all open documents. This member function is typically used as part of the File Exit command. The default implementation of this function calls the CDocument::DeleteContents member function to delete the document's data and then closes the frame windows for all the views attached to the document.
Override this function if you want to require the user to perform special cleanup processing before the document is closed. For example, if the document represents a record in a database, you may want to override this function to close the database.
|
|
|
|
|
Welp it would apear I have found the problem. I adjusted the code to look like this:
CNewDSNDlg pDlg;
pDlg.DoModal();
pMyTemplate->CloseAllDocuments(FALSE);
This seamed to cure the problem. It was the dialog being opened within the funtion after the document closure. Having the dialog come up before the document closure has cured the problem. I have to admit I am not sure why and if anyone happens to know I wouldn't mind learning the reason.
Thx,
Richard
|
|
|
|
|
Wouldn't it be easier to just stop the OnFileNew procedure being called?
OnUPdateFileNew(CCmdUI *pCmdUI)
{
POSITION pos ;
pos = pDocTemplate->GetFirstDocPosition() ;
pCmdUI->Enable(pos == NULL) ;
}
Of course you need the CDocTemplate pointer for this to work.
Roger Allen
Sonork 100.10016
If I'm not breathing, I'm either dead or holding my breath.
A fool jabbers, while a wise man listens. But is he so wise to listen to the fool?
|
|
|
|
|
I'm trying to open recorset using command object, and retreve data from Access database.
m_pRds->Open(_variant_t((IDispatch *) m_pCmd, true), Parameter2, adOpenStatic ,adLockOptimistic, adCmdStoredProc);
what should I specify as Parameter2, cause when I put current connection there I'm getting error "Cannot change the ActiveConnection propery of a Recorset object which has a Command object as its source."
|
|
|
|