Click here to Skip to main content
15,888,527 members
Articles / Desktop Programming / MFC
Article

COptionTree

Rate me:
Please Sign up or sign in to vote.
4.95/5 (103 votes)
19 Sep 20025 min read 1.4M   15.8K   316   546
An article on an easy and neat way to include options, preferences, or settings into your applications

 

What's New with 2.0

The long awaited 2.0 version is here. Good news is you get new features, new options, new items, and new bugs. Bad news is, a lot has changed so you may need to change around your current code to implement the new version. (Thanks to Tom and Irfan for there fixes for bugs that haunted me at night when the lights are off. They deserve their names in bold.)

Contents

Features

Below are some of the many features that COptionTree has.

  • Static controls.
  • Edit controls.
  • Combo box controls.
  • Check box controls.
  • Radio controls.
  • Spinner controls.
  • Color controls.
  • Date and time controls.
  • Image controls.
  • Font controls.
  • Files and folders controls.
  • IP Address controls..
  • Hyperlink controls.
  • Automatic column resize limit.
  • Easy customized options for different GUI style.
  • Easy customized options for each control item.
  • And more...

Usage

You have two options for using COptionTree, you can use it in static form or as a DLL.

Add The following files to your project:

// DLL
/COptionTreeDemo/COptionTree DLL/DLL.h

// Static
/COptionTreeDemo/COptionTree DLL/*.*
/COptionTreeDemo/COptionTree DLL/res/*.*

Creating the control:

#include "OptionTree.h"

// Declare variables
CRect rcClient;
DWORD dwStyle, dwOptions;

// Get the clients rectangle
GetClientRect(rcClient);

// Setup the window style
dwStyle = WS_CHILD | WS_VISIBLE;

// Setup the tree options
dwOptions =  OT_OPTIONS_SHADEEXPANDCOLUMN | OT_OPTIONS_SHADEROOTITEMS;

// Create tree options
if (m_otTree.Create(dwStyle, rcClient, this, dwOptions,
    IDC_OPTIONSTREE_OPTIONS) == FALSE)
{
    TRACE0("Failed to create options control.\r\n");
    return FALSE;
}

// Insert tree items
// ...
Available Tree Options
OT_OPTIONS_SHOWINFOWINDOW        // Show information window
OT_OPTIONS_NOTIFY            // Send parent notifications        
OT_OPTIONS_DEFINFOTEXTNOSEL        // Show default info text for no 
                                     // selected item, otherwise blank
OT_OPTIONS_SHADEEXPANDCOLUMN    // Shade the expand column
OT_OPTIONS_SHADEROOTITEMS        // Shade the root items
Validating Tree Items
// Use COptionTreeItem::GetItemType() to get item type. Different item 
// definitions include.

OT_ITEM_STATIC
OT_ITEM_CHECKBOX
OT_ITEM_COLOR
OT_ITEM_COMBOBOX
OT_ITEM_DATE
OT_ITEM_EDIT
OT_ITEM_IMAGE
OT_ITEM_RADIO
OT_ITEM_SPINNER
OT_ITEM_FONT
OT_ITEM_FILE
OT_ITEM_IPADDRESS

API Reference

This is a list of the most common used functions of COptionTree's classes. There many more functions than this, but these give the average user enough to use the control.

COptionTree
BOOL COptionTree::Create(DWORD dwStyle, RECT rcRect, CWnd* pParentWnd, 
                         DWORD dwTreeOptions, UINT nID)
//Create the tree control and window.

void COptionTree::DeleteAllItems()
//Delete all items in the tree.

void COptionTree::DeleteItem(COptionTreeItem *otiItem)
//Delete an item from the tree.

void COptionTree::DisableInput(BOOL bDisable)
//Disable user input, use this instead of EnableWindow

COptionTreeItem * COptionTree::InsertItem(COptionTreeItem *otiItem, 
                                          COptionTreeItem *otiParent)
//Insert a new item into the tree. If otiParent is 
//NULL then the item becomes the root. InsertItem returns a pointer
//to the item.

COptionTreeItem
COptionTreeItem is a class used to handle items in a tree. Each options/preference is a different item. Depending on what type of item control is used, these functions are acquired by all control types.
void COptionTreeItem::SetLabelText(CString strLabel)
//Set the label text of an item.

CString COptionTreeItem::GetLabelText()
//Get the label text.

void COptionTreeItem::SetInfoText(CString strText)
//Set the information text that is displayed in the information window. 
//This can give the user a description of the item/option, and what it does.

CString COptionTreeItem::GetInfoText()
//Get the information text that is displayed in the information window. 

void COptionTreeItem::ReadOnly(BOOL bReadOnly)
//Set item to read only state.

BOOL COptionTreeItem::IsReadOnly()
//Returns TRUE if the item is read only.

void COptionTreeItem::OnSelect()
//Select the item.

BOOL COptionTreeItem::IsReadOnly()
//Returns TRUE if the item is selected.

COptionTreeItemStatic
COptionTreeItemStatic is a simple static control. The following are custom functions used to set the edit the static text.
void COptionTreeItemStatic::SetStaticText(CString strStaticText)
//Set the text for the static item.

CString COptionTreeItemStatic::GetStaticText()
//Get the text for the static item.

COptionTreeItemEdit
COptionTreeItemEdit handles like a regular edit control. You can also use all of the standard functions that you would normally use with a CEdit control.
BOOL COptionTreeItemEdit::CreateEditItem(BOOL bMultiline, BOOL bPassword, 
                                         BOOL bNumerical, DWORD dwAddStyle)
//Creates the edit window, returns TRUE if the window is created successful.

BOOL COptionTreeItemEdit::GetMultiline()
//Returns TRUE if edit is multiline.

BOOL COptionTreeItemEdit::GetNumerical()
//Returns TRUE if edit is numerical.

BOOL COptionTreeItemEdit::GetPassword()
//Returns TRUE if edit is password.

void COptionTreeItemEdit::SetMultiline(BOOL bMultiline)
//Set the edit multiline option.

void COptionTreeItemEdit::SetEditDouble(double dValue)
void COptionTreeItemEdit::SetEditDword(DWORD dwValue)
void COptionTreeItemEdit::SetEditFloat(float fValue)
void COptionTreeItemEdit::SetEditInt(int nValue)
void COptionTreeItemEdit::SetEditLong(long lValue)
//Set the edit text as a numerical value.

BOOL COptionTreeItemEdit::GetEditDouble(double &dReturn)
BOOL COptionTreeItemEdit::GetEditDword(DWORD &dwReturn)
BOOL COptionTreeItemEdit::GetEditFloat(float &fReturn)
BOOL COptionTreeItemEdit::GetEditInt(int &nReturn)
BOOL COptionTreeItemEdit::GetEditLong(long &lReturn)
//Get the edit text as a numerical value. If function returns FALSE the 
//text is not numerical.

COptionTreeItemComboBox
COptionTreeItemComboBox handles like a regular combo box control. You can also use all of the standard functions that you would normally use with a CComboBox control.
BOOL COptionTreeItemComboBox::CreateComboItem(DWORD dwAddStyle)
//Creates the edit window, returns TRUE if the window is created successful.

void COptionTreeItemComboBox::SetDropDownHeight(long lHeight)
//Set the height for the drop down window.

COptionTreeItemCheckBox
COptionTreeItemCheckBox is a check box control.
BOOL COptionTreeItemCheckBox::CreateCheckBoxItem(BOOL bChecked, BOOL bShowCheck, 
                                                 BOOL bShowText)
//Creates the check box window, returns TRUE if the window is created successful.

BOOL COptionTreeCheckButton::GetCheck()
//Returns TRUE if check box is checked.

void COptionTreeCheckButton::SetCheckText(CString strChecked, CString strUnChecked)
//Sets the checked text to be displayed when checked and unchecked.

COptionTreeItemRadio
COptionTreeItemRadio is a radio box control.
BOOL COptionTreeItemRadio::CreateRadioItem()
//Creates the radio box window. 

void COptionTreeItemRadio::InsertNewRadio(CString strText, BOOL bChecked)
//Insert a new radio item, this should be done in the order you wish the radio 
//items to be in.

int COptionTreeItemRadio::GetCheckedRadio()
//Gets the checked radio item in a 0 index form. Function returns -1 if error.

COptionTreeItemSpinner
COptionTreeItemSpinner is a spinner control that allows users to select numerical values..
BOOL COptionTreeItemSpinner::CreateSpinnerItem(BOOL bWrapAround, BOOL bUserEdit,
                          double dValue, double dRangeBottom, double dRangeTop)
//Creates the spinner window, returns TRUE if the window is created successful.

void COptionTreeSpinnerButton::SetEditDouble(double dValue)
void COptionTreeSpinnerButton::SetEditDword(DWORD dwValue)
void COptionTreeSpinnerButton::SetEditFloat(float fValue)
void COptionTreeSpinnerButton::SetEditInt(int nValue)
void COptionTreeSpinnerButton::SetEditLong(long lValue)
//Set the spinner value as a numerical value.

BOOL COptionTreeSpinnerButton::GetEditDouble(double &dReturn)
BOOL COptionTreeSpinnerButton::GetEditDword(DWORD &dwReturn)
BOOL COptionTreeSpinnerButton::GetEditFloat(float &fReturn)
BOOL COptionTreeSpinnerButton::GetEditInt(int &nReturn)
BOOL COptionTreeSpinnerButton::GetEditLong(long &lReturn)
//Get the spinner value as a numerical value. If function returns FALSE an error 
//occured.

void COptionTreeSpinnerButton::GetRange(double &dBottom, double &dTop)
//Gets the range for the spinner.

void COptionTreeSpinnerButton::SetRange(double dBottom, double dTop)
//Sets the range for the spinner.

COptionTreeItemColor
COptionTreeItemColor is a control to allow the user to select or set a custom color.
BOOL COptionTreeItemColor::CreateColorItem(COLORREF rcColor, 
                                           COLORREF rcAutomatic, BOOL bShowHex, 
                                           BOOL bLiveUpdate)
//Creates the color window, returns TRUE if the window is created successful.

COLORREF COptionTreeItemColor::GetColor()
//Gets the selected color.

void COptionTreeItemColor::SetColor(COLORREF rcColor)
//Sets the selected color.

void COptionTreeItemColor::SetShowHex(BOOL bShow)
//Sets the option to show hexadecimal or RGB values.

void COptionTreeItemColor::SetLiveUpdate(BOOL bLive)
//Sets the option to show live update colors.

COptionTreeItemDate
COptionTreeItemDate is a control to allow the user to select or set a date or time. You can also use all of the standard functions that you would normally use with a CDateTimeCtrl control.
BOOL COptionTreeItemDate::CreateDateItem(CString strFormat, DWORD dwDateStyle)
//Creates the date window, returns TRUE if the window is created successful.

COptionTreeItemImage
COptionTreeItemIcon is a control to allow the user to select an icon.
BOOL COptionTreeItemImage::CreateImageItem(DWORD dwOptions, CSize sImageSizes, 
                                           int nNumberColumns)
//Creates the icon window, returns TRUE if the window is created successful.

int COptionTreeItemImage::GetSelection()
//Gets the selected image in a 0 based index.

void COptionTreeItemImage::AddBitmap(CString strBitmap, COLORREF crMask, CString strText)
void COptionTreeItemImage::AddBitmap(UINT uBitmap, COLORREF crMask, CString strText)
void COptionTreeItemImage::AddBitmap(CBitmap &bBitmap, COLORREF crMask, CString strText)
void COptionTreeItemImage::AddIcon(UINT uIcon, CString strText)
void COptionTreeItemImage::AddIcon(HICON hIcon, CString strText)
//Insert a new image.
COptionTreeItemFont
COptionTreeItemFont is a control to allow the user to select an font.
BOOL COptionTreeItemFont::CreateFontItem(LOGFONT lfFont, COLORREF crFontColor, 
             LOGFONT lfDefaultFont, COLORREF crDefaultFontColor, DWORD dwOptions)
BOOL COptionTreeItemFont::CreateFontItem(LOGFONT lfFont, COLORREF crFontColor, 
             DWORD dwOptions)
BOOL COptionTreeItemFont::CreateFontItem(CHARFORMAT cfFont, COLORREF crFontColor, 
             CHARFORMAT cfDefaultFont, COLORREF crDefaultFontColor, DWORD dwOptions)
BOOL COptionTreeItemFont::CreateFontItem(CHARFORMAT cfFont, COLORREF crFontColor, 
             DWORD dwOptions)
//Creates the font window, returns TRUE if the window is created successful.

void COptionTreeItemIcon::SetCurFont(CHARFORMAT cfFont)
void COptionTreeItemIcon::SetCurFont(LOGFONT lf)
//Sets the font currently displayed.

void COptionTreeItemIcon::SetDefaultFont(CHARFORMAT cfFont)
void COptionTreeItemIcon::SetDefaultFont(LOGFONT lf)
//Sets the default font, that will be set when the default button is pushed.

void COptionTreeItemIcon::SetTextColor(COLORREF crColor)
//Sets the text color.

void COptionTreeItemIcon::SetDefaultTextColor(COLORREF crColor)
//Sets the text color for the default font.

void COptionTreeItemIcon::SetApplyWindow(CWnd *pWnd)
//Sets the window to be notified when the apply button is pressed.
COptionTreeItemFile
COptionTreeItemFile is a control to allow the user to select a file or folder.
//Creates the file window, returns TRUE if the window is created successful.
BOOL COptionTreeItemFile::CreateFileItem(CString strFile, CString strDefExt, 
                                         CString strFilter, DWORD dwOptions, 
                                         DWORD dwDlgFlags)

// gets information about the selected file(s).
CString COptionTreeItemFile::GetSelectedFolder()
CString COptionTreeItemFile::GetFileDrive()
CString COptionTreeItemFile::GetFileDir()
CString COptionTreeItemFile::GetFileExt()
CString COptionTreeItemFile::GetFileTitle()
CString COptionTreeItemFile::GetFileName()
CString COptionTreeItemFile::GetPathName()
CString COptionTreeItemFile::GetNextPathName(POSITION& pos)
POSITION GetStartPosition()
COptionTreeItemIPAddress
COptionTreeItemIPAddress is a control to allow the user to select a IP Address.
//Creates the ip address window, returns TRUE if the window is created successful.
BOOL COptionTreeItemIPAddress::CreateIPAddressItem(DWORD dwAddStyle)
COptionTreeItemHyperLink
COptionTreeItemHyperLink is a control to allow the user to click on a hyperlink.
// Creates the hyperlink window, returns TRUE if the window is created successful.
BOOL COptionTreeItemIPAddress::CreateHyperlinkItem(DWORD dwOptions, 
                   CString strLink, COLORREF crLink, COLORREF crHover = NULL, 
                   COLORREF crVisited = NULL)

Notifications

You can have your application be notified of certain events that happen in the tree control. Below is an example of how to be notified when an event happens, and all the notifications you can have.

YourDialog.h
//...
    //}}AFX_MSG_MAP
    ON_NOTIFY(OT_NOTIFY_ITEMCHANGED, IDC_OPTIONSTREE_OPTIONS, OnTreeItemChanged)
END_MESSAGE_MAP()
YourDialog.cpp
void CYourDialog::OnTreeItemChanged(NMHDR* pNotifyStruct, LRESULT* plResult)
{
    // Declare variables
    LPNMOPTIONTREE pNMOptionTree = (LPNMOPTIONTREE)pNotifyStruct;

    // Validate
    if (pNMOptionTree->pItem != NULL)
    {
        // -- Use item
        return 1;
    }

    *plResult = 0;
}
Available Notifications
OT_NOTIFY_INSERTITEM        // Insert item
OT_NOTIFY_DELETEITEM        // Delete item
OT_NOTIFY_DELETEALLITEMS    // Delete all items
OT_NOTIFY_ITEMCHANGED       // Item changed
OT_NOTIFY_ITEMBUTTONCLICK   // Item button click
OT_NOTIFY_SELCHANGE         // Selection changed
OT_NOTIFY_ITEMEXPANDING     // Item expanding
OT_NOTIFY_COLUMNCLICK       // Column click
OT_NOTIFY_PROPCLICK         // Property click

Creating Custom OptionTreeItem's

Creating custom tree controls is a difficult and drawn out process, but I do not want this to deter you from taking on the task. If you are an beginner program and have ideas for new controls, please let me know and I will see what I can do. If you are and advanced programmer and have created customized controls, please let me also know and I will include them in the next release. Some overrides you made need to know for OptionTreeItem are below, you can look at some of the code for the controls I have created to get an idea of how they are managed. Each control type, requires a different attack angle to implement it. A good place to start is to take a look at OptionTreeItemStatic, this is a simple control. OptionTreeItemEdit is a good place to go after you look at the static item.

void OptionTreeItem::DrawAttribute(CDC *pDC, const RECT &rcRect)
//Called when item needs to be painted.

void OptionTreeItem::OnActivate()
//Called when the item is clicked by mouse or enter key is pressed. This may 
//be where your control displays a window, or a menu.

void OptionTreeItem::OnCommit()
//Called when data has been committed, a confirmation that options have been
//changed. CommitChanges() is then called to handle the selection of data.

void OptionTreeItem::OnMove()
//Called when the item is moved.

void OptionTreeItem::OnMove()
//Called when item is refreshed.

void OptionTreeItem::OnSelect()
//Called when item is selected.

void OptionTreeItem::OnDeSelect()
//Called when item is deselected.

void OptionTreeItem::CleanDestroyWindow()
//Called when the Tree control is destroyed or when the item is deleted. This is 
//incase your item needs to destroy a window.

Acknowledgements

The COptionTree is inspired by code, ideas, and submissions from the following:

Version History

Below is the version history for COptionTree.

5/7/2002

1.0.0.0 Initial implementation.

5/10/2002 1.1.0.0 Fix problems with icon and color items. Also fixed problems with expanding columns and column size. Added TAB support, hit TAB to activate next item, and SHIFT TAB to activate previous item. NOTE: You must commit current item with the ENTER key before tabbing, this is because some controls use TAB i.e.) edit, control box, radio, and so on.

5/11/2002 1.1.1.0 Fixed IsWindow() issues, which are the causes for a lot of Win98 problems. Fixed IDC_HAND problem for non Win 2K or XP users. Fixed some resource and overhead problems. Also added expand all feature. Huge thanks go out to all bug reporters, especially YoSilver.

5/14/2002 1.1.2.0 Fixed icon and color bug. Also added GetItemType() to determine different item types.

9/1/2002 1.1.2.1 Beta release, beta is not stable by any means.

9/8/2002 2.0.0.0 The long awaited 2.0 version is here. Fixed a lot of bugs, created more bugs, added several more items, and a lot of other stuff that is way too much to list here. Oh plus I added fancy new version numbers, this I think was the biggest update.

Bug Reports

If you have a bug report, or a bug fix you can contact me through email or with the forums below. I would appreciate a notification of any bugs discovered or improvements that could be made to help the control grow for everyone.

License

This code is provided "as is" with no expressed or implied warranty.

You may use this code in a commercial product with or without acknowledgement. However you may not sell this code or any modification of this code, this includes commercial libraries and anything else for profit.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
AnswerRe: Changing StaticItem Label width? Pin
seas1199-May-07 16:58
seas1199-May-07 16:58 
AnswerRe: Changing StaticItem Label width? Pin
dunniu19-Nov-13 14:04
dunniu19-Nov-13 14:04 
QuestionA question about CComboBox Item Pin
pinger198117-Dec-06 15:39
pinger198117-Dec-06 15:39 
QuestionSave File Dialog? Pin
Franken8-Dec-06 14:00
Franken8-Dec-06 14:00 
GeneralPlease help me! [SOS] Pin
pinger19817-Dec-06 23:16
pinger19817-Dec-06 23:16 
GeneralRe: Please help me! [SOS] Pin
Franken8-Dec-06 13:38
Franken8-Dec-06 13:38 
GeneralSimply great! Pin
CPallini23-Nov-06 11:40
mveCPallini23-Nov-06 11:40 
GeneralOption model, accessing option items the same way [modified] Pin
alaincrouzet26-Oct-06 3:44
alaincrouzet26-Oct-06 3:44 
What about using any type of option tree item the same way ?

That's the purpose of this message giving a specification to reach this goal.

The design consists of two interfaces : OptionModel and OptionEditor.

OptionModel decides which editor to provide to edit an option.

class COptionModel
{
  public:
    virtual COptionEditor* EditOption(TOptionAvatar anOption) =0;
};

EditOption returns a pointer to the editor dedicated to the option specified.
It matches a particular COptionTreeItem class and is in charge of COptionTreeItem allocation (tree control attachment too) and data exchange & validation.

class COptionEditor
{
  public:
    virtual COptionTreeItem* CreateEditCtrl(TOptionAvatar anOption) =0;

    virtual void SetValue(COptionTreeItem* pItem, LPCTSTR lpszValue) =0;

    virtual BOOL GetValue(COptionTreeItem* pItem, CString &csValue) =0;
}

You exchange data from and to the control as a string (or another type shared among all option tree items).
Here is an interesting issue : you don't have to manage an OptionEditor per option item.
In place, you may obtain an OptionEditor each time you need to access the option and release the editor after use.
This is possible because the interfaces don't have impact on option tree items life cycle.

Note that, to implement your own option editor, you still need to know the COptionTreeItem-like classes details.

Is the code usable as if ?

No. This code is far more a specification of a model interface than an operative code.
Since I have a personnal implemention of it, you may be pleased to know that this isn't only words on paper.

To make the code operative, you need to:
- define what TOptionAvatar represents. For example, the project I work on has options stored as XML objects.
So, I decided TOptionAvatar to be a CString containing the XML description of the option.
- implement the OptionModel interface.
- implement an OptionEditor for each COptionTreeItem-like object you need : GetValue for some data pre-validation and data recovery. SetValue for post-validation and data update.

There are still some drawbacks :

- you cannot call some specific item interface without casting the pointer and then breaking the model hegemony.

- will have some problems returning binary values such as LOGFONT... You may be forced to change the type of data to be exchange (or the string to be used as an XML description)

- some complications with multi-value items...

- anything that doesn't fit the model specification...

Further improvement : Exchanging options values, as Dialog Data Exchange do, should be easy from now. Just get the editor object and voila!

A model improvement: sharing editor objects

In my mind, you may decide to manage a set of COptionEditor objects for each editor available.

This way COptionModel::EditOption will return the accurate pointer to an already allocated editor object.

Then we don't want to delete the pointer returned by CreateEditCtrl()!

"OK but I don't want to have to know if the pointer is to be deallocated", you will say and you are right.
So, I think of a convenient way to avoid the pain by modifying the interface:

class COptionEditor
{
  public:
    COptionEditor(BOOL bAutoDelete = TRUE);

    virtual COptionTreeItem* CreateEditCtrl(TOptionAvatar anOption) =0;

    virtual void SetValue(COptionTreeItem* pItem, LPCTSTR lpszValue) =0;

    virtual BOOL GetValue(COptionTreeItem* pItem, CString &csValue) =0;

    void Release();

    BOOL m_bAutoDelete;
}

COptionEditor::COptionEditor(BOOL bAutoDelete)
:m_bAutoDelete
{
}

void COptionEditor::Release()
{
  if ( m_bAutoDelete )
    delete this;
}

The interface now becomes an abstract class.

Call Release() after using the editor object. Set m_bAutoDelete member to FALSE if you want to use the editor object more that once.

1st exemple : editor is allocated when EditOption is called (default issue)
// Create an options model
CMyOptionModel myModel;

COptionEditor* pEditor;
pEditor = myModel.EditOption(aBoolOption("Show tool tips", TRUE));
pEditor->SetValue("FALSE");
pEditor->Release();
pEditor = NULL; // the pointer isn't valid any more and may not be kept!
pEditor = myModel.EditOption(ChoiceOption("Tries before failure", "1;2;3;4"));
pEditor->SetValue("3");
pEditor->Release();
pEditor = NULL;

Second exemple : editor object are share through multiple options
// In this exemple, the option editors are defined as static members

// Allocate model global ressources
CMyOptionModel::InitGlobalEditors();

// Create an options model
CMyOptionModel myModel;

COptionEditor* pEditor;
pEditor = myModel.EditOption(aBoolOption("Show tool tips", TRUE));
pEditor->SetValue("FALSE");
pEditor->Release();
pEditor = NULL; // even if the pointer remains valid, you should not keep it anymore (see first exemple for explanation)

pEditor = myModel.EditOption(ChoiceOption("Tries before failure", "1;2;3;4"));
pEditor->SetValue("3");
pEditor->Release();
pEditor = NULL;

// Deallocate model global ressources
CMyOptionModel::DeallocateGlobalEditors();

---
Not an english man. Just a frenchee


-- modified at 10:13 Thursday 26th October, 2006
GeneralVery thanks for this great job! [modified] Pin
alaincrouzet25-Oct-06 21:45
alaincrouzet25-Oct-06 21:45 
GeneralHyperLink Pin
kiranin18-Oct-06 19:51
kiranin18-Oct-06 19:51 
GeneralBinding data pointers to tree items Pin
User 5826197-Sep-06 22:41
User 5826197-Sep-06 22:41 
GeneralDynamic Adding of Items Pin
Tydia-kun7-Sep-06 2:49
Tydia-kun7-Sep-06 2:49 
GeneralRe: Dynamic Adding of Items Pin
Patrik Mueller7-Sep-06 20:36
Patrik Mueller7-Sep-06 20:36 
GeneralRe: Dynamic Adding of Items Pin
Tydia-kun8-Sep-06 0:27
Tydia-kun8-Sep-06 0:27 
QuestionLicense Pin
mk44tr19-Jul-06 11:24
mk44tr19-Jul-06 11:24 
AnswerRe: License Pin
crazyjeb8024-Jul-06 7:28
crazyjeb8024-Jul-06 7:28 
QuestionHow to change Label size? Pin
newkkd11-Jul-06 19:43
newkkd11-Jul-06 19:43 
QuestionNotification Message from Spinner Control Pin
raghu_try23-Jun-06 2:11
raghu_try23-Jun-06 2:11 
QuestionWhy I can't get a double result? Pin
yuanwenmao12-May-06 2:09
yuanwenmao12-May-06 2:09 
Generalvery thank you ! Pin
zffp11-May-06 23:44
zffp11-May-06 23:44 
GeneralMouse pointer disapppears when on the border between columns Pin
blacharnia7-Apr-06 0:57
blacharnia7-Apr-06 0:57 
GeneralRe: Mouse pointer disapppears when on the border between columns Pin
Rainer Schuster19-Apr-06 4:52
Rainer Schuster19-Apr-06 4:52 
GeneralRe: Mouse pointer disapppears when on the border between columns Pin
blacharnia19-Apr-06 21:42
blacharnia19-Apr-06 21:42 
GeneralRe: Mouse pointer disapppears when on the border between columns Pin
User 58261928-Aug-06 21:31
User 58261928-Aug-06 21:31 
GeneralRe: Mouse pointer disapppears when on the border between columns Pin
jjhd_m21-May-07 4:51
jjhd_m21-May-07 4:51 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.