Array zurückgeben
-
Also - es tut mir leid, aber das klappt alles nicht.
Ich versuche wirklich zu verstehen, was da falsch läuft, und es entsprechend zu ändern. Doch irgendwie raffe ich das einfach nicht. Hier mal der Code der Dateien:
[PPgMailchecker.cpp]
// PPgMailchecker.cpp : Implementierungsdatei // #include "stdafx.h" #include "appdlg.h" #include "PreferencesDlg.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif // CPPgMailchecker-Dialogfeld IMPLEMENT_DYNAMIC(CPPgMailchecker, CPropertyPage) CPPgMailchecker::CPPgMailchecker() : CPropertyPage(CPPgMailchecker::IDD) { } CPPgMailchecker::~CPPgMailchecker() { } void CPPgMailchecker::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); DDX_Control(pDX, IDC_MAIL_INT, m_MailReqInterval); } BEGIN_MESSAGE_MAP(CPPgMailchecker, CPropertyPage) ON_BN_CLICKED(IDC_MAIL_USE, OnSettingsChange) ON_BN_CLICKED(IDC_MAIL_USE_SOU, OnSettingsChange) ON_BN_CLICKED(IDC_MAIL_DEAC_NOT, OnSettingsChange) ON_CBN_SELCHANGE(IDC_MAIL_INT, OnSettingsChange) ON_CBN_SELCHANGE(IDC_MAIL_SOU, OnSettingsChange) ON_BN_CLICKED(IDC_MAIL_BROWSE_SOU, OnBnClickedBtnMailBrowseWav) END_MESSAGE_MAP() void CPPgMailchecker::LoadSettings(void) { CEdit* editPtr; /* for(int i = 0; i < 10; i++) if(m_MailReqInterval.GetItemData(i) == theApp.glob_prefs->GetMailSelectedInterv()) m_MailReqInterval.SetCurSel(i); */ if(app_prefs->prefs->m_MailChkrIsActive) CheckDlgButton(IDC_MAIL_USE,1); else CheckDlgButton(IDC_MAIL_USE,0); if(app_prefs->prefs->m_MailUseSoundfile) CheckDlgButton(IDC_MAIL_USE_SOU,1); else CheckDlgButton(IDC_MAIL_USE_SOU,0); if(app_prefs->prefs->m_MailNotificationYN) CheckDlgButton(IDC_MAIL_DEAC_NOT,1); else CheckDlgButton(IDC_MAIL_DEAC_NOT,0); editPtr = (CEdit*) GetDlgItem(IDC_MAIL_SOU); editPtr->SetWindowText(LPCTSTR(app_prefs->prefs->m_MailNotificationSound)); } BOOL CPPgMailchecker::OnInitDialog() { CPropertyPage::OnInitDialog(); DWORD strVar[10]; for (int i = 0; i < 10; i++){ theApp.glob_prefs->LoadMailIntervalFile(strVar, 10); m_MailReqInterval.SetItemData(i, strVar ); } LoadSettings(); Localize(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CPPgMailchecker::OnBnClickedBtnMailBrowseWav() { CString strWavPath; GetDlgItemText(IDC_MAIL_SOU, strWavPath); CString buffer; if (DialogBrowseFile(buffer, "Audio-Wav (*.wav)|*.wav||", strWavPath)){ SetDlgItemText(IDC_MAIL_SOU, buffer); SetModified(); } } BOOL CPPgMailchecker::OnApply() { CEdit* editPTR; CString buffer; editPTR = (CEdit*) GetDlgItem(IDC_MAIL_SOU); editPTR->GetWindowText(buffer); sprintf(app_prefs->prefs->m_MailNotificationSound,"%s",buffer); app_prefs->prefs->m_MailChkrIsActive = IsDlgButtonChecked(IDC_MAIL_USE); app_prefs->prefs->m_MailUseSoundfile = IsDlgButtonChecked(IDC_MAIL_USE_SOU); app_prefs->prefs->m_MailNotificationYN = IsDlgButtonChecked(IDC_MAIL_DEAC_NOT); SetModified(FALSE); return CPropertyPage::OnApply(); } void CPPgMailchecker::Localize(void) { if(m_hWnd) { GetDlgItem(IDC_MAIL_USE)->SetWindowText(GetResString(IDS_MAIL_USE)); GetDlgItem(IDC_MAIL_USE_SOU)->SetWindowText(GetResString(IDS_MAIL_USE_SOU)); GetDlgItem(IDC_MAIL_DEAC_NOT)->SetWindowText(GetResString(IDS_MAIL_DEAC_NOT)); GetDlgItem(IDC_MAIL_BROWSE_SOU)->SetWindowText(GetResString(IDS_PW_BROWSE)); } } // CPPgMailchecker-MeldungshandlerDeren Header-Datei sieht so aus:
#pragma once #include "preferences.h" #include "afxwin.h" // CPPgMailchecker-Dialogfeld class CPPgMailchecker : public CPropertyPage { DECLARE_DYNAMIC(CPPgMailchecker) public: CPPgMailchecker(); virtual ~CPPgMailchecker(); void SetPrefs(CPreferences* in_prefs) { app_prefs = in_prefs; } // Dialogfelddaten enum { IDD = IDD_PPG_MAILCHECKER }; protected: CPreferences *app_prefs; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support DECLARE_MESSAGE_MAP() public: virtual BOOL OnInitDialog(); private: void LoadSettings(void); public: virtual BOOL OnApply(); afx_msg void OnSettingsChange() { SetModified(); } afx_msg void OnBnClickedBtnMailBrowseWav(); protected: CComboBox m_MailReqInterval; public: void Localize(void); };Die Load-Funktion ist in der anderen cpp-Datei:
[preferences.cpp]void CPreferences::LoadMailIntervalFile( DWORD* strVar, size_t arraygroesse ){ if (!PathFileExists(configdir+"mailchecker.ini")){ theApp.glob_prefs->CreateMailIntervalFile(); } if (PathFileExists(configdir+"mailchecker.ini")){ CIni ini; for (size_t i = 0; i < arraygroesse ; i++){ // fuer das i auch size_t strVar[i] = ini.GetInt("Interval%i"); } } }und in deren Header-Datei steht es so:
[preferences.h]public: //...... void LoadMailIntervalFile(DWORD* strVar, size_t arraygroesse); // Mailchecker //.....Die Varibale m_Mailchecker, die in der preferences.h public deklariert ist, soll den aktuell gespeicherten Intervall enthalten - zurückgeben erfolgt so:
[preferences.cpp]uint8 CPreferences::GetMailSelectedInterv() const { return prefs->m_MailReqInterval; }speichern kommt noch - soweit komme ich ja nicht

Fehler:
d:\src\PPgMailchecker.cpp(96): error C2664: 'CComboBox::SetItemData' : Konvertierung des Parameters 2 von 'DWORD [10]' in 'DWORD_PTR' nicht möglichZeile 96 ist der Aufruf:
theApp.glob_prefs->LoadMailIntervalFile(strVar, 10);in der PPgMailchecker.cpp
Sorry, dass ich euch so mit code vollballere, aber ich hab da schon über 15 Stunden Zeit mit verbracht, die MSDN gewälzt, aber ich habe (*zugeb*) noch nicht genug Ahnung um das alles umsetzen zu können.
Aber ich versuch´s immerhinWäre es nicht besser, die Auslese-Operation der Datei (mailchecker.ini) einfach da zu machen, wo die Combo-Box erzeugt wird? Wäre zwar ein wenig "hingebastelt" aber hätte ich die Probleme dann immernoch?
Danke für eure Hilfe
Gruß
-
Fein - ich weiß ja das ich anstrengend bin

Wenn ihr schon keine Lösung habt, könnt ihr mir dann wenigstens ne Informationsquelle empfehlen, in der ich das nachlesen kann? Es kann doch nicht sein, dass ich alles andere hinbekommen habe, aber ich an dieser Kleinigkeit scheitere.
Und nun bitte nicht http://www.microsoft.com/germany/msdn/ - die wälze ich schon den ganzen Tag

Danke
Grüße
-
hm, hast du auch an den index gedacht, is bissher untergegangen:
BOOL CPPgMailchecker::OnInitDialog() { CPropertyPage::OnInitDialog(); DWORD strVar[10]; for (int i = 0; i < 10; i++){ theApp.glob_prefs->LoadMailIntervalFile(strVar, 10); m_MailReqInterval.SetItemData(i, strVar[i] ); // hier // sollte das nicht gehen caste mal nach DWORD_PTR: // m_MailReqInterval.SetItemData(i, (DWORD_PTR)strVar[i] ); }
-
Ahh: Vielen Dank! Das funzt.

Ich hätte zwar schwören können, dass ich das bereits so (oder so ähnlich) verscuht hatte, aber anscheinend ja nicht.
Fein - vielen Dank.Leider stehen jetzt keine Werte in der ComboBox, aber immerhin gibbet keine Compile-Fehler mehr.
Ich gehe mal davon aus, das die Auslesen-Operation der ini-Datei korrekt läuft, also muß das woanders dran liegen. Aber vielen Dank erstmal. Hab zumindest was gelernt

Gruß
André
-
Hhmm,
ist an der Auslese-Operation doch was falsch?
void CPreferences::LoadMailIntervalFile( DWORD* strVar, size_t arraygroesse ){ if (!PathFileExists(configdir+"mailchecker.ini")){ theApp.glob_prefs->CreateMailIntervalFile(); } if (PathFileExists(configdir+"mailchecker.ini")){ CIni ini; for (size_t i = 0; i < arraygroesse ; i++){ strVar[i] = ini.GetInt("Interval%i"); } } }Wenn die Datei folgendermaßen aufgebaut ist:
[Mailchecker-Intervals] Interval0=5 Interval1=10 Interval2=15 Interval3=20 Interval4=30 Interval5=45 Interval6=60 Interval7=75 Interval8=90 Interval9=120Das sollte doch stimmen, oder? Wieso ist der Verkot der an die ComboBox übergeben wird dann leer?
Das ist auch bestimmt meine letzte Frage zu dem Thema 
Gruß
-
ja du musst da noch was formatieren:
void CPreferences::LoadMailIntervalFile( DWORD* strVar, size_t arraygroesse ){ if (!PathFileExists(configdir+"mailchecker.ini")){ theApp.glob_prefs->CreateMailIntervalFile(); } if (PathFileExists(configdir+"mailchecker.ini")){ CIni ini; CString s; for (size_t i = 0; i < arraygroesse ; i++){ // evtl. musst du den string vorher immer wieder loeschen, ka... s.Format( "%s%d", "Interval", i ); strVar[i] = ini.GetInt("Interval%i"); } } }probier es aus, ich hoffen das funktioniert...

-
Nochmal: Danke für Deine Hilfe
Aber das funktioniert leider auch nicht. Ich hab alternativ versucht, wie geraten, den String zu löschen, aber das hat auch nicht geklappt (oder ich habs falsch gemacht - ka).
Ich häng da jetzt über zwei Tage dran - so langsam hab ich Zweifel, ob es ein einfaches Edit-Control nicht auch getan hätte. Andererseits würde ich das jetzt echt gerne schaffen und begreifen. Das kann doch eingentlich nicht so schwer sein - so mit der MFC im Rücken...
Noch ne Idee?
Ansonsten werde ich spätestens morgen dann auf ein Edit-Control umsteigen. Heute gebe ich mir noch Zeit zum austesten.
MfG
-
hast du dem ini-file auch eine datei zugeordnet??
-
der ini eine Datei zugeordnet?Hhmm - ich bin mir sicher, ob weiß was Du meinst.
Die mailchecker.ini wird halt im Unterverzeichnis "config" des Hauptprogrammes erstellt - und das in jedem Falle. Beim ersten Programmstart eine Reihe solcher Files erstellt und dann die globalen Variablen mit Standardwerten gefüllt - d.h. die ini-Dateien gibt es in jedem Falle. So funzt das im allgemeinen.
Das witzige ist ja, dass der Code zum checken, ob die Werte kleiner 5 sind ja funktioniert. Wenn ich da manuell nen Wert von 2 reinschreibe, wird beim schließen des Programms automatisch die Check...-Funktion aufgerufen (da fehlt noch ne Prüfung, aber da bin ich ja noch nicht) - und die behebt den Eintrag 2 direkt, indem sie das File komplett neu anlegt/überschreibt.
Wenn der Zugriff mit ini.GetInt also alleine klappt, muß das doch auch im Vektor gehen?Ansonsten passiert alles, wie oben im Code ersichtlich.
Sorry, ich glaub ich weiß nicht ganz wie Du das meinst.
-
aso.
ich meinte weil du nur
CIni ini;
schreibst.
ist das CIni eine klasse von dir (konnte nirgens so ne klasse finden...)?
falls ja, zeig die mal her.
-
Okay, kein Problem. Die sind n bissel lang, daher uppe ich die eben auf Webspace:
http://mitglied.lycos.de/neuessternentor/CIni.h
http://mitglied.lycos.de/neuessternentor/CIni.cppDie heißen zwar bei mir nicht CIni, aber das spielt ja keine Rolle - richtig eingebunden sind sie definitiv.
Gruß
-
also wenn du einfach:
CIni ini;schreibst sucht der nach einem ini-file mit dem namen deines projektes
(also z.B. MailProjekt.ini).
du musst ihm also den namen der ini datei mitgeben:// ... CIni ini( "mailchecker.ini", "sektion" ); // datei und sektion beachten // in der for-schleife CString intervall; intervall.Format( "%s%d", "Intervall", 0 ); ... = ini.GetInt( intervall );also die ini dateien sind ja immer so aufgebaut:
[sektion]
Intervall0=123
Intervall1=456[irgendwas]
KeineAhnung=abcusw.
deshalb musst du auch noch eine sektion angeben.
schau deshalb nach, wie dein ini-file aufgebaut ist und gib die
parameter entsprechend im konstruktor von CIni an.
-
Okay, ich weiß was Du meinst und habs auch gemacht.
Alerdings bin ich mir nach 2 Stunden herumprobieren nun sehr sicher, dass es daran nicht liegt. Bei der Check-Funktion, die Prüft, ob einer der Werte kleiner ist als 5 greife ich ja auch erfolgreich drauf zu, ohne dass ich was anders machen müsste. Das kann ich nachprüfen, weil ich ja händisch kleinere Werte eintragen kann (in die mailchecker.ini) - und da er die Datei, wie gewünscht neu schreibt, wenn er einen Wert kleiner 5 findet, kann es das eigentlich nicht sein.
Darüberhinaus legt das Programm ja ne ganze Reihe von Dateien an, manche mit dem Dateityp "ini" andere mit dem Typ "dat" (dat ist dasnn ge-scrambelt, also nicht im Klartext lesbar) - und keine von denen ist irgendwie in der CIni-Klasse erwähnt.
Ich hab jetzt mal das Füllen der Combo-Box nochmal angesehen:
Wenn ich da folgendes eingebe:
BOOL CPPgMailchecker::OnInitDialog() { CPropertyPage::OnInitDialog(); DWORD strVar[10]; for (int i = 0; i < 10; i++){ theApp.glob_prefs->LoadMailIntervalFile(strVar, 10); // NÄCHSTE ZEILE! m_MailReqInterval.SetItemData(m_MailReqInterval.AddString("Interval"+strVar[i]), i ); // m_MailReqInterval.SetItemData(i, (DWORD_PTR)strVar[i] ); } LoadSettings(); Localize(); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }Dann hab ich folgendes Ergebnis:
"Interval" steht in der Combo-Box aber nichts dahinter. IMHO ist der Vektor nach wie vor leer. Wieso weiß ich immer noch nicht. Für mich steht außer Zweifel dass ich auf die mailchecker.ini zugreifen kann (wie gesagt, das programm erstellt einen ganzen Haufen Dateien, und keine davon wird irgendwie anders angesprochen, als ich meine mailchecker.ini anspreche.Der Vektor ist leer, weil ich wohl die Daten falsch auslese, aber auf die Daten zugreifen und auslesen kann ich (siehe Check-Funktion). Nur wenn sie in den Vektor kommen geht wohl was schief.
Naja - trotzdem vielen Dank für Deine Hilfe - erlebt man nicht so häufig, dass jemand so viel Geduld. Vielen Dank dafür.
Gruß