|
sayup wrote:
n the menu handler i have not intilaized m_d1(as it is not necessary).
If m_d1 is a member variable, then it IS necessary that it be initiallised to NULL. That was my answer to your first question. And if a modeless dialog is not a member variable, then you're going to leak memory.
sayup wrote:
and i am not clear as to why your saying OnCancel shouldn't call DestroyWindow().
Because then you need a callback to the first function, in order to set the pointer back to NULL. So much easier to just hide the window until you need it next.
sayup wrote:
And what do you mean by handling OnClose well?
If you click on the X on the top right of a dialog, it closes without calling OnOK or OnCancel, so you need to handle this case as well.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
ok thanks,
can you please tell me what is m_d1? it is just defined as variable of my modeless dialog class?I am asking this because i declared it as avariable and initalized it to NULL in parent dialog's constructor and then wrote code as you had given but it was giving some error of == sign;like i have intilaized in constructor and i am checking its value in (m_d1==NULL)in menu handler.
Also one more doubt if i wrote ShowWindow(SW_HIDE) in OnCancel() instead of DestroyWindow(),next time when i click on the menu the dialog be displayed,this is what your suggesting right?
and after clicking red cross button if the modeless dialog completelty closes i dont have any problems with it.It should only open successfully next time i select the menu.
by the way can you just give me suggestion how to store the history in edit box.Like if user entes some values in edit box of dialog and then we close the box,the value should be seen next time i open the dialog....
thanks a lot
please reply
thanks
|
|
|
|
|
sayup wrote:
can you please tell me what is m_d1?
m_ is the convention for naming member variables. It's the member variable which is a pointer to your dialog class, set to NULL in your constructor.
sayup wrote:
and then wrote code as you had given but it was giving some error of == sign;like i have intilaized in constructor and i am checking its value in (m_d1==NULL)in menu handler.
What was the error ? If m_d1 is a pointer, then I don't see what the error could be.
sayup wrote:
Also one more doubt if i wrote ShowWindow(SW_HIDE) in OnCancel() instead of DestroyWindow(),next time when i click on the menu the dialog be displayed,this is what your suggesting right?
Yes, with the code I gave you.
sayup wrote:
and after clicking red cross button if the modeless dialog completelty closes i dont have any problems with it.It should only open successfully next time i select the menu.
You need to handle this event so it also only calls ShowWindow
sayup wrote:
by the way can you just give me suggestion how to store the history in edit box.Like if user entes some values in edit box of dialog and then we close the box,the value should be seen next time i open the dialog....
Where do you store app settings now ? If this is one of these modeless dialogs, it will stay there by itself when you impliment my suggestion.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
|
i have read that article but i am still very confused.I request you to read my recent message(sent just before this) and give me suggestion
thanks
thanks
|
|
|
|
|
in my app, i call an exe service. but i can't set break point in the exe service. how to do it? thanks in advance
|
|
|
|
|
Do a debug build, start it, and attach your IDE to the process.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
I have a class named CWinFileIn and one named CWinFileOut, and I wanted to derived another one CWinFileInOut from the other two, but the compiler gives errors about functions and data members being ambiguous (both CWinFileIn and CWinFileOut have m_hFile etc.). So what's the right way of designing these classes?
- thanks
|
|
|
|
|
Don't give them both variables of the same name, I would have thought. The other possibility is containment, write a class that has instances of both classes, or derives from one and has an instance of the other.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
Christian Graus wrote:
Don't give them both variables of the same name
but I want CWinFileInOut to inherit CWinFileIn's read functions and CWinFileOut's write functions, using the same file handle and other private data. but i guess it's not possible.
|
|
|
|
|
nm_114 wrote:
but I want CWinFileInOut to inherit CWinFileIn's read functions and CWinFileOut's write functions, using the same file handle and other private data. but i guess it's not possible.
Then derive from a common base class that contains those variables, and/or derive from multiple classes that define interfaces.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
Christian Graus wrote:
Then derive from a common base class that contains those variables
I made a struct WFIOInfo that has the handle info etc. and CWinFileIn and CWinFileOut both derive from it, so if CWinFileInOut derive from both CWinFileIn and CWinFileOut which both have their own instances of the base class i still get the same ambiguous errors. Or did I not understand what you were suggesting?
Christian Graus wrote:
and/or derive from multiple classes that define interfaces
I don't know what that means. do you know of any examples i could look at?
|
|
|
|
|
struct WFIOInfo
{
...
}
class WinFileInInterface // Note - NOT derived from WFIOInfo, defines an interface for what CWinFIleIn has that WFIOInfo does not
{
virtual void myMethod; //etc
}
class WinFileOutInterface
{
virtual void myMethod; //etc
}
class CWinFileIn : WFIOInfo, WinFileInInterface
{
}
class CWinFileOut : WFIOInfo, WinFileOutInterface
{
}
class CWinFileInOut : WFINInfo, WinFileInInterface, WinFileOutInterface
{
}
So, CWinFileInOut is not derived from either derived class, but from all three base classes that combine to make the class you're after.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
ok, i think i *almost* have it, but its giving me the following errors:
Linking...
winiotest.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall WinFileOutInterface::DoWriteFile(void const *,unsigned long)" (?DoWriteFile@WinFileOutInterface@@UAEHPBXK@Z)
winiotest.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall WinFileInInterface::DoReadFile(void *,unsigned long)" (?DoReadFile@WinFileInInterface@@UAEHPAXK@Z)
winiotest.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall WinFileInInterface::Open(char const *)" (?Open@WinFileInInterface@@UAEHPBD@Z)
winiotest.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall WinFileOutInterface::Open(char const *)" (?Open@WinFileOutInterface@@UAEHPBD@Z)
Debug/winiotest.exe : fatal error LNK1120: 4 unresolved externals
here's my code so far:
struct WFIOInfo
{
HANDLE m_hFile;
DWORD m_dwBytes;
};
class WinFileInInterface
{
public:
virtual BOOL Open(LPCTSTR lpszFileName);
virtual BOOL DoReadFile(LPVOID lpBuffer, DWORD nNumberOfBytesToRead);
};
class WinFileOutInterface
{
public:
virtual BOOL Open(LPCTSTR lpszFileName);
virtual BOOL DoWriteFile(LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite);
};
class CWinFileIn : WFIOInfo, WinFileInInterface
{
public:
virtual BOOL Open(LPCTSTR lpszFileName)
{
return TRUE;
}
virtual BOOL DoReadFile(LPVOID lpBuffer, DWORD nNumberOfBytesToRead)
{
return ::ReadFile(m_hFile, lpBuffer, nNumberOfBytesToRead, &m_dwBytes, NULL);
}
};
class CWinFileOut : WFIOInfo, WinFileOutInterface
{
public:
virtual BOOL Open(LPCTSTR lpszFileName)
{
return TRUE;
}
virtual BOOL DoWriteFile(LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite)
{
return ::WriteFile(m_hFile, lpBuffer, nNumberOfBytesToWrite, &m_dwBytes, NULL);
}
};
class CWinFileInOut : WFIOInfo, WinFileInInterface, WinFileOutInterface
{
public:
BOOL Open(LPCTSTR lpszFileName)
{
return TRUE;
}
};
any idea what i'm doing wrong?
|
|
|
|
|
an interface should be purely abstract so put a =0 behind function definitions.
class WinFileInInterface<br />
{<br />
public:<br />
virtual BOOL Open(LPCTSTR lpszFileName) = 0;<br />
virtual BOOL DoReadFile(LPVOID lpBuffer, DWORD nNumberOfBytesToRead) = 0;<br />
};<br />
<br />
class WinFileOutInterface<br />
{<br />
public:<br />
virtual BOOL Open(LPCTSTR lpszFileName) = 0;<br />
virtual BOOL DoWriteFile(LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite) = 0;<br />
};
|
|
|
|
|
When I tried that I got the following errors:
Compiling...
winiotest.cpp
C:\C++\Projects\[Tests]\winiotest\winiotest.cpp(29) : error C2259: 'CWinFileInOut' : cannot instantiate abstract class due to following members:
c:\c++\projects\[tests]\winiotest\cwinfileio.h(109) : see declaration of 'CWinFileInOut'
C:\C++\Projects\[Tests]\winiotest\winiotest.cpp(29) : warning C4259: 'int __thiscall WinFileInInterface::DoReadFile(void *,unsigned long)' : pure virtual function was not defined
c:\c++\projects\[tests]\winiotest\cwinfileio.h(73) : see declaration of 'DoReadFile'
C:\C++\Projects\[Tests]\winiotest\winiotest.cpp(29) : warning C4259: 'int __thiscall WinFileOutInterface::DoWriteFile(const void *,unsigned long)' : pure virtual function was not defined
c:\c++\projects\[tests]\winiotest\cwinfileio.h(80) : see declaration of 'DoWriteFile'
C:\C++\Projects\[Tests]\winiotest\winiotest.cpp(29) : error C2259: 'CWinFileInOut' : cannot instantiate abstract class due to following members:
c:\c++\projects\[tests]\winiotest\cwinfileio.h(109) : see declaration of 'CWinFileInOut'
C:\C++\Projects\[Tests]\winiotest\winiotest.cpp(29) : warning C4259: 'int __thiscall WinFileInInterface::DoReadFile(void *,unsigned long)' : pure virtual function was not defined
c:\c++\projects\[tests]\winiotest\cwinfileio.h(73) : see declaration of 'DoReadFile'
C:\C++\Projects\[Tests]\winiotest\winiotest.cpp(29) : warning C4259: 'int __thiscall WinFileOutInterface::DoWriteFile(const void *,unsigned long)' : pure virtual function was not defined
c:\c++\projects\[tests]\winiotest\cwinfileio.h(80) : see declaration of 'DoWriteFile'
|
|
|
|
|
Why dont u use classname as specifier? like
ObjectInstanceName.Classname::variablename?
|
|
|
|
|
Hello,
As some other user already suggested, you should use virtual base classes (if you want to share among the different types). See Here[^] for more information on virtual inheritance.
Another way to go (IMHO the better way) is to encapsulate some details of your base classes using private inheritance instead of public. Also you need to override some other functions to resolve the ambiguities:
struct WFIOInfo
{ HANDLE m_hFile;
DWORD m_dwBytes;
};
class WinFileInInterface
{
public:
virtual BOOL Open(LPCTSTR lpszFileName);
virtual BOOL DoReadFile(LPVOID lpBuffer, DWORD nNumberOfBytesToRead);
};
class WinFileOutInterface
{
public:
virtual BOOL Open(LPCTSTR lpszFileName);
virtual BOOL DoWriteFile(LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite);
};
class CWinFileIn : private WFIOInfo, public WinFileInInterface
{
public:
virtual BOOL Open(LPCTSTR lpszFileName)
{return TRUE;}
virtual BOOL DoReadFile(LPVOID lpBuffer, DWORD nNumberOfBytesToRead)
{return ::ReadFile(m_hFile, lpBuffer, nNumberOfBytesToRead, &m_dwBytes, NULL);}
};
class CWinFileOut : private WFIOInfo, WinFileOutInterface
{
public:
virtual BOOL Open(LPCTSTR lpszFileName) {return TRUE;}
virtual BOOL DoWriteFile(LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite)
{return ::WriteFile(m_hFile, lpBuffer, nNumberOfBytesToWrite, &m_dwBytes, NULL);}
};
class CWinFileInOut : private: WFIOInfo,
public: WinFileInInterface,
public: WinFileOutInterface
{
public:
BOOL Open(LPCTSTR lpszFileName)
{ return TRUE; }
};
Using the private inheritance, you make the class only visible and accessible to the class that derives from it. Classes which are derived from that class, do not know about the previous privatly inherited classes. This way, you can have multiple names inside different classes.
Hope this helps
Behind every great black man...
... is the police. - Conspiracy brother
Blog[^]
|
|
|
|
|
After looking at this closer it turns out I don't understand how this works. If CWinFileInOut derives just from interfaces, doesn't that mean I have copy the implementations of the interfaces of CWinFileIn and CWinFileOut to CWinFileInOut, which makes inheritance pointless
|
|
|
|
|
There's no such thing as interfaces in C++. These are base classes which define the interfaces. Yes, perhaps this is not what you want, but a virtual base class will have the same problem.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
"base classes which define the interfaces" is what i meant when saying interfaces, sorry for confusing the terms. so, um, sorry if i'm being dense but is what i was originally asking even possible? in the example with the virtual base classes, the derived classes CWinFileIn and CWinFileOut have to implement the virtual functions, and the same virtual functions have to be implemented again in CWinFileInOut, which kinda defeats the purpose of inheritance.
|
|
|
|
|
Yes, that's definately the problem, I doubt what you want to do is possible. You can make a class that is all three class types, but you need to copy a bit of code between the classes to do it.
Christian Graus - Microsoft MVP - C++
|
|
|
|
|
go for virtual base class
|
|
|
|
|
You can place the common elements in a virtual base class.
Tim Smith
I'm going to patent thought. I have yet to see any prior art.
|
|
|
|
|
hi all...I have troubles in accessing and editing the tab control member's attributes. I've followed the codeproject article on making the tab control application(which is creating a new class for example CMyTabCtrl derived from CTabCtrl and inserted with other classes for exmaple CTabOne,CTabTwo,etc). How to access the CTabOne attributes(for example its edit box)? Does anyone can help me?From where I can access to CTabOne attributes?Is it from the Main Dialog Class, CMyTabCtrl, or from the CTabOne directly?Pls help...
|
|
|
|