|
Hi guys
I'm trying to understand how it works serialization in Doc/View architecture
I have a view with some controls associated to booleans.
When I do a Open File I want to read the booleans from the file and then update the view.
I've tried to Serialize in Doc and then Update in OnUpdate in View but the controls are not refreshed. What is the correct order to do these things?
I'm doing something wrong?
Best Regards
Dr.Pi
|
|
|
|
|
Do you have something like:
class CMyDoc : public CDocument
{
public:
bool bValue1;
bool bValue2;
};
void CMyDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar << bValue1;
ar << bValue2;
}
else
{
ar >> bValue1;
ar >> bValue2;
}
}
void CMyView::OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint )
{
CMyDoc *pDoc;
pDoc = GetDocument();
m_xbReady.SetCheck(true == pDoc->bValue1);
m_xbMixed.SetCheck(true == pDoc->bValue2);
}
Five birds are sitting on a fence.
Three of them decide to fly off.
How many are left?
|
|
|
|
|
Hi David
If I have to serialize a CArray variable how I have to implement in Serialize?
Best Regards
Dr.Pi
|
|
|
|
|
void CMyDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
}
else
{
}
m_arr.Serialize(ar);
}
Five birds are sitting on a fence.
Three of them decide to fly off.
How many are left?
|
|
|
|
|
I am not sure the application, but let me try to give an example from what I've done.
First you must open the file where you serialized the data, here is a sample serialize code...
I would advice that if these are settings for the view and in no way have anything to do with the document data, then do not store the values in your document. Rather create a new file called ViewSettings.dat and save the values in that. Lets say ViewSettings.dat is in your c:\\Program Files\\Program folder. Where Program is your program In the sample below we will assume that bEnableWindow is the variable you wish to serialize.
in CView's OnInitialUpdate call the serialize function passing an archive of the file.. Here's how to do it.
void CView::OnInitialUpdate()
{
CView::OnInitialUpdate();
try
{
CFile fileViewSettings( _T("C:\\Program Files\\Program\\ViewSettings.dat"),
CFile::modeRead );
CArchive arViewSettings( &fileViewSettings, CArchive::load );
Serialize( arViewSettings );
}
catch (CFileException* e)
{
// if the file has not yet been created then initialize default values //
// and also create the file to where the values will be serialized.
e->Delete();
bShowVisible = TRUE;
CFile file( _T("C:\\Program Files\\EGames\\Settings\\FrameSettings.dat"), CFile::modeCreate);
// At this point we should either have set a default value for bShowVisible if the file
// had not yet been created, or if it had then we have successfully loaded it in.
myButton.EnableWindow( bEnableWindow );
}
void CView::Serialize( CArchive& ar )
{
if( ar.IsStoring() )
{
/* Save your variables
example:
ar << bEnableWindow ; Where bEnableWindow is the boolean
for enabling your control.
*/
}
else
{
/* Else load in your variable
example:
ar >> bEnableWindow ;
*/
}
}
I hope this gives you an idea! Questions?? my email is nateinstein@hotmail.com I've been doing doc view for the past year religiously and have 3 serialize functions for just one class lol.
Nathan Smith - The Essence of Art in any design is not the medium in which it is made, but the creativity of the finished product.
|
|
|
|
|
Sorry accidentally forgot to edit a paste I made, in the mode create file the path should be..
Program Files\\Program\\ViewSettings.dat"), CFile::modeCreate
Nathan Smith - The Essence of Art in any design is not the medium in which it is made, but the creativity of the finished product.
|
|
|
|
|
Serialization is evil. I'd recommend for simple stuff, just use a plain old text file or INI file. You can use CStdioFile to read in and write text files pretty easily.
If your nose runs and your feet smell, then you're built upside down.
|
|
|
|
|
|
Hi !
I have a constant which I want to use in many classes.
What I think I should do is put this constant in a header file, and include this header file in each cpp file of the classes which will be using this constant.
But, if I declare my constant like this :
const char* MY_STRING = "My string";
the linker complains that MY_STRING is already defined somewhere.
If I declare it that way :
const char MY_STRING[] = "My string";
Why is the first way not working ?
Thanks !
Jerome
|
|
|
|
|
Have a look at the extern keyword.
_outp(0x64, 0xAD);
and
__asm mov al, 0xAD __asm out 0x64, al
do the same... but what do they do??
(doesn't work on NT)
|
|
|
|
|
|
How about just
#define MY_STRING _T("My string")
It annoys purists, but it works
Joe Woodbury
When all else fails, there's always delusion.
- Conan O'Brien
|
|
|
|
|
I want to use accelerator keys in my modeless dialog, but PreTranslateMessage is not called. Anyone know how to solve this?
|
|
|
|
|
Interesting.
What keys did you map?
Kuphryn
|
|
|
|
|
At the moment just Ctrl-F. But I don't see why that matters.
For some reason PreTranslateMessage is not called, so the TranslateAccelerator method is not called, with as result that non of my accelerator keys work.
|
|
|
|
|
I've seen this question asked here before, although I don't remember the answer. I suggest you do a Search for it.
Regards,
Alvaro
Can I ask you a question?
|
|
|
|
|
I found a similar post, but still don't know how to do this. I can't imagine I have to make a seperate message loop to handle accelerator keys, like the previous post suguests.
|
|
|
|
|
In the mdi project I could set cx and cy in the precreate function of the mainframe. But in the dialog based proj, how do I set the initial size of my dialog?
Thanks,
ns
|
|
|
|
|
One solution is inside OnInitDialog().
Kuphryn
|
|
|
|
|
Thanks. I used MoveWIndow because I couldnt decide what parameter 1 of SetWindowPos should be..
Thanks,
ns
|
|
|
|
|
|
ns wrote:
I couldnt decide what parameter 1 of SetWindowPos should be
NULL , and use the SWP_NOZORDER flag in the nFlags parameter
Sonork 100.11743 Chicken Little
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
Within you lies the power for good - Use it!
|
|
|
|
|
ns wrote:
But in the dialog based proj, how do I set the initial size of my dialog?
At design time, in the resource editor.
Five birds are sitting on a fence.
Three of them decide to fly off.
How many are left?
|
|
|
|
|
|
I have a CListCtrl (report view) with 2 columns. Once the list is populated with items, I want the user to be able to edit the information found in the second column. I have it set up so that they can only select one row at a time. Is there some style or state that I can set which will allow a user to do this? (I know it's possible to allow editing of the information in the 1st column, but I havn't yet been able to figure out how to allow editing of the 2nd column, but NOT the 1st column).
|
|
|
|