tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von vfl_freak
  • 1 Beitrag von MCoder
ERLEDIGT
JA
ANTWORTEN
9
ZUGRIFFE
537
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Cappaja Cappaja ist offline Mitglied Silber
    Registriert seit
    May 2009
    Ort
    Konstanz
    Beiträge
    85
    hallo,

    wie kann ich innerhalb einer dialogbasierenden anwendung einen weiteren dialog initialisieren? mittels der nachricht WM_INITDIALOG in der untergeordneten dialogklasse ist es nicht möglich die werte für die kontrollelemente zu initialisieren (der TRACE wird nie ausgeführt). stattdessen wird direkt die methode ausgeführt. an der rotmarkierten Stelle steigt das Programm dann aus, da es versucht einen leeren CString in ein INT zu transformieren.

    was gibt es denn für möglichkeiten, anderweitig einen dialog innerhalb einer dialogbasierenden anwendung zu initialisieren?

    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
    32
    33
    34
    35
    36
    37
    38
    39
    
    BOOL CDisplayControl::OnInitDialog() 
    {
        CDialog::OnInitDialog();
        
        // TODO: Zusätzliche Initialisierung hier einfügen
        m_ctrlDecim. SetRange(1, 40);
        m_ctrlDecim. SetPos(1);
        m_ctrlScale. SetRange(0, 50);
        m_ctrlScale. SetPos(0);
        m_ctrlOffset.SetRange(0, 100);
        m_ctrlOffset.SetPos(0);
     
        TRACE("\n\n#############################################\n\n");
        
        return TRUE;  // return TRUE unless you set the focus to a control
                      // EXCEPTION: OCX-Eigenschaftenseiten sollten FALSE zurückgeben
    }
     
    void CDisplayControl::OnChangeDecimation() 
    {
        CWiwoDlg* WinWout;
        WinWout = NULL;
        CString sDecim;
        m_ctrlDecim.GetWindowText(sDecim);
        [COLOR="Red"]int NewValue = atoi(sDecim);[/COLOR]
     
        if(NewValue > 40)
        {
            WinWout->pDP.d_dec = 40;
            return;
        }
        if(NewValue < 1)
        {
            WinWout->pDP.d_dec = 1;
            return;
        }
     
        WinWout->pDP.d_dec = NewValue;
    }

    gruß cappaja
    Geändert von Cappaja (20.07.09 um 14:34 Uhr)
     

  2. #2
    Avatar von vfl_freak
    vfl_freak vfl_freak ist offline Mitglied Diamant
    Registriert seit
    Aug 2007
    Ort
    Niedersachsen
    Beiträge
    2.161
    Moin,

    bitte beachte die Netiquette: http://www.tutorials.de/index.php?pg=netiquette

    Dein Betrag ist wirklich kaum lesbar ...

    Gruß
    Klaus
    paulepanke bedankt sich. 
    Es ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!

    Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
    -------------------------------------------------------------------------------------------------
    Ich beantworte keine Fragen per PN !!
    Stellt Eure Fragen im Forum - dann haben alle etwas davon !!

  3. #3
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Hallo,

    OnInitDialog() wird einmalig automatisch bei der Erstellung des Dialogs aufgerufen. Wie erzeugst du den Dialog und welche Message hängt hinter OnChangeDecimation? Ich vermute mal, m_ctrlDecim ist ein CSpinButtonCtrl. Um dessen Wert abzufragen gibt es die Methode GetPos(). Da brauchst du nichts zu konvertieren.

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  4. #4
    Cappaja Cappaja ist offline Mitglied Silber
    Registriert seit
    May 2009
    Ort
    Konstanz
    Beiträge
    85
    Zitat Zitat von MCoder Beitrag anzeigen
    Hallo,

    OnInitDialog() wird einmalig automatisch bei der Erstellung des Dialogs aufgerufen. Wie erzeugst du den Dialog und welche Message hängt hinter OnChangeDecimation? Ich vermute mal, m_ctrlDecim ist ein CSpinButtonCtrl. Um dessen Wert abzufragen gibt es die Methode GetPos(). Da brauchst du nichts zu konvertieren.

    Gruß
    MCoder
    den dialog erzeuge ich mit einem doppelklick event innerhalb eines gültigen Graphen:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    void CWiwoDlg::OnLButtonDblClk(UINT nFlags, CPoint point) 
    {
        CRect rect = m_pGraph->CalcDataArea();
        BOOL bFlag = CheckRect(point, rect);
     
        if(bFlag == TRUE)
        {
            // Falls Dialog noch nicht erstellt ist
            if (m_pDisplayControl == NULL)
            {
                // Dialog-Objekt erstellen
                m_pDisplayControl = new CDisplayControl(this);
                // Dialog erstellen und anzeigen
                m_pDisplayControl->Create(CDisplayControl::IDD);
                m_pDisplayControl->ShowWindow(SW_NORMAL);
            }
        }   
        
        CDialog::OnLButtonDblClk(nFlags, point);
    }

    hinter OnChangeDecimation() steckt eine EN_CHANGE message. m_ctrlDecim ist ein CSpinCtrlButton, das stimmt. Das mit dem cast leuchtet mir ein, habs durch
    Code :
    1
    
    int NewValue = m_ctrlDecim.GetPos();
    ersetzt. allerdings stürzt die anwendung weiterhin bei dieser zeile ab, da oninitdialog() bei mir noch nicht ausgeführt wurde und kein gültiger wert drin steht.
     

  5. #5
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Hallo,

    Die Initialisierung sollte nach dem Aufruf von Create erfolgen. Wird die EN_CHANGE Message vom Spin-Button ausgelöst? Das würde bedeuten, dass das Control existiert, aber die Variable nicht korrekt initialisiert wurde. Kontrolliere noch mal die Stellen, an denen die Variable angelegt bzw. initialisiert wird.

    Ich kann übrigens immer noch nicht glauben, dass OnInitDialog nicht aufgrerufen wird. Setze doch mal einen Debugger-Breakpoint direkt auf die erste Zeile in dieser Methode.

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  6. #6
    Cappaja Cappaja ist offline Mitglied Silber
    Registriert seit
    May 2009
    Ort
    Konstanz
    Beiträge
    85
    Die Membervariable m_ctrlDecim gehört zum Spin-Button wo auch EN_CHANGE ausgelöst wird. Das Programm läuft schon in die OnInitDialog() allerdings wirklich erst nachdem er in OnDecimationChange() war. Ich bin die Reihenfolge sorgfältig mit dem Debugger durchgegangen, deswegen bin ich ja so irritiert.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    void CDisplayControl::OnChangeDecimation() 
    {
        CWiwoDlg* WinWout;
        WinWout = NULL;
     
        int NewValue = 5;  //m_ctrlDecim.GetPos();
     
        if(NewValue > 40)
        {
            WinWout->pDP.d_dec = 40;
            return;
        }
        if(NewValue < 1)
        {
            WinWout->pDP.d_dec = 1;
            return;
        }
     
        [COLOR="Red"]WinWout->pDP.d_dec = NewValue;[/COLOR]
    }

    wenn ich wie hier im Beispiel einen festen Wert eingebe wie 5 dann läuft er bis zur rotmarkierten Stelle wo er wieder komplett aussteigt. Dort übergebe ich nur den Wert an mein struct. So Probleme hatte ich zuvor noch nicht, kann es wirklich nicht mit der Dialoginitialisierung zusammen hängen?
     

  7. #7
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Hallo,

    zu deinen letzen Codeabschnitt:
    Dass das Programm hier abstürzt ist logisch, da "WinWout" nicht initialisiert (NULL) ist.

    Das andere Problem:
    Ersetze mal die Zeile
    Code cpp:
    1
    
    int NewValue = m_ctrlDecim.GetPos();
    durch
    Code cpp:
    1
    
    int NewValue = ((CSpinButtonCtrl)GetDlgItem(SPIN_BUTTON_ID)).GetPos();
    "SPIN_BUTTON_ID" musst du durch die ID deines Spinbuttons ersetzen. Ich vermute, dass mit "m_ctrlDecim" irgendwas nicht stimmt und so kannst du ohne die Member-Variable auf das Control zugreifen. Mich würde mal interessieren, ob das funktioniert.

    Gruß
    MCoder
    Cappaja bedankt sich. 
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  8. #8
    Cappaja Cappaja ist offline Mitglied Silber
    Registriert seit
    May 2009
    Ort
    Konstanz
    Beiträge
    85
    hi mcoder,

    dein ansatz war fast richtig, so hats dann aber funktioniert:
    Code :
    1
    
    int NewValue = ((CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_DECIM))->GetPos();

    WinWout wird nun ausserhalb initialisiert, da sie global definiert wurde. ich hatte zuvor einen Klassenkonflikt, weswegen ich sie lokal anlegte. Allerdings kann ich meiner struktur nach wie vor keinen wert zuweisen. ich denke aber das ich das noch hinbekomme, wichtig war mir die initialisierung der kontrollelemente. hierfür nochmals danke!

    übirgens erhalte ich jetzt mit GetPos() den Startwert 0, in OnInitDialog wird er mit SetPos(1) initialisiert, das zeigt nochmals das er doch erst in OnChangeDecimation() springt bevor er wie eigentlich geplant OnInitDialog() ausführt.
    Geändert von Cappaja (21.07.09 um 22:16 Uhr)
     

  9. #9
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Zitat Zitat von Cappaja Beitrag anzeigen
    dein ansatz war fast richtig, so hats dann aber funktioniert:
    Code :
    1
    
    int NewValue = ((CSpinButtonCtrl*)GetDlgItem(IDC_SPIN_DECIM))->GetPos();
    War wohl gestern abend noch zu heiss

    Die Initialisierung könntest du auch nach/bei Create ausführen. Entweder in einer speziellen Methode oder du erzeugst einen Handler für WM_CREATE.

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  10. #10
    Cappaja Cappaja ist offline Mitglied Silber
    Registriert seit
    May 2009
    Ort
    Konstanz
    Beiträge
    85
    falls ich noch irgendwo schwierigkeiten mit der initialisierung bekommen sollte werde ich deinen rat mit dem WM_CREATE mal befolgen. soweit aber mal danke und gestern wars wirklich heiss
     

Ähnliche Themen

  1. Dialog aus Dialog heraus öffnen
    Von sTEk im Forum .NET Windows Forms
    Antworten: 3
    Letzter Beitrag: 08.12.08, 22:07
  2. Dialog in Dialog und Enter Taste
    Von JoachimJogi im Forum VisualStudio & MFC
    Antworten: 3
    Letzter Beitrag: 26.05.07, 05:44
  3. Strings von Dialog A nach Dialog B übertragen
    Von king_of_drums im Forum C/C++
    Antworten: 13
    Letzter Beitrag: 30.08.06, 13:45
  4. Strings von Dialog A nach Dialog B übertragen
    Von king_of_drums im Forum Visual Basic 6.0
    Antworten: 3
    Letzter Beitrag: 15.08.06, 13:47
  5. Antworten: 5
    Letzter Beitrag: 24.05.05, 12:49