MMMainFrm.cpp
上传用户:daoqigc
上传日期:2021-04-20
资源大小:2795k
文件大小:5k
源码类别:

RichEdit

开发平台:

Delphi

  1. /*------------------------------------------------------------------------------}
  2. {
  3.   Very simple "mail merging" application.
  4.   It loads a template from TEMPLATE.RVF, and data from CUSTOMERS.TXT.
  5.   Template can be modified with another application in this directory:
  6.   TEMPLATEEDITOR.
  7.   Main settings:
  8.   - since field names are stored in tags (see the help topic about tags)
  9.     as strings, rvoTagsArePChars is included in Options of rvTemplate and
  10.     rvOutput.
  11.   - this demo uses a predefined set of styles (right click richviews,
  12.     choose "Settings" from the context menu, choose "Use a predefined
  13.     set of styles"). That means - only two text styles (see below) will be used.
  14.   - rvOutput->Style = rvsOutput, rvTemplate->Style = rvsTemplate.
  15.   - rvsTemplate has absolutely the same set of TextStyles as in template editor
  16.     (0th style - normal text, 1th - field code)
  17.   - rvsOutput has a similar set of styles, but 1th text style looks like
  18.     normal text.
  19. }
  20. ------------------------------------------------------------------------------*/
  21. #include <vclvcl.h>
  22. #include <stdio.h>
  23. #pragma hdrstop
  24. #include "MMMainFrm.h"
  25. //---------------------------------------------------------------------------
  26. #pragma link "RichView"
  27. #pragma link "RVScroll"
  28. #pragma link "RVStyle"
  29. #pragma resource "*.dfm"
  30. TForm1 *Form1;
  31. //---------------------------------------------------------------------------
  32. __fastcall TForm1::TForm1(TComponent* Owner)
  33. : TForm(Owner)
  34. {
  35. }
  36. //---------------------------------------------------------------------------
  37. void ReadString(char*s, FILE*F)
  38. {
  39.    fgets(s, 200, F);
  40.    int i=0;
  41.    while (s[i])
  42.    {
  43.      if (s[i]=='n')
  44.        s[i]=0;
  45.      i++;
  46.    }
  47. }
  48. //---------------------------------------------------------------------------
  49. /*
  50.   This procedure loads file CUSTOMERS.TXT into:
  51.   - ListBox1->Items (<- names of customers)
  52.   - Codes (<- codes of customers)
  53.   In real applications data can be stored in some database
  54. */
  55. //---------------------------------------------------------------------------
  56. void TForm1::LoadCustomers()
  57. {
  58.   FILE* F = fopen((ExtractFilePath(Application->ExeName)+"Customers.txt").c_str(), "rt");
  59.   char s[200];
  60.   ReadString(s,F);
  61.   int Count = StrToIntDef(s, 0);
  62.   for (int i=0; i<Count; i++)
  63.   {
  64.     ReadString(s,F);
  65.     Codes->Add(s);
  66.     ReadString(s,F);
  67.     ListBox1->Items->Add(Trim((AnsiString)s));
  68.   }
  69.   fclose(F);
  70. }
  71. //---------------------------------------------------------------------------
  72. /*
  73.   Initialization: loading template into rvOutput, loading customers data.
  74. */
  75. void __fastcall TForm1::FormCreate(TObject *Sender)
  76. {
  77.   Codes = new TStringList;
  78.   LoadCustomers();
  79.   rvTemplate->LoadRVF(ExtractFilePath(Application->ExeName)+"template.rvf");
  80.   rvTemplate->Format();
  81.   if (ListBox1->Items->Count)
  82.   {
  83.     ListBox1->ItemIndex = 0;
  84.     ListBox1->OnClick(NULL);
  85.   }
  86. }
  87. //---------------------------------------------------------------------------
  88. void __fastcall TForm1::FormDestroy(TObject *Sender)
  89. {
  90.   delete Codes;
  91.   Codes = NULL;
  92. }
  93. //---------------------------------------------------------------------------
  94. /*
  95.   This function returns a current field value by the field name.
  96.   In this example, we have two fields: "name" and "code"
  97. */
  98. AnsiString TForm1::GetFieldValueFromDatabase(const AnsiString FieldName)
  99. {
  100.   int Index = ListBox1->ItemIndex;
  101.   if (FieldName=="name")
  102.     return ListBox1->Items->Strings[Index];
  103.   if (FieldName=="code")
  104.     return Codes->Strings[Index];
  105.   return "{error: illegal field code}";
  106. }
  107. //---------------------------------------------------------------------------
  108. /*
  109.   This function iterates through all items in RVData, and if tag of
  110.   some text contains non-empty text, it calls GetFieldValueFromDatabase(tag) and
  111.   replace this text with returned value.
  112.   You can move this function to your application unchanged.
  113.   Initial call: FillFields(RichView.RVData);
  114. */
  115. void TForm1::FillFields(TCustomRVData* RVData)
  116. {
  117.   for (int i=0; i<RVData->ItemCount; i++)
  118.     if (RVData->GetItemStyle(i)==rvsTable)
  119.     {
  120.       TRVTableItemInfo* table = (TRVTableItemInfo*)(RVData->GetItem(i));
  121.       for (int r=0; r<table->Rows->Count; r++)
  122.         for (int c=0; c<table->Rows->Items[r]->Count; c++)
  123.           if (table->Cells[r][c])
  124.             FillFields(table->Cells[r][c]->GetRVData());
  125.       table->Changed();
  126.     }
  127.     else if (RVData->GetItemStyle(i)>=0)
  128.     {
  129.       AnsiString FieldName = PChar(RVData->GetItemTag(i));
  130.       if (FieldName!="")
  131.         RVData->SetItemText(i, GetFieldValueFromDatabase(FieldName));
  132.     }
  133. }
  134. //---------------------------------------------------------------------------
  135. /*
  136.   On highlighting a new list box item: updating document in rvOutput.
  137. */
  138. void __fastcall TForm1::ListBox1Click(TObject *Sender)
  139. {
  140.   rvOutput->Clear();
  141.   if (ListBox1->ItemIndex>=0)
  142.   {
  143.     rvOutput->LoadRVF(ExtractFilePath(Application->ExeName)+"template.rvf");
  144.     FillFields(rvOutput->RVData);
  145.     rvOutput->Format();
  146.   }
  147. }
  148. //---------------------------------------------------------------------------