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

RichEdit

开发平台:

Delphi

  1. //---------------------------------------------------------------------------
  2. #include <vclvcl.h>
  3. #include <ShellApi.h>
  4. #pragma hdrstop
  5. #include "Demo5Frm.h"
  6. //---------------------------------------------------------------------------
  7. #pragma link "RichView"
  8. #pragma link "RVScroll"
  9. #pragma link "RVStyle"
  10. #pragma resource "*.dfm"
  11. TfrmDemo5 *frmDemo5;
  12. //---------------------------------------------------------------------------
  13. __fastcall TfrmDemo5::TfrmDemo5(TComponent* Owner)
  14.     : TForm(Owner)
  15. {
  16. }
  17. //---------------------------------------------------------------------------
  18. bool IsAddress(AnsiString s)
  19. {
  20.   // Checks for prefix.
  21.   // For better results, it should check for lengths...
  22.   s = UpperCase(s);
  23.   return
  24.         (s.Pos("HTTP://")  ==1) ||
  25.         (s.Pos("FTP://")   ==1) ||
  26.         (s.Pos("FILE://")  ==1) ||
  27.         (s.Pos("GOPHER://")==1) ||
  28.         (s.Pos("MAILTO://")==1) ||
  29.         (s.Pos("HTTPS://") ==1) ||
  30.         (s.Pos("MAILTO:")  ==1) ||
  31.         (s.Pos("NEWS:")    ==1) ||
  32.         (s.Pos("TELNET:")  ==1) ||
  33.         (s.Pos("WAIS:")    ==1) ||
  34.         (s.Pos("WWW.")     ==1) ||
  35.         (s.Pos("FTP.")     ==1);
  36. }
  37. //---------------------------------------------------------------------------
  38. bool IsEmail(const AnsiString s)
  39. {
  40.   //'@' must exist and '.' must be after it. This is not comprehensive test,
  41.   //but I think that it's ok
  42.   int p1 = s.Pos("@");
  43.   if (!p1)
  44.     return false;
  45.   char * pchr = StrRScan(s.c_str(),'.');
  46.   if (!pchr)
  47.     return false;
  48.   int p2 = pchr-s.c_str()+1;
  49.   return p1<=p2;
  50. }
  51. //---------------------------------------------------------------------------
  52. void AddWithURLs(AnsiString s, TRichView* rv, int DefStyle, int UrlStyle)
  53. {
  54.   AnsiString Before = "";
  55.   int ParaNo = 0;
  56.   if (s=="")
  57.   {
  58.     rv->AddNL("", DefStyle, ParaNo);
  59.     return;
  60.   }
  61.   while (s!="")
  62.   {
  63.     int p = s.Pos(" ");
  64.     if (!p)
  65.       p = s.Length()+1;
  66.     AnsiString CurrentWord = s.SubString(1, p-1);
  67.     AnsiString Space = s.SubString(p, 1);
  68.     s = s.SubString(p+1, s.Length());
  69.     if (IsAddress(CurrentWord) || IsEmail(CurrentWord))
  70.     {
  71.       if (Before!="")
  72.       {
  73.         rv->AddNL(Before, DefStyle, ParaNo);
  74.         ParaNo = -1;
  75.         Before = "";
  76.       }
  77.       rv->AddNL(CurrentWord, UrlStyle, ParaNo);
  78.       ParaNo = -1;
  79.       if (Space!="")
  80.         rv->Add(Space, DefStyle);
  81.     }
  82.     else
  83.       Before += CurrentWord+Space;
  84.    }
  85.    if (Before!="")
  86.      rv->AddNL(Before, DefStyle, ParaNo);
  87. }
  88. //---------------------------------------------------------------------------
  89. void __fastcall TfrmDemo5::FormCreate(TObject *Sender)
  90. {
  91.   pan->ClientHeight = edit->Height;
  92.   edit->SetBounds(0,0,pan->ClientWidth,pan->ClientHeight);
  93.   rv->AddNL("Use right-click menu to freeze scrolling when appending text", 2, 0);
  94.   rv->AddNL("Try quick-copy: selection is copied automatically when done", 2, 0);
  95.   AddWithURLs("You can use URLs and e-mail ( like www.trichview.com )",
  96.               rv, 2, 1);
  97.   rv->Format();
  98. }
  99. //---------------------------------------------------------------------------
  100. void __fastcall TfrmDemo5::FormResize(TObject *Sender)
  101. {
  102.    edit->Width = pan->ClientWidth;    
  103. }
  104. //---------------------------------------------------------------------------
  105. void __fastcall TfrmDemo5::editKeyPress(TObject *Sender, char &Key)
  106. {
  107.   if (Key=='r')
  108.   {
  109.     AddWithURLs(edit->Text,rv,0,1);
  110.     rv->FormatTail();
  111.     Key = 0;
  112.     edit->Text = "";
  113.   }
  114. }
  115. //---------------------------------------------------------------------------
  116. void __fastcall TfrmDemo5::rvSelect(TObject *Sender)
  117. {
  118.   // Quick-copy
  119.   if (rv->SelectionExists())
  120.   {
  121.     rv->CopyDef();
  122.     rv->Deselect();
  123.     rv->Invalidate();
  124.   }
  125. }
  126. //---------------------------------------------------------------------------
  127. void __fastcall TfrmDemo5::pmPopup(TObject *Sender)
  128. {
  129.   mitFreezescrolling->Checked = ! rv->Options.Contains(rvoScrollToEnd);    
  130. }
  131. //---------------------------------------------------------------------------
  132. void __fastcall TfrmDemo5::mitFreezescrollingClick(TObject *Sender)
  133. {
  134.   if (rv->Options.Contains(rvoScrollToEnd))
  135.     rv->Options >> rvoScrollToEnd;
  136.   else
  137.     rv->Options << rvoScrollToEnd;
  138. }
  139. //---------------------------------------------------------------------------
  140. void __fastcall TfrmDemo5::rvJump(TObject *Sender, int id)
  141. {
  142.   int ItemNo = rv->GetJumpPointItemNo(id);
  143.   AnsiString s = rv->GetItemText(ItemNo);
  144.   if (!IsAddress(s) && IsEmail(s))
  145.     s = "mailto:"+s;
  146.   ShellExecute(Application->Handle, "open", s.c_str(), NULL, NULL, SW_NORMAL);
  147. }
  148. //---------------------------------------------------------------------------
  149. void __fastcall TfrmDemo5::FormKeyDown(TObject *Sender, WORD &Key,
  150.     TShiftState Shift)
  151. {
  152.   if (Key==VK_ESCAPE)
  153.      Close();    
  154. }
  155. //---------------------------------------------------------------------------