Avatar billede vaco Nybegynder
23. marts 2003 - 17:30 Der er 12 kommentarer og
1 løsning

MFC: åben en gemt fil med data.

Hej

Det her er første gang jeg prøver at bruge MFC, og sidder meget fast nu.

Jeg har gemt en fil med data indtastet fra mit view, men nu kan jeg ikke åbne filen igen ( jeg får en assertion failure ). Fejlen opstår når jeg prøver at give mit view de data jeg lige har hentet fra den gemte fil.


Jeg har prøvet at følge eksemplet her: http://www.mathcs.sjsu.edu/faculty/beeson/courses/cs130/LectureNotes/22-Serialization/22-Serialization.doc
Avatar billede tam Nybegynder
24. marts 2003 - 01:12 #1
Den assert du får hvad siger den?
Det er lidt svært at prøve at hjælpe gare ved at gætte sig frem...

Når din assert dialogbox kommer op, kan du bare trykke Ctrl+C, så kopierer den alt teksten, så du slipper for at skrive den ;)
Avatar billede vaco Nybegynder
24. marts 2003 - 16:17 #2
---------------------------
Microsoft Visual C++
Sorry det var en Access Violation huskede forkert :-)

---------------------------
Unhandled exception in test.exe: 0xC0000005: Access Violation.
---------------------------

Fejlen opstår ved:

_AFX_INLINE CStringData* CString::GetData() const
her:    { ASSERT(m_pchData != NULL); return ((CStringData*)m_pchData)-1; }
Avatar billede segmose Nybegynder
24. marts 2003 - 16:33 #3
En null pointer, kalder du ikke med initialiserede data?

prøv at paste mere af din koden her.
Avatar billede vaco Nybegynder
24. marts 2003 - 16:50 #4
Min Cstring bliver initialiseret her ( har single steppet igennem og set at koden bliver kørt! )

CtestView::CtestView()
    : CRecordView(CtestView::IDD)
{
    //{{AFX_DATA_INIT(CtestView)
    ...
    m_Symbol = _T("");
        ...
    //}}AFX_DATA_INIT
}

m_Symbol er public. Og prøves sat her:

void CtestDoc::Serialize(CArchive& ar)
{
    if (ar.IsStoring())
    {
        mp_theView->UpdateData(TRUE);
                ar << mp_theView->m_Symbol;
    }
    else
    {
        ar >> mp_theView->m_Symbol;
    }

    // Calling the base class COleDocument enables serialization
    //  of the container document's COleClientItem objects.
    COleDocument::Serialize(ar);
}
Avatar billede hsloth Novice
24. marts 2003 - 17:01 #5
Er du sikker på at din mp_theView variabel har en værdi (forskellig fra NULL) ?
Avatar billede vaco Nybegynder
24. marts 2003 - 17:16 #6
ja, det er jeg rimelig sikker på.

Når man trykker på 'open' oprettes der et obj af view-klassen, og i funktionen OnInitialUpdate() sættes pointeren i doc-klassen.

CtestDoc *pDoc = GetDocument();
    pDoc->mp_theView = this;
Avatar billede hsloth Novice
24. marts 2003 - 20:04 #7
Prøv at sætte et breakpoint i starten af din Serialize() metode og check at mp_theView har en fornuftig værdi.
Avatar billede segmose Nybegynder
25. marts 2003 - 09:49 #8
Du skriver at "m_Symbol er public", betyder det at mp_theView er af typen CtestView?

dvs.
class CTestView {
public:
CString m_Symbol; // eller lignende
};
CTestView mp_theView;

eller er m_Symbol defineret et sted til.
Avatar billede vaco Nybegynder
25. marts 2003 - 10:32 #9
m_Symbol er lavet public i klassen CTestView:

public:
    //{{AFX_DATA(CTestView)
    enum { IDD = IDD_TEST_FORM };
        ...
    CString    m_Symbol;
        ...
    //}}AFX_DATA
Avatar billede jpk Nybegynder
26. marts 2003 - 08:37 #10
Altså det kunne jo tyde på at dit view ikke er ordentlig oprettet når du indlæser dine data, men det er da også en noget sjov måde at gøre det på!

Hvorfor i alverden har du dine data i view'et? Det er jo netop dét dokumentet er til!

Altså, data i doc:
if(ar.IsStoring())
{
  ar << m_Symbol;
}
else
{
  ar >> m_Symbol;
}

og når så du vil vise dine data i view'et, bruger du GetDocument(), fx:
void CYourView::OnDraw(CDC* pDC)
{
    CtestDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // show pDoc->m_Symbol;
}
Avatar billede vaco Nybegynder
26. marts 2003 - 16:06 #11
Hmm, som jeg sagde til at starte med er jeg ny til MFC...
Men jeg mente at jeg havde prøvet din (jpk) metode, uden større held.
Avatar billede vaco Nybegynder
26. marts 2003 - 16:07 #12
ups :-) fortsætter lige her...

Det virker nu, så man skulle åbenbart bare prøve en gang mere...

Skriv et svar så skal jeg give dig dine point :->
Avatar billede jpk Nybegynder
27. marts 2003 - 08:43 #13
Godt du fik det til at virke...

Doc/view-arkitekturens fornemste opgave er, at adskille data og præsentation.
Hvis du overholder dette, kan du skifte dit view ud, uden det får indflydelse på dine data (document). Du kan fx også tilføje flere views, så du kan præsentere de samme data på forskellige måder.
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