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

  • Learn How A Global Entertainment Company Saw a 448% ROI Every business today uses software to manage systems, deliver products, and empower employees to do their jobs. But software inevitably breaks, and when it does, businesses lose money -- in the form of dissatisfied customers, missed SLAs or lost productivity. PagerDuty, an operations performance platform, solves this problem by helping operations engineers and developers more effectively manage and resolve incidents across a company's global operations. …

  • Today's agile organizations pose operations teams with a tremendous challenge: to deploy new releases to production immediately after development and testing is completed. To ensure that applications are deployed successfully, an automatic and transparent process is required. We refer to this process as Zero Touch Deployment™. This white paper reviews two approaches to Zero Touch Deployment--a script-based solution and a release automation platform. The article discusses how each can solve the key …

Most Popular Programming Stories

More for Developers

RSS Feeds