How to make WriteLog do summary sheets in TXT or RTF format.
The wizard doesn't put any code in the ScoreStuff() entry point.
Here is an example that should help you make it happen.

Be sure to read the "Contest Create Summary Sheet" help topic
in WriteLog's help file. It shows how you can tell 
WriteLog to make fixed width columns.

HRESULT CHaDx::ScoreStuff(
								Configuration_Entry_t FAR *MasterConfig, 
								const char FAR *UserPath, 
								const char *SummName, 
								const char *Template,
								short RtfMode)
{
    unsigned long QsoNum;
	Configuration_Entry_t *(Configs[3]);
    char                    path[512];
    int                     i;
    QsoPtr_t                FirstQ;
	long			Pts;
	long			Mults;
    char   Year[5];
    char   BandQs[MAXIMUM_BANDS][5];
    char   BandQps[MAXIMUM_BANDS][6]; 
    char   MultiplierBuf[MAXIMUM_BANDS][4];
	char	QsoPointBuf[16];
	char	MulCountBuf[16];
	char	ScoreBuf[16];
    char	CountyBuf[16];
	char	HadxcBuf[16];

    Configuration_Entry_t PointConfigs[] =
    {
    
        {"*year*", Year},
        {"*qsopoints*", QsoPointBuf},
        {"*multipliers*", MulCountBuf},
        {"*claimed*", ScoreBuf},
        {"*county*", CountyBuf},
		{"*hadxc*", HadxcBuf},

        {"*160Qc*", &BandQs[0][0]},
        {"*80Qc*", &BandQs[1][0]},
        {"*40Qc*", &BandQs[2][0]},
        {"*20Qc*", &BandQs[3][0]},
        {"*15Qc*", &BandQs[4][0]},
        {"*10Qc*", &BandQs[5][0]},
        
        
        {"*160pc*", &BandQps[0][0]},
        {"*80pc*", &BandQps[1][0]},
        {"*40pc*", &BandQps[2][0]},
        {"*20pc*", &BandQps[3][0]},
        {"*15pc*", &BandQps[4][0]},
        {"*10pc*", &BandQps[5][0]},

 
        {"*160mc*", &MultiplierBuf[0][0]},
        {"*80mc*", &MultiplierBuf[1][0]},
        {"*40mc*", &MultiplierBuf[2][0]},
        {"*20mc*", &MultiplierBuf[3][0]},
        {"*15mc*", &MultiplierBuf[4][0]},
        {"*10mc*", &MultiplierBuf[5][0]},
       
            
      {0,0},
    };

 	Parent->NumberQsos(&QsoNum);
    FirstQ = GetQsoIth(0);
    Mults = 0;
	Pts = 0;
	
	memset(BandQs, 0, sizeof(BandQs));
	memset(MultiplierBuf, 0, sizeof(MultiplierBuf));
	memset(BandQps, 0, sizeof(BandQps));
	CountyBuf[0] = 0;
	HadxcBuf[0] = 0;
	if (m_AmInHA)
	{
		if (isdigit(m_MyMult[0]))
		{
			strcpy(HadxcBuf, m_MyMult);
		}
		else
		{
			strcpy(CountyBuf, m_MyMult);
		}
	}

    for (i = 0; i < NUM_BANDS; i += 1)
    {
		Pts += m_BandPoints[i];
		Mults += m_NamedMults[i];
		Mults += m_AygMults[i];
		_itoa(m_BandQsos[i], &BandQs[i][0], 10);
		_itoa(m_NamedMults[i]+m_AygMults[i], &MultiplierBuf[i][0], 10);
		_itoa(m_BandPoints[i], &BandQps[i][0], 10);
    }

	_itoa(Pts, QsoPointBuf, 10);
	_itoa(Mults, MulCountBuf, 10);
	_itoa(Pts * Mults, ScoreBuf, 10);
    
    Year[0] = 0;
    if (QsoNum && !Year[0])
	{
		QsoTimeUnpack_t tu;
		QSO_TIME_UNPACK(&tu, QSO_TIME_ADDR(FirstQ));
        *cvt_char(Year, sizeof(Year) - 1,
            (long)QSO_YEAR(&tu), 0) = 0;
	}
    
       
    Configs[0] = MasterConfig;
    Configs[1] = PointConfigs;
    Configs[2] = 0;
    GetPrivateProfileString("MULTIPLIERS",
                            "LOCATION",
                            "",
                            path, sizeof(path),
                            "WRITELOG.INI");
	strcat(path, Template);
	sco_DoSummStringSubst(path, SummName, Configs, RtfMode);

    return NOERROR;
}



The example above doesn't use one particular feature: the ability to
substitute a list of multipliers into the sheet. Here are additional 
instructions:

put something like this in the array of Configuration_Entry_t

		{"*dxmultiplierlist*", MultiplierBuffer},

The rest of this you can do some other way.
All you really need is to render the multiplier
list into a buffer, and put "^P" where you want line breaks.


MultiplierBuffer needs to be a char[] long enough to hold 
all the text you put into it. My code just multiplies a 
maximum length of the name of a multiplier by the maximum
number of multipliers and adds room for a title and whatever.

Then my code fills in MultiplierBuffer this way:

		CurPos = MultiplierBuffer;
		for (i = 0; i < NUM_BANDS; i += 1)
		{
			if (m_Mults[i])
			{
				strcpy(CurPos, BandTitles[i]);
				CurPos += strlen(CurPos);
				CurPos =  ListSections(m_NumSec,
									&sctCntArr[i][0],
									NameF,
									CurPos,
									6,
									NUM_PRINT_COLUMNS,
									0,
									(long) this);
			}
		}
		*CurPos = 0;

ListSections is a function in the environment set up by the wizard.
You have the sources to it. It puts "^p" where line breaks belong.

NameF is a function you must write. It looks like this:

const char *CArrlDxMM::NameFromIndex(int i)
{
	const char *mn = 0;
	m_NamedMults->NameFromIndex(i, (unsigned char **)&mn);
	return mn;
}

static const char * NameF(int i, long User)
{
	CArrlDxMM FAR *m;
	m = (CArrlDxMM FAR *) User;
	return m->NameFromIndex(i);
}
