Absturz bei FlexGrid+PropertySheet? Unerklärbarer Fehler!



  • Mir ist während der Arbeit an einem Projekte ein merkwürdiger Fehler aufgetreten, den ich erst einmal überhaupt nicht lokalisieren konnte und der zu einer Prozessorauslastung von 100% führte. Nach langer Suche habe ich dann doch etwas gefunden, was damit in Zusammenhang steht, aber ich kann mir das immer noch nicht erklären.
    Prinzipiell handelt es sich um eine MFC-Dialogfeldanwendung, die einen PropertySheet mit zwei PropertyPages enthält. Auf der zweiten PropertyPage befindet sich ein MS FlexGrid 6.0- ActiveX-Steuerelement. Wird die zweite Registerkarte angewählt und verliert daraufhin die Anwendung den Fokus, so kommt es zu einer Prozessorauslastung von 100% und das Programm schmiert ab. Keine Ahnung, wie man das erklären kann.
    Hier mal eine Schritt-für-Schritt-Anleitung.
    Dazu habe ich folgendes getan:

    -Neues Projekt "PropTest" erstellt: MFC-Anwendungsassistent->Dialogfeldanwendung (mit ActiveX-Steuerelementunterstützung)
    -Zwei Dialogfelder eingefügt: Einfügen->Ressource->Dialog->IDD_PROPPAGE_MEDIUM , umbenannt in (ID_PROP1,ID_PROP2)
    -Für jedes Dialogfeld eine neue Klasse erstellt (CProp1,CProp2), abgeleitet von CPropertyPage
    -In der "PropTestDlg.h" die beiden Header der beiden Dialogfeldklassen eingefügt
    -Weiterhin in der CPropTestDlg-Klasse eine Instanz von CPropertySheet und je
    eine Instanz der Dialogfeldklassen CProp1 und CProp2, s.u.

    PropTestDlg.h

    #include "Prop1.h"	//! Hier Header eingefügt
    #include "Prop2.h"
    
    ///////////////////////////////////////
    // CPropertyTestDlg Dialogfeld
    
    class CPropTestDlg : public CDialog
    {
    // Konstruktion
    public:
    
    CPropTestDlg(CWnd* pParent = NULL);// Standard-Konstruktor
    
    CPropertySheet m_PropSheet;	//! CPropertySheet-Instanz
    CProp1 m_Prop1;	 //! Instanz der Dialogfeldklassen, 
    CProp2 m_Prop2;  //! die von CPropertyPage abgeleitet sind
    //...
    

    In der OnInitDialog der CPropTestDlg-Klasse steht folgendes

    // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
    m_PropSheet.Construct("PropSheet",this);
    m_PropSheet.AddPage(&m_Prop1); 
    m_PropSheet.AddPage(&m_Prop2);
    m_PropSheet.Create(this,WS_VISIBLE|WS_CHILD);
    

    - Als letztes wird ein MS FlexGrid 6.0-Steuerelement in das zweite Dialogfeld (ID_PROP2) eingefügt:
    Projekt->dem Projekt hinzufügen…->Komponenten und Steuerelemente ->Registered Active X Controls ->MS FlexGrid 6.0
    Und dann halt noch das Steuerelement auf das Dialogfeld setzen.

    So, man kompiliere den ganzen Kram und führe das Programm aus. Jetzt die magischen Aktionen:
    - Man klickt zunächst auf den Registerreiter der zweiten Registerkarte, so dass dieser angezeigt wird
    - Nun klickt man auf eine beliebige Stelle auf dem Desktop oder in eine andere Anwendung, so dass diese Anwendung den Fokus verliert
    - Man beachte die Prozessorauslastung !!! 100% bei mir !!!

    Woran liegt das ????? Habt ihr da irgendwelche Ideen ???????
    Gruß
    E-the-Real



  • Das von dir beschriebene Verhalten tritt auch auf, wenn man überhaupt kein FlexGrid hinzu fügt, wenn man also das hier:

    - Als letztes wird ein MS FlexGrid 6.0-Steuerelement in das zweite Dialogfeld (ID_PROP2) eingefügt:
    Projekt->dem Projekt hinzufügen…->Komponenten und Steuerelemente ->Registered Active X Controls ->MS FlexGrid 6.0
    Und dann halt noch das Steuerelement auf das Dialogfeld setzen.

    komplett weg lässt. Damit hängt es also nicht zusammen. Ich vermute daher den Fehler irgendwo bei der Konstruktion von den PropertyPages.

    [edit] zu viel zitiert -> gekürzt [/edit]



  • Das stimmt, habe ich auch rausgefunden.
    Es gibt da auch offensichtlich Lösungsansätze, die aber allesamt bei mir nicht funzen. Am "offizielsten" ist wohl dieser hier
    doch klappt das irgendwie nicht. Wenn ich eine Klasse von CPropertySheet ableite, die OnInitDialog dann überschreibe (eben mit dieser ModifyStyleEx(..)), kommt bei mir schon gleich zu Beginn des Programms eine Fehlermeldung, genauso wie wenn ich in der OnInitDialog des Hauptdialogfeldes folgendes mache:

    CPropertySheet m_PropSheet;
    m_PropSheet.ModifyStyleEx(0,WS_EX_CONTROLPARENT); //->Fehler
    

    Weitere Ideen ????
    Gruß


Anmelden zum Antworten