|
Let me be sure I'm understanding you. Your have a dialog object dynamically created, pointed to by (CDialog *myDlg) and inside a member function of that dialog, you're (delete myDlg)'ing it?
If I'm right, then that leads to two points:
1. Why?
2. IIRC an object trying to delete itself is "undefined" behaviour.
Sorry to dissapoint you all with my lack of a witty or poignant signature.
|
|
|
|
|
Here goes:-
I have an application where one dialog is active at a time.
I want to destroy the active dialog on the click of a button present on that dialog and bring up another dialog.
The surprising thing here is that in the function OnClick( ) the destructor of the dialog is called first as I am deleting the dialog pointer and then the remaining part of the code is executed.
What is nagging me is how this is possible that even after deleting the dialog a member function of that dialog is still executing ??
I am enclosing the code to make my point clearer:
void CDialog1::OnButton1()
{
theApp.myDlg->DestroyWindow();
delete(theApp.myDlg); //Destructor is called at this point
theApp.myDlg = NULL;
AfxMessageBox("This function is continued after the destructor");
}
Here the message box should not be displayed, but surprise surprise !!
The message box is displayed and the application works fine.
Any answers ??
|
|
|
|
|
Don't try and delete the dialog from within the dialogs member function.
As a rule of thumb, and yes, there ARE many exceptions, but you should delete an object in the same block as you new'ed it in the first place. unless you specifically want the object to remain in existence once that code block is out of scope.
What you should do is this...
Your "theApp" object is the object that created the dialog, and called DoModal() on it. Since the dialog is modal, that thread blocks until the dialog closes.
Try something like this:
CMyWinApp::Whatever()
{
CDialog1 *myDlg;
CDialog2 *myDlg2;
BOOL bShowDlg1=TRUE;
do {
if (bShowDlg1) {
myDlg = new CDialog1;
myDlg.DoModal();
delete myDlg;
bShowDlg1=FALSE;
} else {
myDlg2 = new CDialog2;
myDlg2.DoModal();
delete myDlg2;
bShowDlg1=TRUE;
}
} while (TRUE);
}
Then, in your dialogs:
CDialog1::OnClick()
{
PostMessage(WM_CLOSE,0,0);
}
I expect you'll need to modify that to meet your exact needs. But you should take the pertinant points, that being to close the dialog with PostMessage() and have the parent object handle allocation and deallocation of the dialog.
Jon
Sorry to dissapoint you all with my lack of a witty or poignant signature.
|
|
|
|
|
When you destroy an object you delete the struct which keeps the member variables and the VTABLE. You don't "delete" the implementation of the member functions. A method of an object is a function with the "this" calling convention ( the "this" pointer is passed to the function thru the ECX register). So the behavior is as expected.
|
|
|
|
|
That explains things nicely.
Personally, i can't think of any real world situation where an object should delete itself. Can anyone point one out?
Sorry to dissapoint you all with my lack of a witty or poignant signature.
|
|
|
|
|
Think technique is used ( for example )when you implement COM objects and the last reference to the object is released :
ULONG MyObject::Release()
{
if( -- m_dwCount == 0 )
{
delete this;
}
return m_dwCount;
}
|
|
|
|
|
In what you have explained above, are we violating any thing or is it a perfectly acceptable implementation?
|
|
|
|
|
Technically it's ok, it's only a matter of coding style.
|
|
|
|
|
can anyone tell me how do i pass and return an array of Objects?
thanks
|
|
|
|
|
use the STL vector class.
Tim Smith
Descartes Systems Sciences, Inc.
|
|
|
|
|
Or, if you don't want to use STL, you could use CObArray from MFC.
or, you could do it like this:
CMyObject arrayMyObjects[10];
for (int i=0; i<10; i++)
{
arrayMyObjects[i].Initialise(or,whatever,you,want,to,do);
}
thats just like using an array of char or int.
Sorry to dissapoint you all with my lack of a witty or poignant signature.
|
|
|
|
|
ok here is my problem:
Stock myStocks[15];
Stock* getMyStocks()
{
return myStocks;
}
binarySearch(Stock* stockArray, int f, int l, char* key)
(
//code blabla
return mid;
)
//when i try to use this last method binarySearch
tempStocks->binarySearch(tempStocks->myStocks, 0, 14, tempSomething)
//here is the error i get:
//cannot convert parameter 1 from 'class Stock* (void)' to 'class Stock*'
//there is no context in which this conversion is possible
DOES ANY ONE SEE where the problem is?
|
|
|
|
|
Explicitly cast mystocks as (Stock *)
ie.
tempStocks->binarySearch((Stock *) tempStocks->myStocks, 0, 14, tempSomething);
Also, it's Very Good Practise to name all your classes with a C.. prefix. This can save a lot of confusion.
JOn
Sorry to dissapoint you all with my lack of a witty or poignant signature.
|
|
|
|
|
USe the CArray class from MFC, you have a couple of options, you can use CArray or CList, one use index on the other one use Positions...
Regards!!!!
A printer consists of three main parts: the case, the jammed paper tray and the blinking red light
Carlos Antollini.
Sonork ID 100.10529 cantollini
|
|
|
|
|
It should be added that
a/ CArray is an array class, and CList is a linked list
b/ unlike STL, if you use MFC container classes you'll need to write al your own algorithms for sorting, partitioning, shuffling, etc.
c/ This guy is really struggling with an assignment and he's not allowed to use std::string, let alone crappy MFC classes.
Christian
I have come to clean zee pooollll. - Michael Martin Dec 30, 2001
Picture the daffodil. And while you do that, I'll be over here going through your stuff.
|
|
|
|
|
Hi,
Is there anyway to get back the proper cpp file which is been corrupted?.I have the .obj file also,is it possible to get the .cpp file from .obj file.
Could anyone pl help me...
|
|
|
|
|
No, it is not. I should think not, anyway.
If it is a debug version then you might be able to extract some of the code, but mostly it will be garbled.
Since it's not a proper exe, you cant even disassemble it which would in any way have given you only an asm version.
Nish
Sonork ID 100.9786 voidmain
www.busterboy.org
If you don't find me on CP, I'll be at Bob's HungOut
|
|
|
|
|
It was in a debug version.i could extract some code.not completely.I have the proper exe of my application.how can i go about to get atleast the asm version.
|
|
|
|
|
If you have the .exe of your app then you can use a disassembler to get the asm version (however IMO I do not know how much of use is this). You can try using one of the best disassembler's, URSoft's W32Dasm v8.93.
If your exe is debug release then you will get as is asm i.e. without any optimizations like entire code knockout's.
Atul
Sonork ID : 100.13714 netdiva
|
|
|
|
|
Hi,
I've been banging my head against the wall for hours because of this one. I have figured out how to draw a minimize button, using the WP_MINBUTTON part id and Theme->DrawBackground(). Now this only draws the button as it should look when the app is in focus, but what about when the app is not in focus? I haven't been able to find any way to do this anywhere in the docs. Any ideas?
Here's my code:
(note that this is using the theme wrapper class from the article http://www.codeproject.com/useritems/themewrapper.asp)
Theme = new cTheme(GetSafeHwnd(), L"WINDOW");
....
int stateId = MINBS_NORMAL;
if(IsPressed())
{
stateId = MINBS_PUSHED;
}
else if(IsHot())
{
stateId = MINBS_HOT;
}
else
{
stateId = MINBS_NORMAL;
}
if(Theme)
{
Theme->DrawBackground(Dc.m_hDC, WP_MINBUTTON, stateId, &ClientRect,
NULL);
}
else
{
// Original painting.
}
Thanks!
swinefeaster
Check out Aephid Photokeeper, the powerful digital
photo album solution at www.aephid.com.
|
|
|
|
|
I have CRichEditView,I want ONLY when I press ENTER ,it goes to new line,and I want it to scroll as long as I want
I test 'SetWordWrapMode'but MSDN said it only work for asian language,I also test this but it does not wotk:
GetRichEditCtrl().SetOptions(ECOOP_SET, ECO_AUTOHSCROLL |
ECO_WANTRETURN | ECO_AUTOVSCROLL);
WORDPAD sample in MSDN does it but I can't figure out how it does it?
Mazy
Don't Marry a Person You Can Live With...
Marry Someone You Can Not Live Without
|
|
|
|
|
Hi,
I have written an application.In that i want to modify the the combobox item dynamically.I just want to update the existing value ,i don't want to enter any extra value.
Can anyone tell me how can i do that?
Regards
Neha
|
|
|
|
|
You'll need to implement your own ModifyString() using InsertString() and DeleteString(). You can modify an item's data using SetItemData() and SetItemDataPtr().
/ravi
"There is always one more bug..."
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Thanks for the reply.
I was searching about replacing in a single step.
Thanks
Neha
|
|
|
|
|
You'll need to delete the old string and insert a new one at the same index. There isn't a message for replacing a string in one step.
--Mike--
"Everyone has figured out what 'service pack' really means, so they had to go and change the language. Perhaps this is what Bill was talking about in the 'security is top priority' letter."
-- Daniel Ferguson, 1/31/2002
My really out-of-date homepage
Sonork - 100.10414 AcidHelm
Big fan of Alyson Hannigan.
|
|
|
|