Ein Kombinationsfeld mit Werten füllen!
-
Hallo,
vielen Dank für den Tipp, das hat jetzt auch endlich geklappt :). Du hast mir
wirklich sehr geholfen, an diesem Problem bin ich schon seit zwei Tagen festgehangen!Gruß
Umleag
PS: Wenn du etwas Zeit hast würde mich die feinere Variante über den Kostruktor auch sehr interessieren
. Ich habe leider noch nicht viel Erfahrungen mit den MFC und C++, nur mein Schulwissen
.
-
Dann zeig doch mal den Konstruktor des Dialoges.
Und dann bau ihm mal den Zeiger auf das Doc als Parameter ein.Ist eigentlich ganz einfach.

-
Hallo,
ersteinmal mein Kostruktor:
CAddDialog::CAddDialog(CWnd* pParent /*=NULL*/) : CDialog(CAddDialog::IDD, pParent) { //{{AFX_DATA_INIT(CAddDialog) m_strClearanceCombo = _T(""); //}}AFX_DATA_INIT }und nebenbei noch eine Frage (ohje nur Fragen
). Ich habe die Dialogklasse Vorwärtsdeklarieren müssen,
da ich sonst eine menge Fehlermeldungen vom Kompiler erhalten habe. Muß ich das an dieser Stelle machen? Gibts da eine andere möglichkeit sowas zu machen?
Oder ist vielleicht meine #include Anweisung falsch gesetzt(was ich vermute)?Hier noch der Kopf meiner AddDialog.h:
if !defined(AFX_ADDDIALOG_H__C1C356DE_C13B_4196_AFAC_02796E4CFCB8__INCLUDED_) #define AFX_ADDDIALOG_H__C1C356DE_C13B_4196_AFAC_02796E4CFCB8__INCLUDED_ #include "Impulse Voltage.h" #include "Impulse VoltageDoc.h" #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // AddDialog.h : Header-Datei // class CImpulseVoltageDoc; //Vorwärtsdeklaration ///////////////////////////////////////////////////////////////////////////// // Dialogfeld CAddDialog class CAddDialog : public CDialog { // Konstruktion public: CAddDialog(CWnd* pParent = NULL); // Standardkonstruktor // Dialogfelddaten //{{AFX_DATA(CAddDialog) enum { IDD = IDD_ADDDIALOG }; CComboBox ClearanceCombo; CString m_strClearanceCombo; //}}AFX_DATAGruß
Umleag
-
Also, erstmal zum Konstruktor:
CAddDialog::CAddDialog(CImpulseVoltageDoc* pDoc, CWnd* pParent /*=NULL*/) : CDialog(CAddDialog::IDD, pParent) , m_pDoc(pDoc) { //{{AFX_DATA_INIT(CAddDialog) m_strClearanceCombo = _T(""); //}}AFX_DATA_INIT // es geht auch hier ein // m_pDoc = pDoc; // such dir eines aus :) }Vergiß nicht, das auch im Header zu ändern.
Nun compilier mal und dann versuch mal die Fehler mit etwas Überlegen zu beheben.
Ist nur eine Zeile in dem Code von gestern Abend.
Und sag noch, welche Zeile du nun weglassen kannst.Wegen der Includerei:
Die Forwarddeklaration kann hier schon nötig sein, weil es sonst einen Ringinclude geben dürfte.
Lass es ruhig so, wenn ein normales Include nur Fehler gibt.
-
Danke

Hier noch der veränderte Aufruf des Konstruktors von CAddDlg:
BOOL CMainDialog::OnAdd() { // Variablen Deklarationen CAddDialog AddDlg(pDoc); CString strHelp; int nIndex = pDoc->m_oaClearance.GetUpperBound(); CClearance* pPointer = NULL; // Dialog aufrufen AddDlg.DoModal(); }Super!

-

Drei kleine Fragen:
1. Wozu sind die drei Zeilen?CString strHelp; int nIndex = pDoc->m_oaClearance.GetUpperBound(); CClearance* pPointer = NULL;2. Wieso habe ich dich keinen weiteren Konstruktor anlegen lassen?
3. Wieso habe ich wohl diese Parameterreihenfolge gewählt? (Hätte ja auch das Doc hinter den Parent packen können.)

-
Zu 1.)
Ich glaube ich weiß worauf du hinaus möchtest hab auch schon nIndex als Variable
eingespart. Leider kenne ich für den String "strHelp" keine Möglichkeit, um diesen direkt in die Schleife einbauen zu können.
Den Pointer "pPointer" brauche ich um auf die Elemente in meinem Array zugreifen zu können.void CMainDialog::OnAdd() { // Variablen Deklarationen CAddDialog AddDlg(pDoc); CString strHelp; CClearance* pPointer = NULL; // Dialog aufrufen AddDlg.DoModal(); for (int i=0; i <= pDoc->m_oaClearance.GetUpperBound(); i++) { pPointer = (CClearance*)pDoc->m_oaClearance.GetAt(i); strHelp.Format("%d",pPointer->m_nClearance); if ( AddDlg.m_strClearanceCombo == FormatstrHelp) pDoc->m_pWorkPosition = pPointer; } // Bringt das Steuerfenster wieder in den Vordergrund pDoc->m_pMainDialog->BringWindowToTop(); }Zu 2.)
Da bin ich mir leider nicht sicher wieso.

Für gewöhlich kann man ja Konstruktoren beliebig überladen, also müßte das Ergebnis doch das gleiche sein.Zu 3.)
Ich hab beide Varianten ausprobier, sie funktionieren beide. Hier reichten leide mein Wissen und meine Erfahrung nicht mehr aus.

Wäre aber schön, wenn du mir trotzdem hier etwas beibringen könntest.
Mein Wissenshunger ist hier recht groß
, nur die Zeit ist knapp.Gruß
Umleag
-
zu 1: Ahh, die Schleife hattest du vorhin weggelassen, ich hab nix gesagt...

zu 2: So zwingst du den Benutzer (deines Codes), einen Zeiger auf das doc mitzugeben.
Ohne könnte dein Dialog nicht richtig arbeiten, also sollte man verhindern, dass das Doc nicht mitgegeben wird.zu 3: Eigentlich hätte der Compiler meckern müssen, dass Parameter mit Defaultwert immer die letzten sein müssen.
Oder hast du dem Doc auch NULL als Defaultwert gegeben? (Dann mach das bitte weg, siehe 2).
-
Das mit dem Konstruktor(zu 2.))leuchtet mir ein, ist klar
.Das mit pDoc hinter dem Parent ist jetzt auch klar, da hab ich dich falsch verstanden:
BAD:

CAddDialog::CAddDialog(CImpulseVoltageDoc* pDoc, CWnd* pParent /*=NULL*/) : CDialog(CAddDialog::IDD, pParent,m_pDoc(pDoc)) { //{{AFX_DATA_INIT(CAddDialog) m_strClearanceCombo = _T(""); //}}AFX_DATA_INIT }GOOD:

CAddDialog::CAddDialog(CImpulseVoltageDoc* pDoc, CWnd* pParent /*=NULL*/) : CDialog(CAddDialog::IDD, pParent),m_pDoc(pDoc) { //{{AFX_DATA_INIT(CAddDialog) m_strClearanceCombo = _T(""); //}}AFX_DATA_INIT }Gruß
Umleag
-
Wenn ich zu beginn meiner Anwendung auch gleichzeitig zwei Dialogfelder darstellen möchte, wo ist da der beste Platz um es zu initalisieren?
Ich initalisiere diesen in der Funktion OnNewDocument meiner SDI-Dokumentenklasse. Ist das so sinnvoll? Gibt es da besser Möglichkeiten?
An dieser Stell ist noch zu erwähnen das es mir sehr wichtg wäre, dass der Dialog "m_pNewDialog" im Vodergrund steht!Hier der Code von OnNewDocument():
BOOL CImpulseVoltageDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) { m_pNewDialog->ShowWindow(SW_SHOW); m_pNewDialog->BringWindowToTop(); return FALSE; } else { // Startdialog erzeugen if (m_pNewDialog == NULL) { m_pNewDialog = new CNewDialog(this); m_pNewDialog->Create(IDD_NEWDIALOG, NULL); } // Steuerfenster erzeugen if (m_pMainDialog == NULL) { m_pMainDialog = new CMainDialog(this); m_pMainDialog->m_bBreakdown = FALSE; m_pMainDialog->m_fVoltage = 0; m_pMainDialog->Create(); } m_pNewDialog->ShowWindow(SW_SHOW); m_pNewDialog->BringWindowToTop(); return TRUE; } }Gruß
Umleag
-
Ich meinte eher so:
BAD:
CAddDialog::CAddDialog(CWnd* pParent /*=NULL*/, CImpulseVoltageDoc* pDoc) : CDialog(CAddDialog::IDD, pParent) , m_pDoc(pDoc) { //{{AFX_DATA_INIT(CAddDialog) m_strClearanceCombo = _T(""); //}}AFX_DATA_INIT }Na egal.

Zwei Dialogfelder? Das wird evtl. schwieriger.
Sollen die gleichzeitig aktiv sein? Also nicht modal?
Oder sollen nur beide aufgehen und eines über dem anderen liegen?

-
Beide Dialoge sind nicht modal, wobei der "NewDialg" im Vordergrund stehen sollte
und das Hauptrahmenfenster meiner Anwendung hinterdiesem. Derzeit ist dies genau anderts herum
.
Er soll aufgehen und über den anderen liegen!
-
Ich muß jetzt leider Arbeiten gehen, ich hoffe ich darf dich morgen mit weiteren Fragen bombardieren.
Auf alle Fälle möchte ich mich hier schon einmal für deine bisherige Hilfe bedanken.
Ohne die wäre ich wohl weiter in der Finsternis der Unwissenheit geblieben.Gruß
Umleag

DANKE
-
Hallo,
ich hab hier noch so ein Problem mit Kombinationsfeldern. Ich habe nun ein zweites Kombinationsfeld in den Dialog eingebaut, das soll mit Werten gefüllt werden sobald man eine Vorauswahl im ersten Kombinationsfeld vorgenommen hat.
Hierzu habe ich mit dem Klassen-Asistenten die Funktion OnSelchangeDeleteImpulseCombo eingebunden. Leider spricht meine IF-Anweisung nicht an, da offenbar keine aktullen Daten aus dem ersten Kombinationsfeld vorliegen.
Wie kann ich die Funktion dazu bringen sich den ausgewählten Wert zu holen?Hier mein C++ Code:
// Füllt das zeite Combo-Element BOOL CDeleteImpulseDialog::OnSelchangeDeleteImpulseCombo() { // Variablen Deklarationen CClearance* pPointer = NULL; CString strFill; // zweite Kombobox akivieren GetDlgItem(IDC_DELETE_IMPULSE_COMBO2)->EnableWindow(TRUE); // Liste nach der gewünschten Schlagweite durchsuchen for (int i=0; i <= m_pDoc->m_oaClearance.GetUpperBound(); i++) { // Zeiger auf die Mesungen der jeweiligen Schlagweite pPointer = (CClearance*)m_pDoc->m_oaClearance.GetAt(i); // Hilfsvariable mit für Vergleich vorbereiten strFill.Format("%d",pPointer->m_nClearance); // Sucht Schlagweite und bricht Schleife ab if (m_strDeleteImpulseCombo == strFill) { // Füllt die Kombobox2 mit Elementen for (i=0; i <= pPointer->m_oaData.GetUpperBound(); i++) { strFill.Format("%d",i+1); m_DeleteImpulseCombo2.AddString(strFill); } // Abbruch, wenn alle Elemente eingetragen return TRUE; } } return FALSE; }Gruß
Umleag
-
Umleag schrieb:
Leider spricht meine IF-Anweisung nicht an, da offenbar keine aktullen Daten aus dem ersten Kombinationsfeld vorliegen.
Meinst du damit, dass m_strDeleteImpulseCombo leer ist?
Hast du UpdateData(TRUE); gemacht?
-
Hallo,
ja ich vermute das der String leer ist. UpdateData(TRUE) habe ich versucht, was leider ohne Erfolg blieb
.
Den Aufruf hatte ich wie unten im Code dargestellt eingebaut.// Füllt das zeite Combo-Element BOOL CDeleteImpulseDialog::OnSelchangeDeleteImpulseCombo() { // Variablen Deklarationen CClearance* pPointer = NULL; CString strFill; // zweite Kombobox akivieren GetDlgItem(IDC_DELETE_IMPULSE_COMBO2)->EnableWindow(TRUE); UpdateData(TRUE);Ist der Aufruf von UpdateData falsch plaziert oder brauche ich hier eine andere
Funktion.Gruß
UmleagPS: Danke das du dich gemeldest hast
