Avatar billede garlan Nybegynder
05. april 2007 - 00:51 Der er 16 kommentarer

MFC Application

Hey

Jeg er igang med et MFC application med multiple documents.

Jeg vil gerne kunne skifte mellem forms. har fundet et kode eksempel der kan gøre dette.
Nu er det bare at funktionen der styrer dette, kun virker hvis den ligger i whateverDoc.cpp filen.

jeg har oprettet et event til menuen, men funktionen skal erklæres i whateverApp filen.. ellers er menupunktet grayed.

Problemet er at jeg kan ikke kalde funktion der ligger i whateverDoc klassen.. compileren melder:
error C2352: 'CPowerlynxFieldTestAdminDoc::SwitchToView' : illegal call of non-static member function
Avatar billede arne_v Ekspert
05. april 2007 - 00:53 #1
fejl meddelsen siger at du skal kalde SwitchToView på en instans af klassen
Avatar billede jpk Nybegynder
06. april 2007 - 10:07 #2
Arne har ret, det må være noget lign.:

getDocument()->SwitchToView(...);
Avatar billede garlan Nybegynder
08. april 2007 - 13:25 #3
GetDocument er jo en pointer til CDocument, der er min funktion ikke erklæret.

har prøvet med følgende:

CPowerlynxFieldTestAdminDoc* p;
p->SwitchToView(pNewViewClass);

men når jeg eksikverer programmet får jeg en runtime check error.. og variablen p bliver brugt uden at være initialiseret..
Avatar billede jpk Nybegynder
08. april 2007 - 16:56 #4
Du skal type-cast'e pointeren til din egen type.

CPowerlynxFieldTestAdminDoc* p = (CPowerlynxFieldTestAdminDoc*)GetDocument();
p->SwitchToView(pNewViewClass);
Avatar billede garlan Nybegynder
08. april 2007 - 19:01 #5
Det har jeg prøvet:
gør følgende:

CDocument* GetDocument();
CPowerlynxFieldTestAdminDoc* p = (CPowerlynxFieldTestAdminDoc*)GetDocument();
p->SwitchToView(pNewViewClass);

men får disse fejl
error LNK2001:
fatal error LNK1120:
Avatar billede jpk Nybegynder
09. april 2007 - 08:23 #6
Den første linie skal ikke med.

Du må få nogle andre fejl før disse..?
Avatar billede garlan Nybegynder
09. april 2007 - 10:46 #7
hvis jeg fjerner den første linie får jeg:
error C3861: 'GetDocument': identifier not found
Avatar billede jpk Nybegynder
09. april 2007 - 18:57 #8
Hmm, prøv dette for at få en pointer til dit dokument:

CPowerlynxFieldTestAdminDoc* p = (CPowerlynxFieldTestAdminDoc*)AfxGetMainWnd()->GetActiveDocument();
Avatar billede garlan Nybegynder
09. april 2007 - 20:54 #9
Der findes ikke noget der hedder GatActiveDocument under AfxGetMainWnd.

Tror ikke at det er kaldet til funktionen SwitchToView der crasher applikationen.
Har testet kaldet ved at udkommentere al kode i funktionen.

Her er Funktionen.

BOOL CPowerlynxFieldTestAdminDoc::SwitchToView(CRuntimeClass* pNewViewClass)
{
  CMDIFrameWnd* pMainWnd = (CMDIFrameWnd*)AfxGetMainWnd();
  // Get the active MDI child window.
  CMDIChildWnd* pChild = (CMDIChildWnd*)pMainWnd->MDIGetActive();
  // Get the active view attached to the active MDI child window.
  CView* pOldActiveView = pChild->GetActiveView();
  // If we're already displaying this kind of view, no need to go further.
  if (pOldActiveView->IsKindOf(pNewViewClass))
    return TRUE;
 
  // Set flag so that document will not be deleted when view is destroyed.
  BOOL bAutoDelete = m_bAutoDelete;
  m_bAutoDelete = FALSE;
  // Delete existing view
  pOldActiveView->DestroyWindow();
  // restore flag
  m_bAutoDelete = bAutoDelete;
 
  // Create new view.
  CView* pNewView = (CView *)pNewViewClass->CreateObject();
  if (pNewView == NULL)
  {

    TRACE1("Warning: Dynamic create of view type %Fs failed\n",pNewViewClass->m_lpszClassName);
    return FALSE;
  }

  // Draw new view.
  CCreateContext context;
  context.m_pNewViewClass = pNewViewClass;
  context.m_pCurrentDoc = this;
  context.m_pNewDocTemplate = NULL;
  context.m_pLastView = NULL;
  context.m_pCurrentFrame = pChild;
  if (!pNewView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0),
        pChild, AFX_IDW_PANE_FIRST, &context))
  {
    TRACE0("Warning: couldn't create view for frame\n");
    delete pNewView;
    return FALSE;
  }
 
  pNewView->SendMessage(WM_INITIALUPDATE, 0, 0); // WM_INITIALUPDATE is defined in afxpriv.h
  pChild->RecalcLayout();
  pNewView->UpdateWindow();
  pChild->SetActiveView(pNewView); 
  return TRUE;

}
Avatar billede jpk Nybegynder
10. april 2007 - 08:03 #10
Okay, ifølge din kode, er main vinduet et CMDIFrameWnd, som arver fra CFrameWnd, altså burde dette virke:

CFrameWnd* pMainWnd = (CFrameWnd*)AfxGetMainWnd();
CPowerlynxFieldTestAdminDoc* p = (CPowerlynxFieldTestAdminDoc*)pMainWnd->GetActiveDocument();
p->SwitchToView(pNewViewClass);


Men det kunne diskuteres om funktionen SwitchToView ikke skulle ligge i whateverApp filen, i stedet for whateverDoc. Doc=data, App=funktionalitet.
Avatar billede garlan Nybegynder
11. april 2007 - 20:05 #11
Det virkede.. men applikation crasher når jeg prøver at køre funktionen.
hvis jeg debugger stopper den ved linien BOOL bAutoDelete = m_bAutoDelete; i SwitchToView funktionen.. hvad det kunne skyldes´ved jeg virkelige ikke..

Havde i starten osse placeret funktioen i App men da compileren brokkede sig over kaldet context.m_pCurrentDoc = this;
blev løsningen at den skulle ligge i Doc.
Avatar billede jpk Nybegynder
12. april 2007 - 08:26 #12
Dt må være en anden linie der egentlig får det til at fejle...
Hvilken version af VC++ bruger du?
Jeg kan evt. prøve at køre koden hos mig..?
Avatar billede garlan Nybegynder
12. april 2007 - 17:40 #13
Bruger .Net 2005 pro

jeg prøvede at debugge og det var ved denne linie den stoppede..
Avatar billede jpk Nybegynder
13. april 2007 - 08:17 #14
Jeg har desværre kun 2003'eren installeret...
Avatar billede garlan Nybegynder
13. april 2007 - 17:03 #15
Tror ikke det gør det store.. Det er stadig de samme klasser MFC aplicationen nedarver fra. så koden burde virke på samme måde.
Avatar billede jpk Nybegynder
13. april 2007 - 19:52 #16
Jo, men i så fald skulle du sende mig hele projektet og jeg er ikke sikker på at v2003 kan læse projektfiler fra v2005...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester