Programm Feler

Don_Pazo

Erfahrenes Mitglied
Hallo,
ich habe einen Programmchen erstellt, mit hilfe von MFC.

Es ist "Einzel Dokument" mit der Klasse "CHtmlView". Ich habe zusetzlich einen Dialog-Fenster gebaut, der seine eigene Klasse "CVerbindung" abgeleitet von CDialog hat. In dem Dialog-Fenster soll man den Server, ein Paar andere Opzionen wählen. Am Ender bildet alles zusammen einen "LINK".

Und jetz DAS PROBLEM:

IN DEM DIALOG-FENSTER SOLLTE BEIM KLIKEN DER OK TASTE, DAS LINK ZU DER FUNKTION "Reqest(CString Link)" witer geleitet:

C/C++ Code:
//*****************************************************************************
// Verbindung.cpp
#include "E_Learn.h"

#include "E_LearnDoc.h"
#include "Verbindung.h"
#include "E_LearnView.h"
...
...

void CVerbindung::OnOK()
{
// TODO: Zusätzliche Prüfung hier einfügen
UpdateData(TRUE);
/* gewählte Option vom ComboBox holen*/
int index;
CString OptionName;

index = m_cCombo.GetCurSel();
m_cCombo.GetLBText(index, OptionName);

/* Verbindung zum Link aufbauen*/
CString Link;

Link= "http://" + m_strServer + "/servlet/statisticsgateway?QUERYID=" + OptionName + "&USERID=" + m_strBenutzer + "&PASSWD=" + m_strPasswort;

CE_LearnView *ptr = NULL;
ptr->Request(Link);
CDialog::OnOK();
}

//*****************************************************************************
// E_LearnView.h
...
...
protected:
afx_msg void Request();
...
..

//*****************************************************************************
// E_LearnView.cpp
#include "E_Learn.h"

#include "E_LearnDoc.h"
#include "Verbindung.h"
#include "E_LearnView.h"
...
...
void CE_LearnView::Request(CString Link)
{
Navigate2(Link,0,NULL);
// MessageBox("EHOOOO");
}

Es wird alles compiliert keinen Problem. Aber bei ausführen das Programm kommt es zu Fellermeldung. Das Link wird nicht angezeigt. Aber das MessageBox funktionirt, wenn man Navigate2 auskomentiert.

Könnte mir bitte jemand einen Rat geben, was ich falsch gemacht habe

Danke
 
Zuletzt bearbeitet:
Naja, irgendwie müsstest du "CE_LearnView *ptr" einen gültigen Wert zuweisen. Mit einem Null-Zeiger kannst du keine Methode aufrufen.
Bei einer SDI-Applikation müsste das so klappen:
Code:
CView *ptr = (CFrameWnd *)AfxGetMainWnd())->GetActiveView();

if( ptr && ptr->IsKindOf(RUNTIME_CLASS(CE_LearnView) )
{
    ((CE_LearnView *)ptr)->Request(Link);
}
P.S. Bitte die Code-Tags benutzen.
 
Hi,
Es wird alles compiliert keinen Problem. Aber bei ausführen das Programm kommt es zu Fellermeldung. Das Link wird nicht angezeigt. Aber das MessageBox funktionirt, wenn man Navigate2 auskomentiert.
1. Was heißt "...nicht angezeigt". Bedeutet das, daß der Browser nichts findet? Oder zeigst du irgendwo den String an?

2. Welche Fehlermeldung kommt denn?

3. Du kannst zwei Dinge tun:
a) schau dir den String vor ptr->Request(Link); im Debugger an oder baue eine MessageBox ein, wo du den String ausgeben läßt. So siehst du, ob er richtig aufgebaut ist.
b) Dasselbe kannst du vor Navigate2 auch tun. Laß doch die MessageBOx, die du da auskommentiert hast, vor Navigate2 den Link ausgeben. Wenn er dann immer noch fehlerfrei ist, mußt du mal bei Navigate2 weiterschauen.

Mfg

langer
 
Ich danke dir MCoder,
das hätte ich selber nicht gekrigt, so wiet bin ich defenetiv nicht.
Also danke !!

Noch mall die fertige Code, falls jemen es brauchen wird:

// *** Lösung ***/

void CVerbindung::OnOK()
{
// TODO: Zusätzliche Prüfung hier einfügen
UpdateData(TRUE);
/* gewählte Option vom ComboBox holen*/
int index;
CString OptionName;

index = m_cCombo.GetCurSel();
m_cCombo.GetLBText(index, OptionName);

/* Verbindung zum Link aufbauen*/
CString Link;
Link= "http://" + m_strServer + "/servlet/statisticsgateway?QUERYID=" + OptionName + "&USERID=" + m_strBenutzer + "&PASSWD=" + m_strPasswort;

//****** DAS TRICK *******//

CView *ptr = ((CFrameWnd *)AfxGetMainWnd())->GetActiveView();

if( ptr && ptr->IsKindOf(RUNTIME_CLASS(CE_LearnView) ))
{
((CE_LearnView *)ptr)->Request(Link);
}

CDialog::OnOK();
}
 
Sorry, aber da fällt mir nur noch eins ein:
Bevor man sich an GUI-Programmierung mit MFC oder anderen Frameworks heranmacht, sollte man sich selbst einen Gefallen tun und C++ mit Hilfe von Konsolenprogrammen zu lernen. Wenn man da alle Aspekte der Objektorientierten Programmierung gerlernt hat, dann kann man sich an Dinge wie Oberflächenprogrammierung heranwagen.

Daniel
 
Zurück