Zum Inhalt springen

HILFE zu Listenelement.


Filou

Empfohlene Beiträge

Ein verzweifeltes helau!

Ich habe ein Listenelement (CListCtrl) in einen Dialog eingebunden und füllle diese Liste aus einer Datenbank (CDaoRecordSet).

Das füllen der Liste funktioniert ohne Probleme. Beim Anklicken der Einzelnen Einträge soll die Funktion "OnListedbClick" gestartet werden. Das funktioniert aber nur beim ersten Datensatz. Sobald ich die Liste mit anderen Daten fülle und dann doppelt anklicke, bekomme ich die Fehlermeldung:

Nicht abgefangene Ausnahme in Test.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception.

Die Meldung sehe ich in der Ausgabe vom Visual Studio.

Woran kann das liegen? Werde einfach nicht schlau daraus :( :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mal ein bissel Code.

Das ist die Funktion die das Dokument öffnen soll.

Aber soweit kommt es ja gar nicht, dass diese Funktion aufgerufen wird (zumindest beim 2ten

Datensatz nicht:

/////////////////////////////////////////////////////////////////////////////

// Dokument bei Doppelklick öffnen.


void CPatient::OnListedbClick(NMHDR* pNMHDR, LRESULT* pResult) 

{

//	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

	CString csFile;

	m_DBDokumente.m_Pfad;

	CString csAlterPfad;

	CString csBuffer;

	CString csBuffer2;

	CString csNeuerPfad;

	char chBuffer;

	int iCount = 0;


             //Ändert das einfache \ in dem Pfad in ein \\

	csAlterPfad = m_DBDokumente.m_Pfad;

	while(iCount < csAlterPfad.GetLength())

		{

		chBuffer = csAlterPfad.GetAt(iCount);

		int i = csAlterPfad.GetLength();

		if (chBuffer == '\\')

			{

			csBuffer2 = "\\";

			}

		else

			{

			csBuffer2 = "";

			}

		iCount++;

		csBuffer = chBuffer;

		csNeuerPfad = csNeuerPfad + csBuffer + csBuffer2;

		}




	csFile = m_ctrlList.GetItemText(m_ctrlList.GetSelectionMark() ,0);

	ShellExecute( NULL, "open",  csNeuerPfad + csFile, NULL, NULL, SW_NORMAL );

.....

Hier wird zu dem aktuellen Patienten die Dokumente gesucht und in die Liste geschrieben. Das CListCtrl wird sonst an keiner stelle mehr berührt:
/////////////////////////////////////////////////////////////////////////////

// Dokumente zu Patient suchen


bool CPatient::DokumenteSuchen(int iPatNr, CString csDokTyp)

{

	bool bCheck = FALSE;

	int iCount = 0;

	int iCount2 = 0;

	m_DBDokumente.MoveFirst();

	while (iCount <= m_DBDokumente.GetRecordCount())

		{

			if(m_DBDokumente.m_PatNr == iPatNr && m_DBDokumente.m_Typ == csDokTyp)

				{

				bCheck = TRUE;

				iCount++;


				// Eintrag hinzufügen

				m_ctrlList.InsertItem(iCount2,m_DBDokumente.m_DokIDName,NULL);


				//Prüfen ob aktueller eintarg = letzer eintrag in Tabelle

				if (iCount == m_DBDokumente.GetRecordCount())

					{

					break;

					}


				m_DBDokumente.MoveNext();

				iCount2++;


				}

			else

				{

				//Prüfen ob aktueller eintarg = letzer eintrag in Tabelle

				if (iCount == m_DBDokumente.GetRecordCount())

					{

					break;

					}

				m_DBDokumente.MoveNext();

				iCount++;

				}

		}

	if (bCheck == FALSE)

		{

		MessageBox("Es wurde noch kein Dokument dieses Typs zu diesem Patienten hinzugefügt.\nÖffnen Sie den Importassistent zum Hinzufügen neuer Dokumente.","Patientendaten - Dokumente nicht verfügbar",MB_ICONINFORMATION);

		}

	else

		{

		return TRUE;

		}

	return FALSE;

Link zu diesem Kommentar
Auf anderen Seiten teilen

Diese Backslashverdopplung ist IMHO unnötig. Doppelte Backslashes brauchst du nur bei Stringliteralen im Quellcode und ein paar sehr seltenen Sonderfällen. Bei ShellExecute brauchst du sie sicher nicht.

Wenn das Programm weiterläuft, war das eine sogenannte First chance exception. Es trat also eine Ausnahme auf, es gibt aber einen Exception Handler dafür (z.B. einen try-Block). Nur wenn der die Ausnahme nicht behandelt, würde der Debugger das Programm anhalten.

Das muss nicht unbedingt ein Fehler sein. Wenn du dem auf den Grund gehen willst, kannst du unter Debug -> Exceptions (IIRC) einstellen, dass VC bei dieser Art Ausnahme (0xE06D7363) immer anhält. Dann kannst du über den Callstack sehen, wo der Aufruf herkam.

Du könntest auch deinen Code mit Traces spicken, um grob abschätzen zu können, wo die Exception herkommt. Aber die erste Methode ist die bessere.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Lass dir den Callstack (Aufrufliste) anzeigen. Dann kannst du sehen, wo der Aufruf herkam.

Wie meinst Du das? Wie gesagt, in der Aufrufliste steht "KERNEL32! 7c81eb33()". Ich kann mit der rechten Maustaste draufklicken und im Kontextmenü auf "Quellcode anzeigen". aber da passiert nichts.

Alles aus der Aufrufliste:

KERNEL32! 7c81eb33()

MPSHHOOK! 5f80c086()

MPSHHOOK! 5f80b669()

MPSHHOOK! 5f8098d2()

MPSHHOOK! 5f8099ff()

MPSHHOOK! 5f809b08()

SHELL32! 7ca5a63b()

SHELL32! 7ca12c4b()

SHELL32! 7ca12b02()

SHELL32! 7ca118e6()

SHELL32! 7ca1185e()

SHELL32! 7ca117fa()

SHELL32! 7ca50c62()

SHELL32! 7ca50ee9()

CLabel::OnLButtonDown(unsigned int 1, CPoint {x=49 y=11}) line 250 + 30 bytes

CWnd::OnWndMsg(unsigned int 513, unsigned int 1, long 720945, long * 0x0012e898) line 1975

CWnd::WindowProc(unsigned int 513, unsigned int 1, long 720945) line 1596 + 30 bytes

AfxCallWndProc(CWnd * 0x0012f350 {CLabel hWnd=0x00040718}, HWND__ * 0x00040718, unsigned int 513, unsigned int 1, long 720945) line 215 + 26 bytes

AfxWndProc(HWND__ * 0x00040718, unsigned int 513, unsigned int 1, long 720945) line 379

AfxWndProcBase(HWND__ * 0x00040718, unsigned int 513, unsigned int 1, long 720945) line 220 + 21 bytes

USER32! 77d18734()

USER32! 77d18816()

USER32! 77d189cd()

USER32! 77d18a10()

USER32! 77d2e097()

USER32! 77d3c6ab()

CWnd::IsDialogMessageA(tagMSG * 0x00424c68 {msg=0x00000201 wp=0x00000001 lp=0x000b0031}) line 182

CWnd::PreTranslateInput(tagMSG * 0x00424c68 {msg=0x00000201 wp=0x00000001 lp=0x000b0031}) line 3435

CDialog::PreTranslateMessage(tagMSG * 0x00424c68 {msg=0x00000201 wp=0x00000001 lp=0x000b0031}) line 92

CWnd::WalkPreTranslateTree(HWND__ * 0x00060672, tagMSG * 0x00424c68 {msg=0x00000201 wp=0x00000001 lp=0x000b0031}) line 2678 + 18 bytes

CWinThread::PreTranslateMessage(tagMSG * 0x00424c68 {msg=0x00000201 wp=0x00000001 lp=0x000b0031}) line 672 + 18 bytes

CWinThread::PumpMessage() line 848 + 30 bytes

CWnd::RunModalLoop(unsigned long 4) line 3489 + 19 bytes

CDialog::DoModal() line 539 + 12 bytes

CLogIn::OnOK() line 223

_AfxDispatchCmdMsg(CCmdTarget * 0x0012fd20 {CLogIn hWnd=0x00060672}, unsigned int 1, int 0, void (void)* 0x5f402a00 `vcall'(void), void * 0x00000000, unsigned int 12, AFX_CMDHANDLERINFO * 0x00000000) line 88

CCmdTarget::OnCmdMsg(unsigned int 1, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 302 + 39 bytes

CDialog::OnCmdMsg(unsigned int 1, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 97 + 24 bytes

CWnd::OnCommand(unsigned int 1, long 263742) line 2099

CWnd::OnWndMsg(unsigned int 273, unsigned int 1, long 263742, long * 0x0012f794) line 1608 + 28 bytes

CWnd::WindowProc(unsigned int 273, unsigned int 1, long 263742) line 1596 + 30 bytes

AfxCallWndProc(CWnd * 0x0012fd20 {CLogIn hWnd=0x00060672}, HWND__ * 0x00060672, unsigned int 273, unsigned int 1, long 263742) line 215 + 26 bytes

AfxWndProc(HWND__ * 0x00060672, unsigned int 273, unsigned int 1, long 263742) line 379

AfxWndProcBase(HWND__ * 0x00060672, unsigned int 273, unsigned int 1, long 263742) line 220 + 21 bytes

USER32! 77d18734()

USER32! 77d18816()

USER32! 77d1b89b()

USER32! 77d1b903()

COMCTL32! 773c6ff6()

COMCTL32! 773c70d8()

COMCTL32! 773c93dd()

USER32! 77d18734()

USER32! 77d18816()

USER32! 77d189cd()

USER32! 77d18a10()

USER32! 77d2e097()

USER32! 77d3c6ab()

CWnd::IsDialogMessageA(tagMSG * 0x00424c68 {msg=0x00000201 wp=0x00000001 lp=0x000b0031}) line 182

CWnd::PreTranslateInput(tagMSG * 0x00424c68 {msg=0x00000201 wp=0x00000001 lp=0x000b0031}) line 3435

CDialog::PreTranslateMessage(tagMSG * 0x00424c68 {msg=0x00000201 wp=0x00000001 lp=0x000b0031}) line 92

CWnd::WalkPreTranslateTree(HWND__ * 0x00060672, tagMSG * 0x00424c68 {msg=0x00000201 wp=0x00000001 lp=0x000b0031}) line 2678 + 18 bytes

CWinThread::PreTranslateMessage(tagMSG * 0x00424c68 {msg=0x00000201 wp=0x00000001 lp=0x000b0031}) line 672 + 18 bytes

CWinThread::PumpMessage() line 848 + 30 bytes

CWnd::RunModalLoop(unsigned long 4) line 3489 + 19 bytes

CDialog::DoModal() line 539 + 12 bytes

CPsyProApp::InitInstance() line 81 + 11 bytes

AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00151f17, int 1) line 39 + 11 bytes

WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00151f17, int 1) line 30

WinMainCRTStartup() line 330 + 54 bytes

KERNEL32! 7c816d4f()

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich hätte einfach mal nen Haltepunkt in die Funktion gesetzt die aufgerufen wird wenn du nen Doppelklick machst und dann geguckt wo genau die Exception auftritt...

Das Problem ist, dass die Funktion "OnListedbClick" ja gar nicht aufgerufen wird. Das ist ja eine MFC Klasse und ich weiß ja nicht wie das CListCtrl aufgebaut ist. Es wird wohl irgendwie die Maustaste abfangen und gucken auf welche Spalte geklickt wurde und dann in die Funktion springen. Aber wie MS das genau gemacht hat, weiß ich doch net.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein hab ich nicht.

aber vielleicht ist es normal das dieser Fehler auftritt. Immerhin hätte er es ja nicht gemeldet wenn ich es nicht in die Exeptions eingetragen hätte. Vielleicht hat das gar nix mit meinem Steuerelemt Probelm zu tun.

hab gesehen das es nämlich auch in anderen Dialogen auftritt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein hab ich nicht.

aber vielleicht ist es normal das dieser Fehler auftritt. Immerhin hätte er es ja nicht gemeldet wenn ich es nicht in die Exeptions eingetragen hätte. Vielleicht hat das gar nix mit meinem Steuerelemt Probelm zu tun.

hab gesehen das es nämlich auch in anderen Dialogen auftritt.

Es ist niemals normal das ein Fehler auftritt und auch niemals ok ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstellst du deinen "Hauptdialog" in CLogIn::OnOK? Falls ja, nimm das bitte mal da raus und stell es hinter den Aufruf von DoModal der CLogIn-Instanz, das sollte in CPsyProApp::InitInstance passieren.

Ähm, ja das ist schon so. Die CLogin ist ein Anmeldedialog. Man klickt auf Anmelden und der Hauptdialog wird geöffnet.

Soll ich jetzt das " CMainDlg Main; Main.DoModal();" in die Funktion "CPsyProApp::CPsyProApp()" kopieren? Dann wird es doch nicht mehr geöffnet wenn ich den "Anmelden" Button drücke.

Glaub ich habe nicht ganz verstanden was Du meinst. *schäm*

Link zu diesem Kommentar
Auf anderen Seiten teilen

Soll ich jetzt das " CMainDlg Main; Main.DoModal();" in die Funktion "CPsyProApp::CPsyProApp()" kopieren?

Nein, in CPsyProApp::InitInstance.

Dein Design ist, sagen wir, ungewöhnlich. Dein Login-Dialog "besitzt" deinen Hauptdialog. Die Hauptdialoginstanz "lebt" in einer Methode deiner Logindialogklasse.

Eigentlich sollte der Logindialog dem Hauptdialog vorgeschaltet sein. Der Logindialog kann über EndDialog oder eine Membervariable dem Aufrufer von DoModal signalisieren, ob das Login erfolgreich war. Möglich wäre auch, dass der Logindialog gar nicht selbst prüft, sondern nur die Logindaten entgegen nimmt. Prüfen kann dann der Aufrufer des Logindialogs.

Es ist übrigens ziemlich wahrscheinlich, dass das alles nichts mit deinem Fehler zu tun hat ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein, in CPsyProApp::InitInstance.

Dein Design ist, sagen wir, ungewöhnlich. Dein Login-Dialog "besitzt" deinen Hauptdialog. Die Hauptdialoginstanz "lebt" in einer Methode deiner Logindialogklasse.

Eigentlich sollte der Logindialog dem Hauptdialog vorgeschaltet sein. Der Logindialog kann über EndDialog oder eine Membervariable dem Aufrufer von DoModal signalisieren, ob das Login erfolgreich war. Möglich wäre auch, dass der Logindialog gar nicht selbst prüft, sondern nur die Logindaten entgegen nimmt. Prüfen kann dann der Aufrufer des Logindialogs.

Ich bin nicht so der Hauptberufliche Programmierer. Ich hab das auch nicht gelernt sonder mir selber beigebracht. Daher vermutlich die Designfehler.

Es ist übrigens ziemlich wahrscheinlich, dass das alles nichts mit deinem Fehler zu tun hat ;)

Ich bin schwer beeindruckt wie Du dasalles an einem bissel Text in der Ausgabe sehen konntest. Echt nicht schlecht!!

Ich dachte mir schon dass das nix mit meinem Probelm zu tun hat.

Mein ursprünglicher Fehler war ja der, dass beim doppelklick auf das Steuerelement nicht die richtige Funktion aufgerufen wurde.

Würdest Du Dich bereiterklären mal einen Blick über mein Programm zu werfen wenn ichs Dir gezipt schicken würde? *liebguck* :)

PS: Hab es in die InitInstance kopiert. Mein AnmeldeDialog is weg aber der Fehler bleibt :(

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...