| Autor |
Nachricht |
Problemcaster
Unregistrierter
|
Problemcaster Unregistrierter
12:15:59 30.08.2010 Titel: |
Problem mit static_downcast |
Zitieren |
In meinem Mainframe muss ich auf die Dokumentenklasse zugreifen. Ich hab das wie folgt realisiert:
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
TRACE(_T("CMainFrame::OnCreate\n"));
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Symbolleiste konnte nicht erstellt werden\n");
return -1; // Fehler bei Erstellung
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Statusleiste konnte nicht erstellt werden\n");
return -1; // Fehler bei Erstellung
}
// TODO: Löschen Sie diese drei Zeilen, wenn Sie nicht möchten, dass die Systemleiste andockbar ist
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
CMyDoc* pDocument1=STATIC_DOWNCAST(CMyDoc,GetActiveDocument());
ASSERT(pDocument1); //->hier knallt's
return 0;
}
| |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
TRACE(_T("CMainFrame::OnCreate\n"));
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Symbolleiste konnte nicht erstellt werden\n");
return -1; // Fehler bei Erstellung
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Statusleiste konnte nicht erstellt werden\n");
return -1; // Fehler bei Erstellung
}
// TODO: Löschen Sie diese drei Zeilen, wenn Sie nicht möchten, dass die Systemleiste andockbar ist
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
CMyDoc* pDocument1=STATIC_DOWNCAST(CMyDoc,GetActiveDocument());
ASSERT(pDocument1); //->hier knallt's
return 0;
}
| |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
TRACE(_T("CMainFrame::OnCreate\n"));
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Symbolleiste konnte nicht erstellt werden\n");
return -1; // Fehler bei Erstellung
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Statusleiste konnte nicht erstellt werden\n");
return -1; // Fehler bei Erstellung
}
// TODO: Löschen Sie diese drei Zeilen, wenn Sie nicht möchten, dass die Systemleiste andockbar ist
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
CMyDoc* pDocument1=STATIC_DOWNCAST(CMyDoc,GetActiveDocument());
ASSERT(pDocument1); //->hier knallt's
return 0;
}
| |
In einem anderen Beispiel geht das irgendwie, nur hier nicht. Was mach ich da falsch? |
|
|
|
 |
Martin Richter
Moderator
Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13137
|
Martin Richter Moderator
08:04:03 31.08.2010 Titel: |
|
Zitieren |
Wenn das Mainframne erzeugt wird ist IMHO noch kein Document vorhanden!
Wieso benötigst Du im MainFRame das Dolument?
Das passt überhaupt nicht in das Doc/View Konzept. |
_________________ Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
|
|
 |
Problemcaster
Unregistrierter
|
Problemcaster Unregistrierter
09:18:51 31.08.2010 Titel: |
|
Zitieren |
Der Konstruktor des Doc wird vor dem des Mainframes aufgerufen. Im Doc liegen Daten, die in der Statuszeile des Mainframes angezeigt werden sollen. Wieso soll das gegen Doc/View verstoßen? GetActiveDocument liefert ja auch einen Zeiger aufs Doc, nur STATIC_DOWNCAST übergibt NULL |
|
|
|
 |
David_pb
Mitglied
Benutzerprofil
Anmeldungsdatum: 09.10.2005
Beiträge: 1999
|
David_pb Mitglied
10:33:56 31.08.2010 Titel: |
|
Zitieren |
| Problemcaster schrieb: | | Der Konstruktor des Doc wird vor dem des Mainframes aufgerufen. Im Doc liegen Daten, die in der Statuszeile des Mainframes angezeigt werden sollen. Wieso soll das gegen Doc/View verstoßen? GetActiveDocument liefert ja auch einen Zeiger aufs Doc, nur STATIC_DOWNCAST übergibt NULL |
Wann welcher Konstruktor aufgerufen wird ist vollkommen egal. Solang keine View aktiv gesetzt wurde, für deinen Frame, bekommst du von GetActiveDocument() immer NULL geliefert. |
|
|
|
 |
Martin Richter
Moderator
Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13137
|
Martin Richter Moderator
11:14:57 31.08.2010 Titel: |
|
Zitieren |
| Problemcaster schrieb: | | Wieso soll das gegen Doc/View verstoßen? |
Ein Frame braucht von einem Doc nichts zu wissen!
Da ist der Bruch! Warum sollte das Frame überhaupt etwas mit dem Doc zu tun haben sollen? |
_________________ Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
|
|
 |
Problemcaster
Unregistrierter
|
Problemcaster Unregistrierter
15:11:53 31.08.2010 Titel: |
|
Zitieren |
| David_pb schrieb: | | Wann welcher Konstruktor aufgerufen wird ist vollkommen egal. Solang keine View aktiv gesetzt wurde, für deinen Frame, bekommst du von GetActiveDocument() immer NULL geliefert. |
Eben nicht. GetActiveDocument gibt ja was ungleich NULL zurück, das Problem besteht beim Ausführen von STATIC_DOWNCAST. Das ist das, was ich nicht verstehe.
| Martin Richter schrieb: | Ein Frame braucht von einem Doc nichts zu wissen!
Da ist der Bruch! Warum sollte das Frame überhaupt etwas mit dem Doc zu tun haben sollen? |
Ich erstelle eine Messsoftware. Der Wert zweier Messeingänge werden über einen Workerthread abgerufen und in einer Variablen im Doc gespeichert. Jetzt soll in der Statuszeile, die meines Wissens ja Bestandteil vom Mainframe ist, dieser Wert angezeigt werden. Dazu soll der Wert der Variablen aus dem Dco gelesen und dort reingeschrieben werden. Das Konstrukt gibts schon, da ja dort auch die Threadsynchronisation realisiert wird. Wenn der Thread mit Schreiben fertig ist bekommt das Mainframe eine Nachricht, damit es die Werte aktualisieren soll. Hast du einen Vorschlag wie ich es anders machen soll? |
|
|
|
 |
David_pb
Mitglied
Benutzerprofil
Anmeldungsdatum: 09.10.2005
Beiträge: 1999
|
David_pb Mitglied
15:26:59 31.08.2010 Titel: |
|
Zitieren |
Was liefert denn GetActiveDocument()? Ggf kannst du ja mal die Runtimeclass bestimmen. |
|
|
|
 |
Problemcaster
Unregistrierter
|
Problemcaster Unregistrierter
16:22:39 31.08.2010 Titel: |
|
Zitieren |
GetActiveDocument liefert mir eine Speicheradresse. Aber beim Aufruf von GetActiveDocument()->IsKindOf(RUNTIME_CLASS( CMyDoc )) kracht er auch an die Wand. |
|
|
|
 |
Martin Richter
Moderator
Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13137
|
Martin Richter Moderator
16:54:35 31.08.2010 Titel: |
|
Zitieren |
Lass das Doc eine Nachricht an AfxGetMainWnd senden...
Ich seheda kein Problem. Keine Klasse muss in diesem Fall was voneinander wissen... |
_________________ Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
|
|
 |
Problemcaster
Unregistrierter
|
Problemcaster Unregistrierter
07:17:02 01.09.2010 Titel: |
|
Zitieren |
| Martin Richter schrieb: | Lass das Doc eine Nachricht an AfxGetMainWnd senden...
Ich seheda kein Problem. Keine Klasse muss in diesem Fall was voneinander wissen... |
Du meinst also mit Sendmessage/Postmessage das Mainframe informieren und als Parameter den Messwert übergeben? |
|
|
|
 |