Zum Inhalt springen

MDI Wertübergabe


jasso

Empfohlene Beiträge

tachtach

ich hab wiedermal ein kleines Problem mit meinem MDI-Fenster in VS6.0.

Es muss doch möglich sein Werte von der CMainFrame (von CMDIFrameWnd abgeleitet) in die untergeordneten Fenster (von CFormView abgeleitet) zu übergeben ohne dabei globale Variablen verwenden zu müssen.

Bis jetzt habe ich das ganze mit globalen Variablen geregelt. Das problem an der sache ist dass ich Fehler beim includieren erzeuge, und das nicht gerade wenige :( (er kompilliert mir komischerweise trotzdem fertig).

Ein weitere problem mit den globalen Variablen (eigentlich das Hauptproblem) is dass er mir, wenn ich das Prog schließe folgenden Fehler bringt:

File: dbgheap.c

Line: 1017

Expression: _BLOCK_TYPE_IS_VAILD(pHead->nBlockUse)

(kommt nicht so gut wenn ich des drin lasse!!!)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du kannst mit CWinApp::GetFirstDocTemplatePosition/GetNextDocTemplate durch alle Dokument-Templates der Anwendung gehen, dann mit CDocTemplate::GetFirstDocPosition/GetNextDoc durch alle Dokumente dieses Templates, und schließlich mit CDocument::GetFirstViewPosition/GetNextView durch alle Views dieses Dokuments gehen.

Du kommst also mit einer dreifach verschachtelten Schleife an alle Views. Wenn du nur ein Template hast, kannst du die äußerste weglassen.

Original geschrieben von jasso

File: dbgheap.c

Line: 1017

Expression: _BLOCK_TYPE_IS_VAILD(pHead->nBlockUse)

Das ist ein ernstes Problem, und liegt nicht allein daran, dass du globale Variablen verwendest. Vermutlich schreibst du irgendwo über Arraygrenzen hinweg. Such nach Arrays, die auf dem Heap/Freispeicher angelegt werden (mit new/malloc) und prüfe genau, ob du nicht über den allokierten Bereich hinaus schreibst.
Link zu diesem Kommentar
Auf anderen Seiten teilen

:confused: Verwirrt!!!:confused:

irgendwie habe ich das Gefühl dass mir der Aufbau einer MDI-Anwendung nicht ganz so klar is wie ich bisher gedacht habe.

ok.

ich habe alle stufen durchlaufen

CWinApp::GetFirstDocTemplatePosition/GetNextDocTemplate

CDocTemplate::GetFirstDocPosition/GetNextDoc

CDocument::GetFirstViewPosition/GetNextView

und erhalte am ende einen CView*. allerdings kann ich diesen nicht in eine meiner von CFormView abgeleiteten klassen konvertieren (was ja meiner meinung nach notwendig ist um auf die Membervariablen zugriff zu haben).

Wiso geht das nicht? wo doch die klassenhirarchie es erlauben müsste:

CWnd --> CView --> CScrollView --> CFormView

Original geschrieben von Klotzkopp

Das ist ein ernstes Problem, und liegt nicht allein daran, dass du globale Variablen verwendest. Vermutlich schreibst du irgendwo über Arraygrenzen hinweg. Such nach Arrays, die auf dem Heap/Freispeicher angelegt werden (mit new/malloc) und prüfe genau, ob du nicht über den allokierten Bereich hinaus schreibst.

Ich verwende im gesamten programm nur einen Array mit fünf Bitmaps drin. Habe ihn mir zwar trotzdem angeschaut aber definitiv keinen Fehler entdeckt. das einzige was ich auf den Heap-Speicher erzeuge sind meine Exception-Klassen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von jasso

und erhalte am ende einen CView*. allerdings kann ich diesen nicht in eine meiner von CFormView abgeleiteten klassen konvertieren (was ja meiner meinung nach notwendig ist um auf die Membervariablen zugriff zu haben).

Wiso geht das nicht?

Wenn du nur eine Viewklasse hast, kannst du den Zeiger einfach mit static_cast umwandeln:

CDeineViewKlasse* p = static_cast<CDeineViewKlasse*>(pZeigerVonGetNextView);
Wenn du mehrere Viewklassen hast, musst du den Typ mit dynamic_cast ermitteln:

CDeineViewKlasse1* p = dynamic_cast<CDeineViewKlasse1*>(pZeigerVonGetNextView);
if(NULL != p) {
// es ist ein CDeineViewKlasse1...
p->MemberFunktion();
}
else {
// andere Viewklassen testen
}[/code]

Damit dynamic_cast funktioniert, musst du in den Projekteinstellungen RTTI aktivieren.

[b]Ich verwende im gesamten programm nur einen Array mit fünf Bitmaps drin. Habe ihn mir zwar trotzdem angeschaut aber definitiv keinen Fehler entdeckt. das einzige was ich auf den Heap-Speicher erzeuge sind meine Exception-Klassen. [/b]
Enthalten die irgendwelche Arrays?

Oder verwendest du selbstgeschriebene DLLs?

Link zu diesem Kommentar
Auf anderen Seiten teilen

:uli die konvertierung schluckt er und kompilliert fertig.

jetzt hab ich allerdings das problem dass er mir bei CDocTemplate::GetFirstDocPosition keinen wert zurückgibt, obwohl ich doch eigentlich ein Document drin haben müsste (Es wird mir ja angezeigt!!!)


CDocTemplate *pTemp;

CDocument *pDoc;

CView *View;

CBenutzereinstellungen *benutzer;

POSITION pos;

if(pos = app->GetFirstDocTemplatePosition())

{

  pTemp = app->GetNextDocTemplate(pos);

  [COLOR=red][COLOR=blue]if[/COLOR](pos = pTemp->GetFirstDocPosition())[/COLOR]

  {

    pDoc = pTemp->GetNextDoc(pos);

    [COLOR=blue]if[/COLOR]((pos = pDoc->GetFirstViewPosition())

    {

      View = pDoc->GetNextView(pos);

      benutzer = [COLOR=blue]static_cast[/COLOR]<CBenutzereinstellungen*>(View);

      benutzer->m_BenutzerID = 1;

    }

  }

  pTemp->OpenDocumentFile(NULL);

}
die View-Klasse wurde auch in der Applikationsklasse sauber eingefügt:

CMultiDocTemplate* pNewDocTemplate = [COLOR=blue]new[/COLOR] CMultiDocTemplate(

  IDR_BENUTZEREINSTELLUNGEN_TMPL,

  RUNTIME_CLASS(CPETDoc),

  RUNTIME_CLASS(CChildFrame),

  RUNTIME_CLASS(CBenutzereinstellungen));

AddDocTemplate(pNewDocTemplate);

Wie kann es sein dass er mir trotzdem kein Dokument findet?

Original geschrieben von Klotzkopp

Trifft das vielleicht auf dich zu?

http://support.microsoft.com/suppor...s/q154/7/44.asp

Also die Fehlermeldung is die selbe. Werd ich mir auf jeden fall zu gemüt führen. DANKE

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...