I have encountered a lot of problems in the use of wxFileConfig.
But I solved it.
Now I've posted the class I made.
So as not to repeat these mistakes
//Using wxFileConfig, it should be seen as a path rather than a MAP
Code: Select all
//USConfig.h
#ifndef USCONFIG_H
#define USCONFIG_H
#include <wx/fileconf.h>
class USConfig : public wxFileConfig
{
public:
/** Default constructor */
USConfig(const wxString& localFile);
/** Default destructor */
virtual ~USConfig();
void SetSection(const wxString& sec);
bool SetItem(const wxString& key, const wxString& value);
bool SetItem(const wxString& key, long value);
wxString GetItem(const wxString& key);
long GetItem(const wxString& key, long defult );
void AllSection(wxArrayString &setionlist);
void AllKey(wxArrayString &keylist);
protected:
private:
wxString mSection;//
};
#endif // USCONFIG_H
Code: Select all
//USConfig.cpp
#include "USConfig.h"
USConfig::USConfig(const wxString& localFile)
:wxFileConfig(wxEmptyString, wxEmptyString, localFile, wxEmptyString, wxCONFIG_USE_RELATIVE_PATH)
{
//ctor
mSection.Clear();
}
USConfig::~USConfig()
{
//dtor
}
void USConfig::SetSection(const wxString& sec)
{
if(sec.IsEmpty()){return;}
mSection = sec;
wxString sSec = wxString::Format(_T("/%s"),mSection);
SetPath(sSec);
}
bool USConfig::SetItem(const wxString& key, const wxString& value)
{
wxString skey = wxString::Format(_T("/%s/%s"),mSection, key);
return Write(skey, value);
}
bool USConfig::SetItem(const wxString& key, long value)
{
wxString skey = wxString::Format(_T("/%s/%s"),mSection, key);
return Write(skey, value);
}
wxString USConfig::GetItem(const wxString& key)
{
wxString skey = wxString::Format(_T("/%s/%s"),mSection, key);
return Read(skey);
}
long USConfig::GetItem(const wxString& key, long defult)
{
wxString skey = wxString::Format(_T("/%s/%s"),mSection, key);
return Read(skey, defult);
}
void USConfig::AllSection(wxArrayString& setionlist)
{
wxString ret;
long sid;
setionlist.Clear();
SetPath(_T("/"));//Must return to the root or else it will not be found
bool sok = GetFirstGroup(ret, sid);
while(sok)
{
setionlist.Add(ret);
sok = GetNextGroup(ret, sid);
}
}
void USConfig::AllKey(wxArrayString& keylist)
{
wxString ret;
long sid;
keylist.Clear();
SetPath(_T("/"));//Must return to the root or else it will not be found
bool sok = GetFirstEntry(ret, sid);
while(sok)
{
keylist.Add(ret);
sok = GetNextEntry(ret, sid);
}
}
For example: I need to define two ports on different devices, and can't be the same as other devices.
Code: Select all
wxString GDevice(wxT("adbcdgdad");
long GPortA = 0, GPortB = 0;
USConfig config(_T("Config.ini"));
config.SetSection(GDevice);
GPortA = config.GetItem(_T("ProtA"), 0);
GPortB = config.GetItem(_T("ProtB"), 0);
if(GPortA == 0 || GPortB == 0)
{
int PortA = (int)((1000) + (rand()%100 + 1));//Port int 1000- 1199
int PortB = PortA + 1;
wxString str;
long nIndex;
wxArrayString sectiongroup;
config.AllSection(sectiongroup);
if(!sectiongroup.IsEmpty())
{
size_t nCount = sectiongroup.GetCount();
for(size_t n = 0; n < nCount; n++)
{
config.SetSection(sectiongroup[n]);
long porta = config.GetItem(_T("ProtA"), 0);
long portb = config.GetItem(_T("ProtB"), 0);
if(PortA == porta || PortB == porta || PortA == portb || PortB == portb)
{
//some other , take again
PortA = (int)((1000) + (rand()%100 + 1));////Port int 1000- 1199
PortB = PortA + 1;
n = -1;//for will +1, Cmp form head;
}
}
}
///save
config.SetSection(GDevice);//must be do it
GPortA = PortA;
GPortB = PortB;
config.Write(_T("ProtA"), GPortA);
config.Write(_T("ProtB"), GPortB);
}
Some people can optimize the USConfig is very much better and better