Preventing more than one doc. from opening in MDI
BLR CSG -- T_SAMAL_C1@blrv1.verifone.com
Wednesday, September 18, 1996
Environment : VC4.0 , Win95
Hi,
I have an app that uses multiple document templates. One of these
templates shouldn't have more than one document open.
My question is if i can prevent a document from being opened if a document
of that type is already open.
I've currently done it by having a class member variable
static int XDoc::IsOpen, and incrementing this var in XDoc::OnOpenDocument()
and decrementing it in XDoc::OnCloseDocument().
If the member is 0 I return FALSE in OnOpenDocument(). I can't use a simple
BOOL type because OnCloseDocument() gets called even if i return FALSE in
OnOpenDocument().
I feel there must be a better (hopefully more standard) way of doing
this.
Any suggestions??
Thanks/Samal.
Verifone, Bangalore.
Chet Murphy -- cmurphy@modelworks.com
Friday, September 20, 1996
[Mini-digest: 2 responses]
> Environment : VC4.0 , Win95
> Hi,
> I have an app that uses multiple document templates. One of these
> templates shouldn't have more than one document open.
> My question is if i can prevent a document from being opened if a document
> of that type is already open.
> I've currently done it by having a class member variable
> static int XDoc::IsOpen, and incrementing this var in XDoc::OnOpenDocument()
> and decrementing it in XDoc::OnCloseDocument().
> If the member is 0 I return FALSE in OnOpenDocument(). I can't use a simple
> BOOL type because OnCloseDocument() gets called even if i return FALSE in
> OnOpenDocument().
> I feel there must be a better (hopefully more standard) way of doing
> this.
I solved this problem by creating a new CDocTemplate using code like the
following:
CDocument* CWorkspaceTemplate::OpenDocumentFile(LPCTSTR lpszPathName, BOOL
bMakeVisible)
{
...
if (m_WorkspaceDoc != NULL)
{
// already have a document - close it
CString path = m_WorkspaceDoc->GetPathName();
ASSERT(path.IsEmpty() == FALSE);
m_WorkspaceDoc->OnSaveDocument(path);
theApp.CloseAllUserDocuments();
CloseAllDocuments(FALSE);
gProjectPanel->CloseAllViews();
}
...
}
to prevent more than one document to being opened at a time. Then I just
create the template in my InitInstance() along with all my other templates:
// add workspace template
pWorkspaceTemplate = new CWorkspaceTemplate(IDR_WORKSPACETYPE,
RUNTIME_CLASS(CWorkspaceDoc),
NULL,
NULL);
AddDocTemplate(pWorkspaceTemplate);
Chet Murphy
ModelWorks Software - Editors for Java, JavaScript, VBScript, HTML and VRML
cmurphy@modelworks.com
http://www.modelworks.com/express
-----From: "David Holliday"
I have no idea if this is the best way to do this, but it's how I do it.
Keep a varriable m_pYourWnd in CYourApp. In the constructor for CYourWnd
set m_pYourWnd to this (GetCYourApp()->SetpYourWnd(this);). In the
destructor set m_pYourWnd to NULL (GetCYourApp()->SetpYourWnd(NULL);). Now
you can test to see if a window for your Doc is open.
//**************************
class CYourApp : public CWinApp
{
...
CYourWnd* m_ pYourWnd ; // points Your window
...
void SetpYourWnd(CYourWnd* pYourWnd) {m_ pYourWnd = pYourWnd;}
...
private:
// member pointers to document templates
CMultiDocTemplate *m_pMDITemplateYour;
public:
// access functions to member pointers to document templates
CMultiDocTemplate* GetMDITemplateYour()const {return m_pMDITemplateYour;}
...
};
//************************
CYourApp::CYourApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
...
m_pYourDocWnd = NULL; // no window (or Doc) is open
...
}
//******************************
BOOL CYourApp::InitInstance()
{
...
AddDocTemplate(m_pMDITemplateYour = new CMultiDocTemplate(IDR_MAINFRAME,
RUNTIME_CLASS(CYourDoc),
RUNTIME_CLASS(CYourWnd
RUNTIME_CLASS(CYourView)));
...
return TRUE;
}
//************************************
void CYourApp::OnOpenYourDoc()
{
// TODO: Add your command handler code here
if(!m_pYourWnd) // the window is not open
{
GetMDITemplateYour()->OpenDocumentFile(NULL);
}
else // the Button window is open
{
m_pYourWnd->BringWindowToTop();
}
}
//********************
CYourWnd:: CYourWnd()
{
GetCYourApp()->SetpYourWnd(this);
}
//*********************
CYourWnd::~ CYourWnd()
{
GetCYourApp()->SetpYourWnd(NULL);
}
Hope this helps,
--David
rkumar@mail.cswl.com
Tuesday, September 24, 1996
Every doc template maintains a list of documents opened by it.u can
traverse the list by using GetFirstDocPosition and GetNextDoc
functions. Do GetFirstDocPosition if it returns NULL open the document
otherwise don't.
For this u may have to maintain a pointer to the doc template in the
app class.
Ratan.
rkumar@cswl.com
______________________________ Reply Separator _________________________________
Subject: Preventing more than one doc. from opening in MDI
Author: mfc-l@netcom.com at internet
Date: 20/09/96 11:57 PM
Environment : VC4.0 , Win95
Hi,
I have an app that uses multiple document templates. One of these
templates shouldn't have more than one document open.
My question is if i can prevent a document from being opened if a document
of that type is already open.
I've currently done it by having a class member variable
static int XDoc::IsOpen, and incrementing this var in XDoc::OnOpenDocument()
and decrementing it in XDoc::OnCloseDocument().
If the member is 0 I return FALSE in OnOpenDocument(). I can't use a simple
BOOL type because OnCloseDocument() gets called even if i return FALSE in
OnOpenDocument().
I feel there must be a better (hopefully more standard) way of doing
this.
Any suggestions??
Thanks/Samal.
Verifone, Bangalore.
John Bundgaard -- johnb@image.dk
Tuesday, September 24, 1996
When you register the documenttype in your app-object, the store the
CDocTemplate handle returned, in say m_pDocTemplate.
You can the determine if a document is open by calling
m_pDocTemplate->GetFirstDocPosition().
If the returned value is NULL, the there is no document open.
John Bundgaard
johnb@image.dk
----------
> I have an app that uses multiple document templates. One of these
> templates shouldn't have more than one document open.
> My question is if i can prevent a document from being opened if a
document
> of that type is already open.
| Вернуться в корень Архива
|