]> git.saurik.com Git - wxWidgets.git/blame - docs/latex/wx/config.tex
Added some files I forgot about
[wxWidgets.git] / docs / latex / wx / config.tex
CommitLineData
c4afa2cb
VZ
1\section{\class{wxConfigBase}}\label{wxconfigbase}
2
3wxConfigBase class defines the basic interface of all config classes. It can
4not be used by itself (it's an abstract base class) and you'll always use one
b8de493f 5of its derivations: \helpref{wxIniConfig}{wxiniconfig},
c4afa2cb
VZ
6\helpref{wxFileConfig}{wxfileconfig}, \helpref{wxRegConfig}{wxregconfig} or
7any other.
8
9However, usually you don't even need to know the precise nature of the class
10you're working with but you would just use the wxConfigBase methods. This
11allows you to write the same code regardless of whether you're working with
12the registry under Win32 or text-based config files under Unix (or even
13Windows 3.1 .INI files if you're really unlucky). To make writing the portable
14code even easier, wxWindows provides a typedef \helpref{wxConfig}{wxconfig}
15which is mapped onto the native wxConfigBase implementation on the given
16platform: i.e. wxRegConfig under Win32, wxIniConfig under Win16 and
17wxFileConfig otherwise.
18
19See \helpref{config overview}{configoverview} for the descriptions of all
20features of this class.
21
22\wxheading{Derived from}
23
24No base class
25
26\wxheading{Example}
27
28Here is how you would typically use this class:
29
30\begin{verbatim}
31 // using wxConfig instead of writing wxFileConfig or wxRegConfig enhances
32 // portability of the code
33 wxConfig *config = new wxConfig("MyAppName");
34
35 wxString str;
36 if ( config->Read(&str, "LastPrompt") ) {
b8de493f 37 // last prompt was found in the config file/registry and its value is now
c4afa2cb
VZ
38 // in str
39 ...
40 }
41 else {
42 // no last prompt...
43 }
44
45 // another example: using default values and the full path instead of just
46 // key name: if the key is not found , the value 17 is returned
47 long value = config->Read("/LastRun/CalculatedValues/MaxValue", -1);
48 ...
49 ...
50 ...
51 // at the end of the program we would save everything back
52 config->Write("LastPrompt", str);
53 config->Write("/LastRun/CalculatedValues/MaxValue", value);
54
55 // the changes will be written back automatically
56 delete config;
57\end{verbatim}
58
59This basic example, of course, doesn't show all wxConfig features, such as
60enumerating, testing for existence and deleting the entries and groups of
b8de493f 61entries in the config file, its abilities to automatically store the default
c4afa2cb
VZ
62values or expand the environment variables on the fly. However, the main idea
63is that using this class is easy and that it should normally do what you
64expect it to.
65
66NB: in the documentation of this class, the words "config file" also mean
67"registry hive" for wxRegConfig and, generally speaking, might mean any
b8de493f 68physical storage where a wxConfigBase-derived class stores its data.
c4afa2cb
VZ
69
70\wxheading{See also}
71
72\helpref{wxIniConfig}{wxiniconfig}, \helpref{wxFileConfig}{wxfileconfig},
73\helpref{wxRegConfig}{wxregconfig}
74
b8de493f 75\latexignore{\rtfignore{\wxheading{Function groups}}}
c4afa2cb 76
b8de493f 77\membersection{Static functions}
c4afa2cb 78
b8de493f 79These function deal with the "default" config object. Although its usage is
c4afa2cb
VZ
80not at all mandatory it may be convenient to use a global config object
81instead of creating and deleting the local config objects each time you need
82one (especially because creating a wxFileConfig object might be a time
83consuming operation). In this case, you may create this global config object
84in the very start of the program and {\it Set()} it as the default. Then, from
85anywhere in your program, you may access it using the {\it Get()} function. Of
86course, you should delete it on the program termination (otherwise, not only a
87memory leak will result, but even more importantly the changes won't be
88written back!).
89
90As it happens, you may even further simplify the procedure described above:
91you may forget about calling {\it Set()}. When {\it Get()} is called and there
92is no current object, it will create one using {\it Create()} function. To
93disable this behaviour {\it DontCreateOnDemand()} is provided.
94
b8de493f
JS
95\helpref{Set}{wxconfigbaseset}\\
96\helpref{Get}{wxconfigbaseget}\\
97\helpref{Create}{wxconfigbasecreate}\\
98\helpref{DontCreateOnDemand}{wxconfigbasedontcreateondemand}
c4afa2cb 99
b8de493f 100\membersection{Constructor and destructor}
c4afa2cb 101
b8de493f
JS
102\helpref{wxConfigBase}{wxconfigbasector}\\
103\helpref{\destruct{wxConfigBase}}{wxconfigbasedtor}
c4afa2cb 104
b8de493f 105\membersection{Path management}
c4afa2cb
VZ
106
107As explained in \helpref{config overview}{configoverview}, the config classes
108support a file system-like hierarchy of keys (files) and groups (directories).
109As in the file system case, to specify a key in the config class you must use
110a path to it. Config classes also support the notion of the current group,
111which makes it possible to use the relative paths. To clarify all this, here
112is an example (it's only for the sake of demonstration, it doesn't do anything
113sensible!):
114
115\begin{verbatim}
116 wxConfig *config = new wxConfig("FooBarApp");
117
118 // right now the current path is '/'
119 conf->Write("RootEntry", 1);
120
121 // go to some other place: if the group(s) don't exist, they will be created
122 conf->SetPath("/Group/Subgroup");
123
124 // create an entry in subgroup
125 conf->Write("SubgroupEntry", 3);
126
127 // '..' is understood
128 conf->Write("../GroupEntry", 2);
129 conf->SetPath("..");
130
131 wxASSERT( conf->Read("Subgroup/SubgroupEntry", 0l) == 3 );
132
133 // use absolute path: it's allowed, too
134 wxASSERT( conf->Read("/RootEntry", 0l) == 1 );
135\end{verbatim}
136
b8de493f 137{\it Warning}: it's probably a good idea to always restore the path to its
c4afa2cb 138old value on function exit:
b8de493f 139
c4afa2cb
VZ
140\begin{verbatim}
141 void foo(wxConfigBase *config)
142 {
143 wxString strOldPath = config->GetPath();
144
145 config->SetPath("/Foo/Data");
146 ...
147
148 config->SetPath(strOldPath);
149 }
150\end{verbatim}
151
152because otherwise the assert in the following example will surely fail
153(we suppose here that {\it foo()} function is the same as above except that it
154doesn't save and restore the path):
155
156\begin{verbatim}
157 void bar(wxConfigBase *config)
158 {
159 config->Write("Test", 17);
160
161 foo(config);
162
163 // we're reading "/Foo/Data/Test" here! -1 will probably be returned...
164 wxASSERT( config->Read("Test", -1) == 17 );
165 }
166\end{verbatim}
167
168Finally, the path separator in wxConfigBase and derived classes is always '/',
b8de493f 169regardless of the platform (i.e. it's {\bf not} '$\backslash\backslash$' under Windows).
c4afa2cb 170
b8de493f
JS
171\helpref{SetPath}{wxconfigbasesetpath}\\
172\helpref{GetPath}{wxconfigbasegetpath}
c4afa2cb 173
b8de493f 174\membersection{Enumeration}
c4afa2cb
VZ
175
176The functions in this section allow to enumerate all entries and groups in the
b8de493f 177config file. All functions here return FALSE when there are no more items.
c4afa2cb 178
b8de493f 179You must pass the same index to GetNext and GetFirst (don't modify it).
c4afa2cb
VZ
180Please note that it's {\bf not} the index of the current item (you will have
181some great surprizes with wxRegConfig if you assume this) and you shouldn't
182even look at it: it's just a "cookie" which stores the state of the
183enumeration. It can't be stored inside the class because it would prevent you
184from running several enumerations simultaneously, that's why you must pass it
185explicitly.
186
187Having said all this, enumerating the config entries/groups is very simple:
188
189\begin{verbatim}
190 wxArrayString aNames;
191
192 // enumeration variables
193 wxString str;
194 long dummy;
195
196 // first enum all entries
197 bool bCont = config->GetFirstEntry(str, dummy);
198 while ( bCont ) {
199 aNames.Add(str);
200
201 bCont = GetConfig()->GetNextEntry(str, dummy);
202 }
203
204 ... we have all entry names in aNames...
205
206 // now all groups...
207 bCont = GetConfig()->GetFirstGroup(str, dummy);
208 while ( bCont ) {
209 aNames.Add(str);
210
211 bCont = GetConfig()->GetNextGroup(str, dummy);
212 }
213
214 ... we have all group (and entry) names in aNames...
215
216\end{verbatim}
217
b8de493f 218There are also functions to get the number of entries/subgroups without
c4afa2cb
VZ
219actually enumerating them, but you will probably never need them.
220
b8de493f
JS
221\helpref{GetFirstGroup}{wxconfigbasegetfirstgroup}\\
222\helpref{GetNextGroup}{wxconfigbasegetnextgroup}\\
223\helpref{GetFirstEntry}{wxconfigbasegetfirstentry}\\
224\helpref{GetNextEntry}{wxconfigbasegetnextentry}\\
225\helpref{GetNumberOfEntries}{wxconfigbasegetnumberofentries}\\
226\helpref{GetNumberOfGroups}{wxconfigbasegetnumberofgroups}
c4afa2cb 227
b8de493f 228\membersection{Tests of existence}
c4afa2cb 229
b8de493f
JS
230\helpref{HasGroup}{wxconfigbasehasgroup}\\
231\helpref{HasEntry}{wxconfigbasehasentry}\\
232\helpref{Exists}{wxconfigbaseexists}
c4afa2cb 233
b8de493f 234\membersection{Key access}
c4afa2cb
VZ
235
236These function are the core of wxConfigBase class: they allow you to read and
237write config file data. All {\it Read} function take a default value which
238will be returned if the specified key is not found in the config file.
239
240Currently, only two types of data are supported: string and long (but it might
241change in the near future). To work with other types: for {\it int} or {\it
242bool} you can work with function taking/returning {\it long} and just use the
243casts. Better yet, just use {\it long} for all variables which you're going to
b8de493f 244save in the config file: chances are that \verb$sizeof(bool) == sizeof(int) == sizeof(long)$ anyhow on your system. For {\it float}, {\it double} and, in
c4afa2cb
VZ
245general, any other type you'd have to translate them to/from string
246representation and use string functions.
247
248Try not to read long values into string variables and vice versa: although it
249just might work with wxFileConfig, you will get a system error with
250wxRegConfig because in the Windows registry the different types of entries are
251indeed used.
252
253Final remark: the {\it szKey} parameter for all these functions can contain an
254arbitrary path (either relative or absolute), not just the key name.
255
b8de493f
JS
256\helpref{Read}{wxconfigbaseread}\\
257\helpref{Write}{wxconfigbasewrite}\\
258\helpref{Flush}{wxconfigbaseflush}
259
260\membersection{Delete entries/groups}
261
262The functions in this section delete entries and/or groups of entries from the
263config file. {\it DeleteAll()} is especially useful if you want to erase all
264traces of your program presence: for example, when you uninstall it.
265
266\helpref{DeleteEntry}{wxconfigbasedeleteentry}\\
267\helpref{DeleteGroup}{wxconfigbasedeletegroup}\\
268\helpref{DeleteAll}{wxconfigbasedeleteall}
269
270\membersection{Options}
271
272Some aspects of wxConfigBase behaviour can be changed during run-time. The
273first of them is the expansion of environment variables in the string values
274read from the config file: for example, if you have the following in your
275config file:
276
277\begin{verbatim}
278 # config file for my program
279 UserData = $HOME/data
280
281 # the following syntax is valud only under Windows
282 UserData = %windir%\\data.dat
283\end{verbatim}
284
285the call to \verb$config->Read("UserData")$ will return something like
286\verb$"/home/zeitlin/data"$ if you're lucky enough to run a Linux system ;-)
287
288Although this feature is very useful, it may be annoying if you read a value
289which containts '\$' or '\%' symbols (\% is used for environment variables
290expansion under Windows) which are not used for environment variable
291expansion. In this situation you may call SetExpandEnvVars(FALSE) just before
292reading this value and SetExpandEnvVars(TRUE) just after. Another solution
293would be to prefix the offending symbols with a backslash.
294
295The following functions control this option:
296
297\helpref{IsExpandingEnvVars}{wxconfigbaseisexpandingenvvars}\\
298\helpref{SetExpandingEnvVars}{wxconfigbasesetexpandingenvvars}\\
299\helpref{SetRecordDefaults}{wxconfigbasesetrecorddefaults}\\
300\helpref{IsRecordingDefaults}{wxconfigbaseisrecordingdefaults}
301
302%%%%% MEMBERS HERE %%%%%
303\helponly{\insertatlevel{2}{
304
305\wxheading{Members}
306
307}}
308
309\membersection{wxConfigBase::GetFirstGroup}\label{wxconfigbasegetfirstgroup}
310
311\constfunc{bool}{GetFirstGroup}{\param{wxString\& }{str}, \param{long\&}{ index}}
312
313\membersection{wxConfigBase::GetNextGroup}\label{wxconfigbasegetnextgroup}
314
315\constfunc{bool}{GetNextGroup}{\param{wxString\& }{str}, \param{long\&}{ index}}
316
317\membersection{wxConfigBase::GetFirstEntry}\label{wxconfigbasegetfirstentry}
318
319\constfunc{bool}{GetFirstEntry}{\param{wxString\& }{str}, \param{long\&}{ index}}
320
321\membersection{wxConfigBase::GetNextEntry}\label{wxconfigbasegetnextentry}
322
323\constfunc{bool}{GetNextEntry}{\param{wxString\& }{str}, \param{long\&}{ index}}
324
325See the example above.
326
327\membersection{wxConfigBase::GetNumberOfEntries}\label{wxconfigbasegetnumberofentries}
328
329\constfunc{uint }{GetNumberOfEntries}{\param{bool }{bRecursive = FALSE}}
330
331\membersection{wxConfigBase::GetNumberOfGroups}\label{wxconfigbasegetnumberofgroups}
332
333\constfunc{uint}{GetNumberOfGroups}{\param{bool }{bRecursive = FALSE}}
334
335Get number of entries/subgroups in the current group, with or without
336its subgroups.
337
338\membersection{wxConfigBase::Set}\label{wxconfigbaseset}
339
340\func{wxConfigBase *}{Set}{\param{wxConfigBase *}{pConfig}}
341
342Sets the config object as the current one, returns the pointer to the previous
343current object (both the parameter and returned value may be NULL)
344
345\membersection{wxConfigBase::Get}\label{wxconfigbaseget}
346
347\func{wxConfigBase *}{Get}{\void}
348
349Get the current config object. If there is no current object, creates one
350(using {\it Create}) unless DontCreateOnDemand was called previously.
351
352\membersection{wxConfigBase::Create}\label{wxconfigbasecreate}
353
354\func{wxConfigBase *}{Create}{\void}
355
356Create a new config object: this function will create the "best"
357implementation of wxConfig available for the current platform, see
358comments near the definition of wxCONFIG\_WIN32\_NATIVE for details. It returns
359the created object and also sets it as the current one.
360
361\membersection{wxConfigBase::DontCreateOnDemand}\label{wxconfigbasedontcreateondemand}
362
363\func{void}{DontCreateOnDemand}{\void}
364
365Calling this function will prevent {\it Get()} from automatically creating a
366new config object if the current one is NULL. It might be useful to call it
367near the program end to prevent new config object "accidental" creation.
368
369\membersection{wxConfigBase::wxConfigBase}\label{wxconfigbasector}
370
371\func{}{wxConfigBase}{\void}
372
373This is the default and only constructor of wxConfigBase class. It initializes
374it options: by default, environment variable expansion is on and recording
375defaults is off.
376
377\membersection{wxConfigBase::\destruct{wxConfigBase}}\label{wxconfigbasedtor}
378
379\func{}{\destruct{wxConfigBase}}{\void}
380
381Empty but ensures that dtor of all derived classes is virtual.
382
383\membersection{wxConfigBase::SetPath}\label{wxconfigbasesetpath}
384
385\func{void}{SetPath}{\param{const wxString\& }{strPath}}
386
387Set current path: if the first character is '/', it's the absolute path,
388otherwise it's a relative path. '..' is supported. If the strPath
389doesn't exist it is created.
390
391\membersection{wxConfigBase::GetPath}\label{wxconfigbasegetpath}
392
393\constfunc{const wxString\& }{GetPath}{\void}
394
395Retrieve the current path (always as absolute path).
396
397\membersection{wxConfigBase::HasGroup}\label{wxconfigbasehasgroup}
398
399\constfunc{bool}{HasGroup}{\param{const wxString\& }{strName}}
400
401returns TRUE if the group by this name exists
402
403\membersection{wxConfigBase::HasEntry}\label{wxconfigbasehasentry}
404
405\constfunc{bool}{HasEntry}{\param{wxString\& }{strName}}
406
407returns TRUE if the entry by this name exists
408
409\membersection{wxConfigBase::Exists}\label{wxconfigbaseexists}
410
411\constfunc{bool}{Exists}{\param{wxString\& }{strName}}
412
413returns TRUE if either a group or an entry with a given name exists
414
415\membersection{wxConfigBase::Read}\label{wxconfigbaseread}
416
417\constfunc{bool}{Read}{\param{wxString *}{pStr}, \param{const char *}{szKey}, \param{const char *}{szDefault = NULL}}
c4afa2cb
VZ
418
419Read a string from the key: returns TRUE if value was really read, FALSE if
420default was used (the default value is returned if the key wasn't found)
421
b8de493f 422\constfunc{const char *}{Read}{\param{const char *}{szKey}, \param{const char *}{szDefault = NULL}}
c4afa2cb
VZ
423
424Another version of {\it Read()} using static buffer.
425
426NB: although this function seems more convenient, you should only use it if
427you know what you're doing! As it uses a static buffer, it means it will be
428overwritten after each call to this function! If you do use it, you should
429save the returned value to a wxString as soon as possible.
430
b8de493f 431\constfunc{long }{Read}{\param{const char *}{szKey}, \param{long}{ lDefault}}
c4afa2cb
VZ
432
433Read a long value from the key and return it (lDefault is returned if key not
434found).
435
436NB: writing
437\begin{verbatim}
438 conf->Read("key", 0);
439\end{verbatim}
440won't work because the call is ambiguous: compiler can not choose between 2
441{\it Read} functions. Instead, just write
442\begin{verbatim}
443 conf->Read("key", 0l);
444\end{verbatim}
445
b8de493f 446\constfunc{bool}{Read}{\param{long*}{ pl}, \param{const char*}{ szKey}, \param{long}{ lDefault = 0}}
c4afa2cb
VZ
447
448Another function for reading long values, it returns TRUE if the key was
449really read from config file and FALSE if the default value was used.
450
b8de493f
JS
451\membersection{wxConfigBase::Write}\label{wxconfigbasewrite}
452
453\func{bool}{Write}{\param{const char*}{ szKey}, \param{const char*}{ szValue}}
454
455\func{bool}{Write}{\param{const char*}{ szKey}, \param{long}{ lValue}}
c4afa2cb
VZ
456
457Both of these functions write the specified value to the config file and
b8de493f
JS
458return TRUE on success.
459
460\membersection{wxConfigBase::Flush}\label{wxconfigbaseflush}
c4afa2cb 461
b8de493f 462\func{bool}{Flush}{\param{bool }{bCurrentOnly = FALSE}}
c4afa2cb
VZ
463
464permanently writes all changes (otherwise, they're only written from object's
465destructor)
466
b8de493f 467\membersection{wxConfigBase::DeleteEntry}\label{wxconfigbasedeleteentry}
c4afa2cb 468
b8de493f 469\func{bool}{DeleteEntry}{\param{const char*}{ szKey}, \param{bool}{ bDeleteGroupIfEmpty = TRUE}}
c4afa2cb
VZ
470
471Deletes the specified entry and the group it belongs to if
472it was the last key in it and the second parameter is true.
473
b8de493f
JS
474\membersection{wxConfigBase::DeleteGroup}\label{wxconfigbasedeletegroup}
475
476\func{bool}{DeleteGroup}{\param{const char*}{ szKey}}
c4afa2cb
VZ
477
478Delete the group (with all subgroups)
479
b8de493f
JS
480\membersection{wxConfigBase::DeleteAll}\label{wxconfigbasedeleteall}
481
482\func{bool}{DeleteAll}{\void}
c4afa2cb
VZ
483
484Delete the whole underlying object (disk file, registry key, ...). Primarly
485for use by desinstallation routine.
486
b8de493f 487\membersection{wxConfigBase::IsExpandingEnvVars}\label{wxconfigbaseisexpandingenvvars}
c4afa2cb 488
b8de493f 489\constfunc{bool}{IsExpandingEnvVars}{\void}
c4afa2cb 490
b8de493f 491\membersection{wxConfigBase::SetExpandingEnvVars}\label{wxconfigbasesetexpandingenvvars}
c4afa2cb 492
b8de493f 493\func{void}{SetExpandEnvVars }{\param{bool }{bDoIt = TRUE}}
c4afa2cb 494
b8de493f 495The second option is recording of the default values: if it is on (default
c4afa2cb
VZ
496is off) all default values are written back to the config file. This allows
497the user to see what config options may be changed and is probably useful only
498for wxFileConfig.
499
b8de493f
JS
500The next functions control this option.
501
502\membersection{wxConfigBase::SetRecordDefaults}\label{wxconfigbasesetrecorddefaults}
503
504\func{void}{SetRecordDefaults}{\param{bool }{bDoIt = TRUE}}
505
506\membersection{wxConfigBase::IsRecordingDefaults}\label{wxconfigbaseisrecordingdefaults}
c4afa2cb 507
b8de493f 508\func{bool}{IsRecordingDefaults}{\void} const
c4afa2cb 509