ON_COMMAND call



  • Hallo

    Ich brauche Hilfe

    Habe ein Visual c++ 6.0 programm MFC

    In der Methode InitInstance() lese ich die CommandLine aus
    und anschließend möchte ich ON_COMMAND OnReportOpen() von der Klasse MyView öffnen
    In der interaktiven Version von meinem Programm starte ich diese Methode OnReportOpen() in dem ich in der Menü-Leiste auf
    Report
    -> Open
    klicke. Nun möchte ich das aber über die Methode InitInstance aufrufen bzw. automatisch anklicken lassen.

    Aber wie das funktioniert weiß ich nicht.

    hier ein Auszug von meinem Programm

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

    BOOL MyApp::InitInstance() 
    { 
    CSingleDocTemplate* pDocTemplate; 
    pDocTemplate = new CSingleDocTemplate( 
    IDR_MAINFRAME, 
    RUNTIME_CLASS(CRDCcpp85Doc), 
    RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CRDCcpp85View)); 
    AddDocTemplate(pDocTemplate); 
    
    CMyCmdLineInfo cmdInfo; 
    ParseCommandLine(cmdInfo); 
    
    vConnect = cmdInfo.m_Connect; 
    vPath = cmdInfo.m_Path; 
    vLogon = cmdInfo.m_Logon; 
    vUser = cmdInfo.m_User; 
    vPassword = cmdInfo.m_Password; 
    vServer = cmdInfo.m_Server; 
    
    if (!ProcessShellCommand(cmdInfo)) 
    return FALSE; 
    
    m_pMainWnd->ShowWindow(SW_SHOW); 
    m_pMainWnd->SetWindowText("hrViewer"); 
    m_pMainWnd->UpdateWindow(); 
    
    MyView theView; 
    // HIER MÖCHTE ICH ON_COMMAND OnReportOpen() aufrufen?? aber wie?? 
    
    return TRUE; 
    }
    

    Ich hoffe dass ihr mir helfen könnte

    danke

    Reci



  • Eigentlich kannst du die Funktion ganz normal aufrufen.

    Also:

    CMainFrame* pWnd = dynamic_cast<CMainFrame*>(m_pMainWnd);
    if (pWnd)
    {
        CMyView pMyView = dynamic_cast<CMyView*>(pWnd->GetActiveView());
        if (pMyView)
        {
            pMyView->OnReportOpen();
        }
    }
    

    Ist nicht getestet, gebe ich zu. Außerdem könntest du ein Problem kriegen, weil noch kein View aktiv ist. Aber vielleicht kommst du ja vom MainFrame aus weiter. 🙂



  • Dadurch kann ich das machen.
    Die Funktion wird aufgerufen.

    MyView theView;
    theView.OnReportOpen();

    aber dann kommt eine fehlermeldung
    "Die Anweisung in "0x6c2e1ef8" verweist auf Speicher in "0x6c2daed8".
    Der Vorgang "written" konnte nicht auf dem Speicher durchgeführt werden"

    ????
    das sagt mir sehr wenig.

    Ich glaube an dieser Stelle bekomme ich die Meldung

    CRect rect;
    GetClientRect(rect);
    objReport.InitCRViewer(rect, this);

    //objReport ist in MyView.h definiert.

    ::InitCRViewer(CRect rect, CWnd *pParent){
    -> m_Viewer.Create(NULL, "rptviewer", WS_CHILD, rect, pParent, 100, NULL);
    }

    wenn ich diese zeile mit -> davor kommentiere // dann läuft mein programm durch
    also liegt es an m_Viewer was eigentich im header definiert ist
    oder an den Parametern.

    kannst du mir vielleicht noch sagen wie ich über die commandline debuggenkann??



  • Wenn du
    MyView theView;
    schreibst, legst du ein lokales Objekt an. Du solltest aber das Objekt der Anwendung nutzen. Die beiden haben nix direkt miteinander zu tun. Das könnte also sehr "in die Hose" gehen.

    Ich verstehe leider nicht, was du mit "über die Commandline" debuggen meinst. Ich kenne das nur mit Visual Studio direkt. Da kannst du aber irgendwo festlegen, mit welchen Parametern dein Programm aufgerufen werden soll.

    Oder bau kurz bevor es schief gehen könnte ein ASSERT(FALSE); ein. Dann kriegst du eine Meldung, klickst Wiederholen und VisualStudio wird gestartet. Ist aber nicht so toll die Variante.


Anmelden zum Antworten