2Danke
ERLEDIGT
JA
JA
ANTWORTEN
9
9
ZUGRIFFE
537
537
EMPFEHLEN
-
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ß cappajaGeändert von Cappaja (20.07.09 um 14:34 Uhr)
-
20.07.09 14:20 #2
Moin,
bitte beachte die Netiquette: http://www.tutorials.de/index.php?pg=netiquette
Dein Betrag ist wirklich kaum lesbar ...
Gruß
KlausEs 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 !!
-
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
-
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
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.Code :1
int NewValue = m_ctrlDecim.GetPos();
-
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
-
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?
-
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
durchCode cpp:1
int NewValue = m_ctrlDecim.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.Code cpp:1
int NewValue = ((CSpinButtonCtrl)GetDlgItem(SPIN_BUTTON_ID)).GetPos();
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
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)
-
"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
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
-
Dialog aus Dialog heraus öffnen
Von sTEk im Forum .NET Windows FormsAntworten: 3Letzter Beitrag: 08.12.08, 22:07 -
Dialog in Dialog und Enter Taste
Von JoachimJogi im Forum VisualStudio & MFCAntworten: 3Letzter Beitrag: 26.05.07, 05:44 -
Strings von Dialog A nach Dialog B übertragen
Von king_of_drums im Forum C/C++Antworten: 13Letzter Beitrag: 30.08.06, 13:45 -
Strings von Dialog A nach Dialog B übertragen
Von king_of_drums im Forum Visual Basic 6.0Antworten: 3Letzter Beitrag: 15.08.06, 13:47 -
Nachricht von einem Dialog zu modalen, geöffneten 2. Dialog schicken
Von gehrti im Forum VisualStudio & MFCAntworten: 5Letzter Beitrag: 24.05.05, 12:49





Zitieren


Login






