CString Extensions for Resource Loading and String Formatting

The following classes were developed to simplify my life and clean up my code and perhaps they can do the same for you. They are simple classes, but allow an easy load of a string resource ( important for internationalization ) as well as an easy way to format strings.

Class Definitions

// Load resource
class CResString : public CString
{
public:	
 CResString(): CString() {}; 
	 
 CResString(UINT nResID) 
 { 
  Init();
  VERIFY(LoadString(nResID) != 0);
  _ASSERTE( m_pchData );
 };

 void operator () (UINT nResID)
 {
  Init();
  VERIFY(LoadString(nResID) != 0);
  _ASSERTE( m_pchData );
 }
};

// Format 
class CFmtString : public CString
{
public:	
 CFmtString(): CString() {}; 

 CFmtString( char *szFormat, ... ) 
 { 
  Init();
  va_list argList;
  va_start( argList, szFormat );
  FormatV( szFormat, argList );
 };

 CFmtString( UINT uResID, ... ) 
 { 
  Init();
  va_list argList;
  CResString sFormat( uResID );
  va_start( argList, sFormat );
  FormatV( sFormat, argList );
 };

 void operator () ( char *szFormat, ... )
 {
  Init();
  va_list argList;
  va_start( argList, szFormat );
  FormatV( szFormat, argList );
 }

 void operator () ( UINT uResID, ... )
 {
  Init();
  va_list argList;
  CResString sFormat( uResID );
  va_start( argList, sFormat );
  FormatV( sFormat, argList );
 }
};

Examples of Using the CResString Class

CResString sSection(IDS_DATAOBJECTSECTION);
	
// Use sSection

// ...

// Load another string

sSection(IDS_INVALIDOBJECT);

Example of Using the CFmtString Class

CFmtString sCommand(_T("SELECT %s FROM %s WHERE %s = %d"),
                    sColumn1, sTable, sColumn2, nID );
	
// Use sQuery

// ...

// Format another
	
sCommand(_T("UPDATE %s SET %s = %d WHERE %s = %d"),  
         sTable, sColumn1, nValue, sColumn2, nID );

Downloads

Download source - 1 Kb


Comments

  • Update for .NET?

    Posted by Legacy on 01/10/2003 12:00am

    Originally posted by: HJG

    Seems that the Init() and Release() methods aren't available in Visual Studio .NET, and the protected data member m_pchData isn't avaiable either.

    Anyone have a modified version of CResString for .NET?

    Thanks.

    Reply
  • Release your leak

    Posted by Legacy on 10/16/2001 12:00am

    Originally posted by: Josh Reed

    Calling Release() prior to reuse will cure your leak.
    How appropriate.
    I had thought that Init() would've handled this, but
    apparently not.
    Have another pint on me.

    void operator () (UINT nResID)
    {
    Release();
    Init();
    VERIFY(LoadString(nResID) != 0);
    _ASSERTE( m_pchData );
    }

    void operator () ( char *szFormat, ... )
    {
    Release();
    Init();
    va_list argList;
    va_start( argList, szFormat );
    FormatV( szFormat, argList );
    }

    void operator () ( UINT uResID, ... )
    {
    Release();
    Init();
    va_list argList;
    CResString sFormat( uResID );
    va_start( argList, 0 );
    FormatV( sFormat, argList );
    }

    Reply
  • Great but i'm leaking like a man with ten pints of beer in his belly

    Posted by Legacy on 08/29/2001 12:00am

    Originally posted by: Tim Stubbs

    CResString sSection(IDS_DATAOBJECTSECTION);
    

    // Use sSection

    // ...

    // Load another string

    sSection(IDS_INVALIDOBJECT);

    From your example...

    Problem - I'm leaking memory when i load a 2nd resource
    string into the same object... Still working out why
    atm but i thought i'd mention it in the interim. Works
    fine if you don't do the "Load another string" section
    above :(


    LATER:

    Also same problem if you reformat the same object i.e.

    CFmtString hello(_T("%s"), _T("Hello"));
    hello(_T("%s"), _T("You"));

    Reply
  • Great class, just one thing

    Posted by Legacy on 05/03/2001 12:00am

    Originally posted by: Ron van Gelderen

    This class is a great help for dealing with strings.

    There's one bug in the code that causes trouble in the CFmtString class:

    CFmtString( UINT uResID, ... )
    {
    Init();
    va_list argList;
    CResString sFormat( uResID );
    // va_start( argList, sFormat ); // this line should be replaced...
    va_start( argList, uResID); // with this line!
    FormatV( sFormat, argList );
    };

    void operator () ( UINT uResID, ... )
    {
    Init();
    va_list argList;
    CResString sFormat( uResID );
    // va_start( argList, sFormat ); // this line should be replaced...
    va_start( argList, uResID); // with this line!

    FormatV( sFormat, argList );
    }


    -Ron

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • IBM Worklight is a mobile application development platform that lets you extend your business to mobile devices. It is designed to provide an open, comprehensive platform to build, run and manage HTML5, hybrid and native mobile apps.

  • On-demand Event Event Date: October 23, 2014 Despite the current "virtualize everything" mentality, there are advantages to utilizing physical hardware for certain tasks. This is especially true for backups. In many cases, it is clearly in an organization's best interest to make use of physical, purpose-built backup appliances rather than relying on virtual backup software (VBA - Virtual Backup Appliances). Join us for this webcast to learn why physical appliances are preferable to virtual backup appliances, …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds