⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.cpp

📁 TRichView/RichView 是一套地道的Delphi/C++Builder控件
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#include <vcl\Clipbrd.hpp>
#if __BORLANDC__ > 0x0530
#include <vcl\Jpeg.hpp>
#endif
#pragma hdrstop

#include "CtrlImg.hpp"
#include "RVTable.hpp"
#include "RVMisc.hpp"

#include "Unit1.h"
#include "PreviewFrm.h"
#include "RVUndoStr.h"
#include "CPFrm.h"
#include "PropFrm.h"
#include "ListFrm.h"
#include "OptionsFrm.h"
//---------------------------------------------------------------------------
#pragma link "RVEdit"
#pragma link "RichView"
#pragma link "RVScroll"
#pragma link "PtblRV"
#pragma link "RVStyle"
#pragma link "CtrlImg"
#pragma link "RVTable"
#pragma link "RVMisc"
#pragma link "RVUni"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
// This function is used in mitEditCheckpointClick() and mitEditPropsClick()
// to convert tag to string
AnsiString GetTagStr(int Tag)
{
  if (Form1->RichViewEdit1->Options.Contains(rvoTagsArePChars))
    if (!Tag)
      return "";
    else
      return (char*)Tag;
  else
    return IntToStr(Tag);
}
// This function is used in mitEditCheckpointClick() and mitEditPropsClick()
// to create tags from string TagStr (user input in edit box)
int MakeTag(const AnsiString TagStr)
{
   if (TagStr!="" &&
       Form1->RichViewEdit1->Options.Contains(rvoTagsArePChars))
   {
     char* r = StrNew(TagStr.c_str());
     return (int)r;
   }
   else
     return StrToIntDef(TagStr,0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   Randomize;

   HTMLSaveOptions << rvsoImageSizes << rvsoUseCheckpointsNames;
   HTMLTitle = "Demo File";

  // We need to register classes in order to load them from rvf files
  TComponentClass Classes[3] = { __classid(TButton), __classid(TEdit), __classid(TOleContainer) };
  RegisterClasses(Classes,2);

  RVStyle1->TextStyles->Items[11]->FontName = GetUnicodeFontName();

   // This demo program is saved in C++Builder 1, where Charset property is not available.
   // So assigning non-default charset here:
#if __BORLANDC__ > 0x520
   RVStyle1->TextStyles->Items[6]->Charset = SYMBOL_CHARSET;
   RVStyle1->ListStyles->Items[0]->Levels->Items[0]->Font->Charset = SYMBOL_CHARSET;
#endif

   // Items can have associated "tags" - integers or strings.
   // Comment next line to use integer tags
   RichViewEdit1->Options << rvoTagsArePChars;

   RichViewEdit1->LoadRVF(ExtractFilePath(Application->ExeName)+"Readme.rvf");
   FillStyleCombo(RVStyle1->ParaStyles, cmbPara);
   FillStyleCombo(RVStyle1->TextStyles, cmbText);
   RichViewEdit1->Format();
   cmbPara->ItemIndex = RichViewEdit1->CurParaStyleNo;
   cmbText->ItemIndex = RichViewEdit1->CurTextStyleNo;
   UpdateUndoMenu();
}
//---------------------------------------------------------------------------
// Returning available Unicode-enabled font
AnsiString TForm1::GetUnicodeFontName()
{
  if (Screen->Fonts->IndexOf("Arial Unicode MS")>=0)
    return "Arial Unicode MS";
  if (Screen->Fonts->IndexOf("Lucida Sans Unicode")>=0)
    return "Lucida Sans Unicode";
  return "Arial";
}
//---------------------------------------------------------------------------
// Filling combobox with standard styles 
void TForm1::FillStyleCombo(TCustomRVInfos* Styles, TComboBox* cmb)
{
  /* The simplest way to fill the combo box with style names is:
    cmb.Items.Assign(Styles);
    But this code will fill the combo box with all styles -
    both standard styles (i.e. real styles) and non-standard styles will be
    added in it.
    So we'll fill in the combo box manually.
    For simplification, we'll add only the first standard styles */
  cmb->Items->BeginUpdate();
  cmb->Items->Clear();
  for (int i = 0; i< Styles->Count; i++)
  {
    if (!((TCustomRVInfo*)(Styles->Items[i]))->Standard)
      break;
    cmb->Items->Add(((TCustomRVInfo*)(Styles->Items[i]))->StyleName);
  }
  cmb->Items->EndUpdate();
}
//---------------------------------------------------------------------------
void TForm1::UpdateUndoMenu()
{
  TRVUndoType UndoType = RichViewEdit1->UndoAction();
  mitUndo->Enabled = UndoType!=rvutNone;
  if (UndoType==rvutCustom)
    mitUndo->Caption = "Undo "+RichViewEdit1->UndoName();
  else
    mitUndo->Caption = "Undo "+RVUndoTypeNamesEn[UndoType];

  UndoType = RichViewEdit1->RedoAction();
  mitRedo->Enabled = UndoType!=rvutNone;
  if (UndoType==rvutCustom)
    mitRedo->Caption = "Redo "+RichViewEdit1->RedoName();
  else
    mitRedo->Caption = "Redo "+RVUndoTypeNamesEn[UndoType];
}
//---------------------------------------------------------------------------
void TForm1::DisplayUnicodeWarning()
{
  bool wasclear = RichViewEdit1->ItemCount==0;
  // This method is called before loading Unicode
  // (when inserting Unicode, editor automatically switches to Unicode style,
  // according to RVStyle1->DefUnicodeStyle, if necessary)
  if (!RVStyle1->TextStyles->Items[RichViewEdit1->CurTextStyleNo]->Unicode)
    Application->MessageBox("Loading/Inserting Unicode data using non-Unicode text style.\n"
                           "Text will be converted.\n"
                           "Choose 'Unicode' style in combo to use Unicode text style",
                           "Warning", MB_OK | MB_ICONEXCLAMATION);
  if (wasclear)
    RichViewEdit1->Clear();
}
//======================================================================
// Font and paragraph combos
//======================================================================
void __fastcall TForm1::RichViewEdit1CurParaStyleChanged(TObject *Sender)
{
  if (RichViewEdit1->CurParaStyleNo < cmbPara->Items->Count)
    cmbPara->ItemIndex = RichViewEdit1->CurParaStyleNo;
  else
    cmbPara->ItemIndex = -1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RichViewEdit1CurTextStyleChanged(TObject *Sender)
{
  if (RichViewEdit1->CurTextStyleNo < cmbText->Items->Count)
    cmbText->ItemIndex = RichViewEdit1->CurTextStyleNo;
  else
    cmbText->ItemIndex = -1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cmbParaClick(TObject *Sender)
{
   RichViewEdit1->ApplyParaStyle(cmbPara->ItemIndex);
   RichViewEdit1->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::cmbTextClick(TObject *Sender)
{
   RichViewEdit1->ApplyTextStyle(cmbText->ItemIndex);
   RichViewEdit1->SetFocus();
}
//======================================================================
// Main menu: "File"
//======================================================================
// File|Load...
void __fastcall TForm1::mitLoadClick(TObject *Sender)
{
  OpenDialog1->Title = "Loading & Import";
  OpenDialog1->Filter = "RichView Format Files(*.rvf)|*.rvf|"
                        "RTF Files (*.rtf)|*.rtf|"
                        "Text Files - autodetect (*.txt)|*.txt|"
                        "ANSI Text Files (*.txt)|*.txt|"
                        "Unicode Text Files (*.txt)|*.txt";
  if (OpenDialog1->Execute())
  {
    Screen->Cursor = crHourGlass;
    int CurTextStyleNo = RichViewEdit1->CurTextStyleNo;
    int CurParaStyleNo = RichViewEdit1->CurParaStyleNo;
    bool r;
    CloseOleContainer();
    RichViewEdit1->Clear();
    RichViewEdit1->CurTextStyleNo = CurTextStyleNo;
    RichViewEdit1->CurParaStyleNo = CurParaStyleNo;
    RVStyle1->DefUnicodeStyle = -1;
    switch (OpenDialog1->FilterIndex)
    {
      case 1: // RVF
        r = RichViewEdit1->LoadRVF(OpenDialog1->FileName);
        break;
      case 2: // RTF
        r = RichViewEdit1->LoadRTF(OpenDialog1->FileName);
        break;
      case 3: // Text
        if (RV_TestFileUnicode(OpenDialog1->FileName)==rvutYes)
        {
          DisplayUnicodeWarning();
          r = RichViewEdit1->LoadTextW(OpenDialog1->FileName,CurTextStyleNo,CurParaStyleNo,false);
        }
        else
          r = RichViewEdit1->LoadText(OpenDialog1->FileName,CurTextStyleNo,CurParaStyleNo,false);
        break;
      case 4: // ANSI text
        r = RichViewEdit1->LoadText(OpenDialog1->FileName,CurTextStyleNo,CurParaStyleNo,false);
        break;
      case 5: // Unicode text
        DisplayUnicodeWarning();
        r = RichViewEdit1->LoadTextW(OpenDialog1->FileName,CurTextStyleNo,CurParaStyleNo,false);
        break;
      default:
        r = False;
    }
    Screen->Cursor = crDefault;
    if (!r)
    {
      AnsiString ErrorMessage = "Error during loading";
      if (OpenDialog1->FilterIndex==1)
        ErrorMessage += GetRVFErrors();
      Application->MessageBox(ErrorMessage.c_str(), "Error", 0);
    }
    FillStyleCombo(RVStyle1->ParaStyles, cmbPara);
    FillStyleCombo(RVStyle1->TextStyles, cmbText);
    RichViewEdit1->Format();
    cmbPara->ItemIndex = RichViewEdit1->CurParaStyleNo;
    cmbText->ItemIndex = RichViewEdit1->CurTextStyleNo;
    UpdateUndoMenu();
  }
}
//---------------------------------------------------------------------------
// Event: picture needed while reading from RVF
void __fastcall TForm1::RichViewEdit1RVFPictureNeeded(TCustomRichView *Sender,
    AnsiString Name, int Tag, TGraphic *&gr)
{
  gr = new Graphics::TBitmap;
  gr->LoadFromFile(ExtractFilePath(Application->ExeName)+"default.bmp");
}
//---------------------------------------------------------------------------
// Event: control needed while reading from RVF
void __fastcall TForm1::RichViewEdit1RVFControlNeeded(TCustomRichView *Sender,
    AnsiString Name, int Tag, TControl *&ctrl)
{
  ctrl = new TButton ((TComponent*)NULL);
  ((TButton*)(ctrl))->Caption = "from file";
}
//---------------------------------------------------------------------------
// Event: imagelist needed while reading from RVF
void __fastcall TForm1::RichViewEdit1RVFImageListNeeded(TCustomRichView *Sender,
    int ImageListTag, TCustomImageList *&il)
{
  il = this->il;
}
//---------------------------------------------------------------------------
AnsiString TForm1::GetRVFErrors()
{
  AnsiString Result = "";
  if (RichViewEdit1->RVFWarnings.Contains(rvfwUnknownPicFmt))
    Result += "unknown picture format;";
  if (RichViewEdit1->RVFWarnings.Contains(rvfwUnknownCtrls))
    Result += "unknown control class;";
  if (RichViewEdit1->RVFWarnings.Contains(rvfwConvUnknownStyles))
    Result += "text, paragraph or list style is not present;";
  if (RichViewEdit1->RVFWarnings.Contains(rvfwConvLargeImageIdx))
    Result += "invalid image-list index;";
  if (Result.Length()>0)
    Result = "\n("+Result+")";
  return Result;
}
//---------------------------------------------------------------------------
// File|Save...
void __fastcall TForm1::mitSaveClick(TObject *Sender)
{
  SaveDialog1->Title = "Save & Export";
  SaveDialog1->Filter = "RichView Format files(*.rvf)|*.rvf|"
                        "RTF Files (*.rtf)|*.rtf|"
                        "Text (*.txt)|*.txt|"
                        "Unicode Text (*.txt)|*.txt|"
                        "HTML - with CSS (*.htm;*.html)|*.htm;*.html"
                        "HTML - Simplified (*.htm;*.html)|*.htm;*.html|";

  SaveDialog1->DefaultExt = "rvf";
  if (SaveDialog1->Execute())
  {
    Screen->Cursor = crHourGlass;
    bool r;
    switch (SaveDialog1->FilterIndex)
    {
      case 1: // RVF
        r = RichViewEdit1->SaveRVF(SaveDialog1->FileName, false);
        break;
      case 2: // RTF
        r = RichViewEdit1->SaveRTF(SaveDialog1->FileName, false);
        break;
      case 3: // ANSI Text (byte per character)
        r = RichViewEdit1->SaveText(SaveDialog1->FileName, 80);
        break;
      case 4: // Unicode Text (2 bytes per character)
        r = RichViewEdit1->SaveTextW(SaveDialog1->FileName, 80);
        break;
      case 5: // HTML with CSS
        r = RichViewEdit1->SaveHTMLEx(SaveDialog1->FileName, HTMLTitle,"img",
          "","","", HTMLSaveOptions);
        break;
      case 6: // HTML
        r = RichViewEdit1->SaveHTML(SaveDialog1->FileName, HTMLTitle,"img",
          HTMLSaveOptions);
        break;
      default:
        r = false;
    }
    Screen->Cursor = crDefault;
    if (!r)
      Application->MessageBox("Error during saving", "Error", 0);
  }
}
//---------------------------------------------------------------------------
// File | Options
void __fastcall TForm1::OptionsforSavingLoading1Click(TObject *Sender)
{
  TRVFOptions RVFOptions;
  frmOptions->SetOptions(RichViewEdit1->RVFOptions, HTMLSaveOptions, HTMLTitle);
  if (frmOptions->ShowModal()==mrOk)
  {
    frmOptions->GetOptions(RVFOptions, HTMLSaveOptions, HTMLTitle);
    RichViewEdit1->RVFOptions = RVFOptions;
  }
}
//---------------------------------------------------------------------------
// Event: saving controls in HTML
// Note: code below works normally in Internet Explorer
// Netscape 3 and 4 does not support <INPUT> tags outside <FORM></FORM> tags
// (Netscape 6 does)
void __fastcall TForm1::RichViewEdit1SaveComponentToFile(
    TCustomRichView *Sender, AnsiString Path, TPersistent *SaveMe,
    TRVSaveFormat SaveFormat, AnsiString &OutStr)
{
  switch (SaveFormat)
  {
   case rvsfText:
     OutStr = AnsiString("(")+SaveMe->ClassName()+")";
     break;
   case rvsfHTML:
     if (SaveMe->InheritsFrom(__classid(TButton)))
     {
       OutStr = "<INPUT type=\"button\" value=\""+((TButton*)SaveMe)->Caption+"\" "
                "onClick=\"alert('Just a demo')\">";
       return;
     }
     if (SaveMe->InheritsFrom(__classid(TEdit)))
     {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -