Features:
- Import vocabularies from Dr.eye and Merriam-Webster online dictionary
- Install KK phonics font in your system
- Support pronunciation through internet
//---------------------------------------------------------------------------
#include <vcl.h>
#include <shlwapi.h>
#include <GdiPlus.h>
#pragma comment( lib, "shlwapi.lib")
#pragma comment( lib, "gdiplus.lib")
TForm1 *Form1;
bool bChangeFontSize = false;
//---------------------------------------------------------------------------
AnsiString url="http://www.dreye.com/axis/ddict.jsp?w=";
AnsiString search_word,actual_word,multi_word;
AnsiString play_path;
AnsiString phonetic[67];
int batch_flag=0;
AnsiString *batch_vocabulary;
int vocabulary_count=0;
int vocabulary_index=0;
Vocabulary *words;
vector<Vocabulary> vector_words;
AnsiString SearchHistory;
int inc = 1; //multiple meanings
bool bOpenSite = false; 
AnsiString PreStr[30];
AnsiString SelVoc[200];
int preNum = 18;
int SelNum = 0;
int currentPos = 0;
AnsiString *BatchVoc;
int batch_num = 0;
int iBatchCurrentPos = 0;
bool bBatchAutoInsert = false;
bool bBatchMultiVoc = false;     
AnsiString *FangVoc;
int Fang_num = 0;
int iFangCurrentPos = 0;
bool bFangSemiAutoUpdate = false;  
bool bFangAutoUpdate = false;    
bool bNewFang = false;    
AnsiString OriginalList;
//---------------------------------------------------------------------------
void __fastcall TForm1::SetFontStyle(TRichEdit *RichEdit,int start, int length)
{
 int r;
 AnsiString S;
 S=RichEdit->Text;
 TTextAttributes   *AText   =   new   TTextAttributes(RichEdit,atSelected);
 RichEdit->SelStart = start;
 RichEdit->SelLength = length;
 AText->Name   =   "Be Young's Phonetic Symbol";
 if(bChangeFontSize)
  AText->Size   =   iFontSize;
 else
  AText->Size   =   12;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::GetData(int MSearch)
{
 if(Edt_Voc->Text != "")
 {
  if(MSearch == 0)
   Memo_Dreye->Clear();
  
  AnsiString search_word=Edt_Voc->Text.LowerCase();
  AnsiString body,final_search_word;
  if(search_word.Pos(" ")>0)
  {
   AnsiString tmp = search_word;
   final_search_word = StringReplace(tmp.c_str(), " ", "%20", TReplaceFlags() << rfReplaceAll).c_str();
  }
  else
   final_search_word = search_word;
  try
  {
   Application->ProcessMessages();
   body=IdHTTP1->Get(url+final_search_word);
   Application->ProcessMessages();
  }
  catch(EIdHTTPProtocolException &e)
  {;}
  words[0].explain=body.c_str();
  Application->ProcessMessages();
  AnsiString del_to_mp3_path="param name=\"FileName\" value=\"";
  words[0].explain.erase(0,words[0].explain.find(del_to_mp3_path.c_str())+del_to_mp3_path.Length());
  play_path=words[0].explain.substr(0,words[0].explain.find("\">")).c_str();
  AnsiString title = "<div class=ptitle>";
  if(words[0].explain.find(title.c_str())!=string::npos)
   words[0].explain.erase(0,words[0].explain.find(title.c_str())+title.Length());
  AnsiString play_str="onclick=\"PlayAU()\">";
  if(words[0].explain.find(play_str.c_str())!=string::npos)
   words[0].explain.erase(0,words[0].explain.find(play_str.c_str())+play_str.Length());
  actual_word=words[0].explain.substr(0,words[0].explain.find("<")).c_str();
  actual_word=actual_word.Trim();
  multi_word=actual_word;
  AnsiString sup_start="<sup>";
  AnsiString sup_end="</sup>";
  if(words[0].explain.find(sup_start.c_str())!=string::npos)
  {
   Application->ProcessMessages();
   AnsiString tmp=words[0].explain.substr(words[0].explain.find(sup_start.c_str()),words[0].explain.find(sup_end.c_str())).c_str();
   tmp=StringReplace(tmp.c_str(), sup_start.c_str(), "@", TReplaceFlags() << rfReplaceAll).c_str();
   tmp=tmp.SubString(0,tmp.Pos("<")-1);
   multi_word=actual_word+tmp;
   Edt_Voc->Text=multi_word;
   Panel4->Visible = true;
   bBatchMultiVoc = true; 
   if(!bFangAutoUpdate)
    ShowMessage("Multiple Meanings");
  }
  else
  {
   Panel4->Visible = false;
   bBatchMultiVoc = false;
  }
  if(actual_word.LowerCase()!=search_word.LowerCase())
  {
   if(final_search_word.Pos("@")<1) 
   {
              bBatchMultiVoc = true;
    if(!bFangAutoUpdate)
     ShowMessage("找不到:"+search_word+". 相似字:"+actual_word);
   }
  }
  if(inc>1 && StrToInt(multi_word.SubString(multi_word.Pos("@")+1,1).c_str())==1 )l
  {
   Btn_Next->Enabled = false;
   Edt_Voc->Text = Edt_Voc->Text.SubString(0,Edt_Voc->Text.Pos("@")-1);
   inc--;
   return;
  }
  else
   Btn_Next->Enabled = true;
  if(inc<=0)
  {
   inc = 1;
   return;
  }
  words[0].explain.erase(0,words[0].explain.find("KK: [")+6);
  words[0].explain.insert(0,"[");
  if(words[0].explain.find("<div id=\"rad\">")!=string::npos)
   words[0].explain.erase(words[0].explain.find(""),words[0].explain.length());
  AnsiString image_src;
  image_src="<img border=0 align=absbottom src=\"http://www.dreye.com/tw/dict/IMAGES/DIC/PN/";
  if( words[0].explain.find(image_src.c_str())!=string::npos)
  {
   string tmp_kk=words[0].explain.substr(0,words[0].explain.find("DJ: [")-4); 
   //ShowMessage(words[0].explain.c_str());
   AnsiString kk_str;
   kk_str=StringReplace(tmp_kk.c_str(), image_src, "", TReplaceFlags() << rfReplaceAll);
   kk_str=StringReplace(kk_str, ".GIF\">", "][", TReplaceFlags() << rfReplaceAll);
   kk_str=StringReplace(kk_str, "[]", "", TReplaceFlags() << rfReplaceAll);
   kk_str=StringReplace(kk_str, "<br>", "", TReplaceFlags() << rfReplaceAll);
   kk_str=kk_str.Trim();
   if( words[0].explain.find("img border=0 align=absbottom src=\"http://www.dreye.com/tw/dict/IMAGES/DIC/PN/")!=string::npos)
    kk_str=StringReplace(kk_str.c_str(), "img border=0 align=absbottom src=\"http://www.dreye.com/tw/dict/IMAGES/DIC/PN/", "", TReplaceFlags() << rfReplaceAll);
   kk_str = StringReplace(kk_str.c_str(), "\n", "", TReplaceFlags() << rfReplaceAll).t_str(); 
   kk_str = StringReplace(kk_str.c_str(), "[]", "", TReplaceFlags() << rfReplaceAll).t_str();
   words[0].kk=kk_str;
  }
  else
  {
   words[0].kk = "";
  }
  //words[0].word=search_word;
  words[0].word=actual_word;
  words[0].explain.erase(0,words[0].explain.find("</div>")+6); 
  string del_str[12];
  del_str[0]="</span></div>";
  del_str[1]="<div class=peng>";
  del_str[2]="<div class=pchi>";
  del_str[3]="<ol>";
  del_str[4]="</ol>";
  del_str[5]="<li>";
  del_str[6]="</li>";
  del_str[7]="<div class=pcixin>";
  del_str[8]="</div>";
  del_str[9]="。<div class=pexplain>";
  del_str[10]="<div class=\"break\">";
  del_str[11]="<div class=pexplain>";
  while(words[0].explain.find(del_str[1])!=string::npos)
  {
   Application->ProcessMessages();
   words[0].explain.erase(words[0].explain.find(del_str[1]),words[0].explain.find(del_str[0])-words[0].explain.find(del_str[1]));
   words[0].explain.erase(words[0].explain.find(del_str[0]),del_str[0].length());
   words[0].explain.erase(words[0].explain.find(del_str[2]),words[0].explain.find(del_str[0])-words[0].explain.find(del_str[2]));
   words[0].explain.erase(words[0].explain.find(del_str[0]),del_str[0].length());
  }
  if(words[0].explain.find(del_str[10])!=string::npos)
  {
   words[0].explain.erase(words[0].explain.find(del_str[10]),words[0].explain.length());
  }
  for(int i=3;i<=6;i++)
  {
   while(words[0].explain.find(del_str[i])!=string::npos)
   {
    words[0].explain.erase(words[0].explain.find(del_str[i]),del_str[i].length());
   }
  }
  words[0].explain=StringReplace(words[0].explain.c_str(), "\n", "", TReplaceFlags() << rfReplaceAll).t_str(); 
  words[0].explain=StringReplace(words[0].explain.c_str(), del_str[7].c_str(), "<div class=pcixin>", TReplaceFlags() << rfReplaceAll).t_str();
  words[0].explain=StringReplace(words[0].explain.c_str(), del_str[8].c_str(), "。", TReplaceFlags() << rfReplaceAll).t_str();
  words[0].explain=StringReplace(words[0].explain.c_str(), del_str[9].c_str(), "", TReplaceFlags() << rfReplaceAll).t_str();
  words[0].explain=StringReplace(words[0].explain.c_str(), del_str[7].c_str(), "", TReplaceFlags() << rfReplaceAll).t_str();
  words[0].explain=StringReplace(words[0].explain.c_str(), del_str[11].c_str(), "", TReplaceFlags() << rfReplaceAll).t_str();
  AnsiString cixing[2];
  cixing[0]="a.";
  cixing[1]="ad.";
  words[0].explain=StringReplace(words[0].explain.c_str(), cixing[0].c_str(), "adj.", TReplaceFlags() << rfReplaceAll).t_str();
  words[0].explain=StringReplace(words[0].explain.c_str(), cixing[1].c_str(), "adv.", TReplaceFlags() << rfReplaceAll).t_str();
  if(words[0].explain.find("<br>")!=string::npos)
   words[0].explain.erase(words[0].explain.find("
"),words[0].explain.length());
  Memo_Dreye->Lines->Add(words[0].explain.c_str());
  //set phonetic
  SetPhoneticTable();
  int kk_count=0;
  AnsiString phonetic_str="";
  while(words[0].kk.Pos("]")>0)
  {
         Application->ProcessMessages();
   phonetic_str+=phonetic[words[0].kk.SubString(2,3).ToInt()];
   words[0].kk.Delete(1,5);
   kk_count++;
  }
  Edt_KK->Text = "[" + phonetic_str + "]";
  IdHTTP1->Disconnect();
  if(!CheckBox_EE->Checked)
  {
   // Get Webster
   AnsiString web_voc = Edt_Voc->Text;
   if(web_voc.Pos("@")>0)
    web_voc = web_voc.SubString(1,web_voc.Pos("@")-1);
   AnsiString wikiurl="http://kaoshi.wobuxihuan.org/w/index.php?title="+web_voc+"&action=edit&section=1";
            try
   {
    AnsiString webster_body=IdHTTP2->Get(wikiurl);
    words[0].webster = webster_body.c_str();
    AnsiString pos_tmp = words[0].webster.c_str();
    if(pos_tmp.Pos("Webster")>0)
    {
     words[0].webster.erase(0,words[0].webster.find("Webster Collegiate </span></h3>")+31);
     words[0].webster.erase(words[0].webster.find("")-words[0].webster.find("<a name=\".E8.AE.B0.E5.BF.86")+7);
     AnsiString web_temp = words[0].webster.c_str();
     while(web_temp.Pos("<")>0)
     {
      int start_pos = web_temp.Pos("<");
      int end_pos = web_temp.Pos(">");
      web_temp = web_temp.Delete(start_pos,end_pos - start_pos +1);
     }
     while(web_temp.Pos(" ")>0)
     {
      int start_pos = web_temp.Pos(" ");
      web_temp = web_temp.Delete(start_pos,6);
     }
     while(web_temp.Pos("<")>0)
     {
      int start_pos = web_temp.Pos("<");
      web_temp = web_temp.Delete(start_pos,4);
     }
     while(web_temp.Pos("[sup]")>0)
     {
      int start_pos = web_temp.Pos("[sup]");
      web_temp = web_temp.Delete(start_pos,5);
     }
     while(web_temp.Pos("[/sup]")>0)
     {
      int start_pos = web_temp.Pos("[/sup]");
      web_temp = web_temp.Delete(start_pos,6);
     }
     RichEdit1->Text = web_temp;
     Memo_Webster->Text = RichEdit1->Text;
    }
   }
   catch(EIdHTTPProtocolException &e)
   {;}
  }
  if(CheckBox_Root->Checked)
  {
   AnsiString actual_word2;
   bool isPrestr = false;
   int  prePos=19;
   AnsiString strRoot;
   for(int x=0;x<preNum;x++)
   {
    //PreStr
    if( Edt_Voc->Text.SubString(1,PreStr[x].Length()) ==  PreStr[x])
    {
     isPrestr = true;
     prePos = x;
     break;
    }
   }
   if(isPrestr)
   {
    strRoot = Edt_Voc->Text.SubString(PreStr[prePos].Length() + 1,Edt_Voc->Text.Length()-PreStr[prePos].Length() + 1);
    try
    {
     Application->ProcessMessages();
     body=IdHTTP1->Get(url+strRoot);
     Application->ProcessMessages();
    }
    catch(EIdHTTPProtocolException &e)
    {;}
    words[1].explain=body.c_str();
    Application->ProcessMessages();
    AnsiString del_to_mp3_path="param name=\"FileName\" value=\"";
    words[1].explain.erase(0,words[1].explain.find(del_to_mp3_path.c_str())+del_to_mp3_path.Length());
    AnsiString title = "<div class=ptitle>";
    if(words[1].explain.find(title.c_str())!=string::npos)
     words[1].explain.erase(0,words[1].explain.find(title.c_str())+title.Length());
    AnsiString play_str="onclick=\"PlayAU()\">";
    if(words[1].explain.find(play_str.c_str())!=string::npos)
     words[1].explain.erase(0,words[1].explain.find(play_str.c_str())+play_str.Length());
    actual_word2=words[1].explain.substr(0,words[1].explain.find("<")).c_str();
    actual_word2=actual_word2.Trim();
    multi_word=actual_word2;
    AnsiString sup_start="<sup>";
    AnsiString sup_end="</sup>";
    if(words[1].explain.find(sup_start.c_str())!=string::npos)
    {
     Application->ProcessMessages();
     AnsiString tmp=words[1].explain.substr(words[1].explain.find(sup_start.c_str()),words[1].explain.find(sup_end.c_str())).c_str();
     tmp=StringReplace(tmp.c_str(), sup_start.c_str(), "@", TReplaceFlags() << rfReplaceAll).c_str();
     tmp=tmp.SubString(0,tmp.Pos("<")-1);
     multi_word=actual_word2+tmp;
     Memo_Memo->Lines->Add(strRoot + " ");
     if(!bFangAutoUpdate)
      ShowMessage("Multiple Meanings");
    }
    else
    {
     bool notFound = false;
     if(actual_word2.LowerCase()!=strRoot.LowerCase())
     {
      if(final_search_word.Pos("@")<1) 
       notFound = true;
     }
     if(!notFound)
     {
      words[1].explain.erase(0,words[1].explain.find("KK: [")+6);
      words[1].explain.insert(0,"[");
      if(words[1].explain.find("<div id=\"rad\">")!=string::npos)
       words[1].explain.erase(words[1].explain.find(""),words[1].explain.length());
      AnsiString image_src;
      image_src="<img border=0 align=absbottom src=\"http://www.dreye.com/tw/dict/IMAGES/DIC/PN/";
      if( words[1].explain.find(image_src.c_str())!=string::npos)
      {
       string tmp_kk=words[1].explain.substr(0,words[1].explain.find("DJ: [")-4); 
       AnsiString kk_str;
       kk_str=StringReplace(tmp_kk.c_str(), image_src, "", TReplaceFlags() << rfReplaceAll);
       kk_str=StringReplace(kk_str, ".GIF\">", "][", TReplaceFlags() << rfReplaceAll);
       kk_str=StringReplace(kk_str, "[]", "", TReplaceFlags() << rfReplaceAll);
       kk_str=StringReplace(kk_str, "<br>", "", TReplaceFlags() << rfReplaceAll);
       kk_str=kk_str.Trim();
       if( words[1].explain.find("img border=0 align=absbottom src=\"http://www.dreye.com/tw/dict/IMAGES/DIC/PN/")!=string::npos)
        kk_str=StringReplace(kk_str.c_str(), "img border=0 align=absbottom src=\"http://www.dreye.com/tw/dict/IMAGES/DIC/PN/", "", TReplaceFlags() << rfReplaceAll);
       kk_str = StringReplace(kk_str.c_str(), "\n", "", TReplaceFlags() << rfReplaceAll).t_str(); 
       kk_str = StringReplace(kk_str.c_str(), "[]", "", TReplaceFlags() << rfReplaceAll).t_str(); 
       words[1].kk=kk_str;
      }
      else
      {
       words[1].kk = "";
      }
      //words[1].word=search_word;
      words[1].word=actual_word2;
      words[1].explain.erase(0,words[1].explain.find("</div>")+6); 
      string del_str[12];
      del_str[0]="</span></div>";
      del_str[1]="<div class=peng>";
      del_str[2]="<div class=pchi>";
      del_str[3]="<ol>";
      del_str[4]="</ol>";
      del_str[5]="<li>";
      del_str[6]="</li>";
      del_str[7]="<div class=pcixin>";
      del_str[8]="</div>";
      del_str[9]="。<div class=pexplain>";
      del_str[10]="<div class=\"break\">";
      del_str[11]="<div class=pexplain>";
      while(words[1].explain.find(del_str[1])!=string::npos)
      {
       Application->ProcessMessages();
       words[1].explain.erase(words[1].explain.find(del_str[1]),words[1].explain.find(del_str[0])-words[1].explain.find(del_str[1]));
       words[1].explain.erase(words[1].explain.find(del_str[0]),del_str[0].length());
       words[1].explain.erase(words[1].explain.find(del_str[2]),words[1].explain.find(del_str[0])-words[1].explain.find(del_str[2]));
       words[1].explain.erase(words[1].explain.find(del_str[0]),del_str[0].length());
      }
      if(words[1].explain.find(del_str[10])!=string::npos)
      {
       words[1].explain.erase(words[1].explain.find(del_str[10]),words[1].explain.length());
      }
      for(int i=3;i<=6;i++)
      {
       while(words[1].explain.find(del_str[i])!=string::npos)
       {
        words[1].explain.erase(words[1].explain.find(del_str[i]),del_str[i].length());
       }
      }
      words[1].explain=StringReplace(words[1].explain.c_str(), "\n", "", TReplaceFlags() << rfReplaceAll).t_str();
      words[1].explain=StringReplace(words[1].explain.c_str(), del_str[7].c_str(), "<div class=pcixin>", TReplaceFlags() << rfReplaceAll).t_str();
      words[1].explain=StringReplace(words[1].explain.c_str(), del_str[8].c_str(), "。", TReplaceFlags() << rfReplaceAll).t_str();
      words[1].explain=StringReplace(words[1].explain.c_str(), del_str[9].c_str(), "", TReplaceFlags() << rfReplaceAll).t_str();
      words[1].explain=StringReplace(words[1].explain.c_str(), del_str[7].c_str(), "", TReplaceFlags() << rfReplaceAll).t_str();
      words[1].explain=StringReplace(words[1].explain.c_str(), del_str[11].c_str(), "", TReplaceFlags() << rfReplaceAll).t_str();
      AnsiString cixing[2];
      cixing[0]="a.";
      cixing[1]="ad.";
      words[1].explain=StringReplace(words[1].explain.c_str(), cixing[0].c_str(), "adj.", TReplaceFlags() << rfReplaceAll).t_str();
      words[1].explain=StringReplace(words[1].explain.c_str(), cixing[1].c_str(), "adv.", TReplaceFlags() << rfReplaceAll).t_str();
      if(words[1].explain.find("<br>")!=string::npos)
       words[1].explain.erase(words[1].explain.find("
"),words[1].explain.length());
      AnsiString RootAdd = strRoot + " " + words[1].explain.c_str();
      if(Memo_Memo->Text.Pos(RootAdd)<1)
       Memo_Memo->Lines->Add(strRoot + " " + words[1].explain.c_str());
      else
       ShowMessage("Data Exist");
     }
    }
    IdHTTP1->Disconnect();
   }
  }
  
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Btn_AddClick(TObject *Sender)
{
 if(Edit_RB_List->Text == "0")
 {
  CheckBox_RB->Checked = false;
  CheckBox_EL->Checked = true; 
 }
 Label_NextProgress->Caption = "";
 
 int source = 0x00;
 if(CheckBox_RB->Checked)
  source += 0x01;
 if(CheckBox_BL->Checked)
  source += 0x02;
 if(CheckBox_BK->Checked)
  source += 0x04;
 if(CheckBox_EL->Checked)
  source += 0x08;
 AnsiString voc = Edt_Voc->Text;
 AnsiString kk = Edt_KK->Text;
 AnsiString explain = Memo_Explain->Text;
 AnsiString memory = Edit_Mem->Text;
 AnsiString notice = Edit_Note->Text;
 AnsiString sameroot = Edit_Same->Text;
 AnsiString antonym = Edit_Antonym->Text;
 AnsiString reference = Edit_Ref->Text;
 AnsiString like = Edit_Like->Text;
 AnsiString derive = Edit_Derive->Text;
 AnsiString example = Edit_Example->Text;
 AnsiString phrase = Edit_Phrase->Text;
 AnsiString term = Edit_Term->Text;
 AnsiString dreye = Memo_Dreye->Text;
 AnsiString othermemo = Memo_Memo->Text;
 AnsiString webster = Memo_Webster->Text;
 AnsiString tmp_webster;
 for(int i=0;i<Memo_Webster->Lines->Count;i++)
 {
  if(Memo_Webster->Lines->Strings[i] != "")
   tmp_webster = tmp_webster + Memo_Webster->Lines->Strings[i] + "\n";
 }
 webster = tmp_webster;
 int frequency = Edit_Freq->Text.ToInt();
 int RB_List = Edit_RB_List->Text.ToInt();
 int mark=0;
 if(CheckBox_Mark->Checked)
  mark = 1;
 int forecast=0;
 if(CheckBox_Forecast->Checked == true)
  forecast = 1;
 ADOTable1->Active=false;
 ADOConnection1->Open();
 ADOQuery1->Close();
 ADOQuery1->Open();
 AnsiString temp_explain;
 temp_explain = explain;
 if(temp_explain.Pos("'")>0)
  explain = StringReplace(temp_explain.c_str(), "'", "''", TReplaceFlags() << rfReplaceAll).c_str();
 AnsiString temp_othermemo;
 temp_othermemo = othermemo;
 if(temp_othermemo.Pos("'")>0)
  othermemo = StringReplace(temp_othermemo.c_str(), "'", "''", TReplaceFlags() << rfReplaceAll).c_str();
 AnsiString temp_example;
 temp_example = example;
 if(temp_example.Pos("'")>0)
  example = StringReplace(temp_example.c_str(), "'", "''", TReplaceFlags() << rfReplaceAll).c_str();
 AnsiString temp_webster;
 temp_webster = webster;
 if(temp_webster.Pos("'")>0)
  webster = StringReplace(temp_webster.c_str(), "'", "''", TReplaceFlags() << rfReplaceAll).c_str();
 AnsiString temp_dreye;
 temp_dreye = dreye;
 if(temp_dreye.Pos("'")>0)
  dreye = StringReplace(temp_dreye.c_str(), "'", "''", TReplaceFlags() << rfReplaceAll).c_str();
 AnsiString tmp_memo;
 for(int i=0;i<Memo_Memo->Lines->Count;i++)
 {
  if(Memo_Memo->Lines->Strings[i] != "")
   tmp_memo = tmp_memo + Memo_Memo->Lines->Strings[i] + "\n";
 }
 othermemo = tmp_memo;
 ADOQuery1->SQL->Text=
  "insert into VocDB( "
   "WORD, KK, RB_LIST, EXPLAIN, MARK, SOURCE, MEMORY, "
   "NOTICE, ROOT, ANTONYM, REFERENCE, CONTOUR, DERIVE, EXAMPLE, "
   "PHRASE, DREYE, OTHERMEMO, FREQUENCE_BLACK, CATEGORY, FORECAST, TERM, WEBSTER) "
   " values('"+
     voc + "', '" + kk + "', '" + IntToStr(RB_List) + "', '" + explain + "', '" + IntToStr(mark) + "', '" + IntToStr(source) + "', '" + memory + "', '" +
     notice + "', '" + sameroot + "', '" + antonym + "', '" + reference + "', '" + like + "', '" + derive + "', '" + example + "', '" +
     phrase + "', '" + dreye + "', '" + othermemo + "', '" + IntToStr(frequency) + "', '" + category + "', '" + IntToStr(forecast)+ "', '" + term+ "', '" + webster+"')";
 ADOQuery1->ExecSQL();
 Form1->ADOQuery1->Close();
 TStrings *List=new TStringList;
 ADOConnection1->GetTableNames(List);
 ADOQuery1->Close();
 ADOQuery1->SQL->Text="select * from VocDB order by  RB_LIST, WORD";
 ADOQuery1->ExecSQL();
 ADOQuery1->Open();
 StatusBar1->Panels->Items[0]->Text ="目前共有 " + IntToStr(ADOQuery1->RecordCount) + " 個單字";
 GridSize();
 ADOQuery1->Last(); 
 Button7->OnClick(Sender);
 Panel4->Visible = false;
 Edit_Freq->Text = 0;
 bOpenSite = false;
 Edt_Voc->SetFocus();
 Btn_Add->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DBGrid1DblClick(TObject *Sender)
{
 GridSize();
 if(ADOQuery1->RecordCount > 0)
 {
  Btn_Update->Enabled = true;
  if(RadioButton_FirstUpper->Checked)
   Edt_Voc->Text = DBGrid1->DataSource->DataSet->FieldByName("WORD")->AsString.SubString(1,1).UpperCase() +
       DBGrid1->DataSource->DataSet->FieldByName("WORD")->AsString.SubString(2,DBGrid1->DataSource->DataSet->FieldByName("WORD")->AsString.Length()-1);
  else if(RadioButton_UpperCase->Checked)
   Edt_Voc->Text = DBGrid1->DataSource->DataSet->FieldByName("WORD")->AsString.UpperCase();
  else if(RadioButton_LowerCase->Checked)
   Edt_Voc->Text = DBGrid1->DataSource->DataSet->FieldByName("WORD")->AsString.LowerCase();
  else if(RadioButton_Default->Checked)
            Edt_Voc->Text = DBGrid1->DataSource->DataSet->FieldByName("WORD")->AsString;
  Edt_KK->Text = DBGrid1->DataSource->DataSet->FieldByName("KK")->AsString;
  Edit_RB_List->Text = DBGrid1->DataSource->DataSet->FieldByName("RB_LIST")->AsString;
  Memo_Explain->Text = DBGrid1->DataSource->DataSet->FieldByName("EXPLAIN")->AsString;
  Edit_Mem->Text = DBGrid1->DataSource->DataSet->FieldByName("MEMORY")->AsString;
  Edit_Note->Text = DBGrid1->DataSource->DataSet->FieldByName("NOTICE")->AsString;
  Edit_Same->Text = DBGrid1->DataSource->DataSet->FieldByName("ROOT")->AsString;
  Edit_Antonym->Text = DBGrid1->DataSource->DataSet->FieldByName("ANTONYM")->AsString;
  Edit_Ref->Text = DBGrid1->DataSource->DataSet->FieldByName("REFERENCE")->AsString;
  Edit_Like->Text = DBGrid1->DataSource->DataSet->FieldByName("CONTOUR")->AsString;
  Edit_Derive->Text = DBGrid1->DataSource->DataSet->FieldByName("DERIVE")->AsString;
  Edit_Example->Text = DBGrid1->DataSource->DataSet->FieldByName("EXAMPLE")->AsString;
  Edit_Phrase->Text = DBGrid1->DataSource->DataSet->FieldByName("PHRASE")->AsString;
  Memo_Dreye->Text = DBGrid1->DataSource->DataSet->FieldByName("DREYE")->AsString;
  Memo_Memo->Text = DBGrid1->DataSource->DataSet->FieldByName("OTHERMEMO")->AsString;
  Edit_Term->Text = DBGrid1->DataSource->DataSet->FieldByName("TERM")->AsString;
  Memo_Webster->Text = DBGrid1->DataSource->DataSet->FieldByName("WEBSTER")->AsString;
  int source = DBGrid1->DataSource->DataSet->FieldByName("SOURCE")->AsInteger;
  CheckBox_RB->Checked = false;
  CheckBox_BL->Checked = false;
  CheckBox_BK->Checked = false;
  CheckBox_EL->Checked = false;
  if(source&0x01)
   CheckBox_RB->Checked = true;
  if(source&0x02)
   CheckBox_BL->Checked = true;
  if(source&0x04)
   CheckBox_BK->Checked = true;
  if(source&0x08)
   CheckBox_EL->Checked = true;
  int mark = DBGrid1->DataSource->DataSet->FieldByName("MARK")->AsInteger;
  if(mark == 0)
   CheckBox_Mark->Checked = false;
  else
   CheckBox_Mark->Checked = true;
  int forecast = DBGrid1->DataSource->DataSet->FieldByName("FORECAST")->AsInteger;
  if(forecast == 0)
   CheckBox_Forecast->Checked = false;
  else
   CheckBox_Forecast->Checked = true;
  Edit_Freq->Text = DBGrid1->DataSource->DataSet->FieldByName("FREQUENCE_BLACK")->AsInteger;
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Btn_AutoSearchRootClick(TObject *Sender)
{
 AnsiString body,final_search_word;
 bool isPrestr = false;
 int  prePos=19;
 AnsiString strRoot;
 for(int x=0;x<preNum;x++)
 {
  //PreStr
  if( Edt_Voc->Text.SubString(1,PreStr[x].Length()) ==  PreStr[x])
  {
   isPrestr = true;
   prePos = x;
   break;
  }
 }
 if(isPrestr)
 {
  strRoot = Edt_Voc->Text.SubString(PreStr[prePos].Length() + 1,Edt_Voc->Text.Length()-PreStr[prePos].Length() + 1);
  try
  {
   Application->ProcessMessages();
   body=IdHTTP1->Get(url+strRoot);
   Application->ProcessMessages();
  }
  catch(EIdHTTPProtocolException &e)
  {;}
  words[2].explain=body.c_str();
  Application->ProcessMessages();
  AnsiString del_to_mp3_path="param name=\"FileName\" value=\"";
  words[2].explain.erase(0,words[2].explain.find(del_to_mp3_path.c_str())+del_to_mp3_path.Length());
  play_path=words[2].explain.substr(0,words[2].explain.find("\">")).c_str();
  AnsiString title = "<div class=ptitle>";
  if(words[2].explain.find(title.c_str())!=string::npos)
   words[2].explain.erase(0,words[2].explain.find(title.c_str())+title.Length());
  AnsiString play_str="onclick=\"PlayAU()\">";
  if(words[2].explain.find(play_str.c_str())!=string::npos)
   words[2].explain.erase(0,words[2].explain.find(play_str.c_str())+play_str.Length());
  actual_word=words[2].explain.substr(0,words[2].explain.find("<")).c_str();
  actual_word=actual_word.Trim();
  multi_word=actual_word;
  AnsiString sup_start="<sup>";
  AnsiString sup_end="</sup>";
  if(words[2].explain.find(sup_start.c_str())!=string::npos)
  {
   Application->ProcessMessages();
   AnsiString tmp=words[2].explain.substr(words[2].explain.find(sup_start.c_str()),words[2].explain.find(sup_end.c_str())).c_str();
   tmp=StringReplace(tmp.c_str(), sup_start.c_str(), "@", TReplaceFlags() << rfReplaceAll).c_str();
   tmp=tmp.SubString(0,tmp.Pos("<")-1);
   multi_word=actual_word+tmp;
   Memo_Memo->Lines->Add(strRoot + " ");
   if(!bFangAutoUpdate)
    ShowMessage("Multiple Meanings");
  }
  else
  {
   bool notFound = false;
   if(actual_word.LowerCase()!=strRoot.LowerCase())
   {
    if(final_search_word.Pos("@")<1) 
     notFound = true;
   }
   if(!notFound)
   {
    words[2].explain.erase(0,words[2].explain.find("KK: [")+6);
    words[2].explain.insert(0,"[");
    if(words[2].explain.find("<div id=\"rad\">")!=string::npos)
     words[2].explain.erase(words[2].explain.find(""),words[2].explain.length());
    AnsiString image_src;
    image_src="<img border=0 align=absbottom src=\"http://www.dreye.com/tw/dict/IMAGES/DIC/PN/";
    if( words[2].explain.find(image_src.c_str())!=string::npos)
    {
     string tmp_kk=words[2].explain.substr(0,words[2].explain.find("DJ: [")-4); 
 
     AnsiString kk_str;
     kk_str=StringReplace(tmp_kk.c_str(), image_src, "", TReplaceFlags() << rfReplaceAll);
     kk_str=StringReplace(kk_str, ".GIF\">", "][", TReplaceFlags() << rfReplaceAll);
     kk_str=StringReplace(kk_str, "[]", "", TReplaceFlags() << rfReplaceAll);
     kk_str=StringReplace(kk_str, "<br>", "", TReplaceFlags() << rfReplaceAll);
     kk_str=kk_str.Trim();
     if( words[2].explain.find("img border=0 align=absbottom src=\"http://www.dreye.com/tw/dict/IMAGES/DIC/PN/")!=string::npos)
      kk_str=StringReplace(kk_str.c_str(), "img border=0 align=absbottom src=\"http://www.dreye.com/tw/dict/IMAGES/DIC/PN/", "", TReplaceFlags() << rfReplaceAll);
     kk_str = StringReplace(kk_str.c_str(), "\n", "", TReplaceFlags() << rfReplaceAll).t_str();
     kk_str = StringReplace(kk_str.c_str(), "[]", "", TReplaceFlags() << rfReplaceAll).t_str();
     words[2].kk=kk_str;
    }
    else
    {
     words[2].kk = "";
    }
  
    words[2].word=actual_word;
    words[2].explain.erase(0,words[2].explain.find("</div>")+6);
    string del_str[12];
    del_str[0]="</span></div>";
    del_str[1]="<div class=peng>";
    del_str[2]="<div class=pchi>";
    del_str[3]="<ol>";
    del_str[4]="</ol>";
    del_str[5]="<li>";
    del_str[6]="</li>";
    del_str[7]="<div class=pcixin>";
    del_str[8]="</div>";
    del_str[9]="。<div class=pexplain>";
    del_str[10]="<div class=\"break\">";
    del_str[11]="<div class=pexplain>";
    while(words[2].explain.find(del_str[1])!=string::npos)
    {
     Application->ProcessMessages();
     words[2].explain.erase(words[2].explain.find(del_str[1]),words[2].explain.find(del_str[0])-words[2].explain.find(del_str[1]));
     words[2].explain.erase(words[2].explain.find(del_str[0]),del_str[0].length());
     words[2].explain.erase(words[2].explain.find(del_str[2]),words[2].explain.find(del_str[0])-words[2].explain.find(del_str[2]));
     words[2].explain.erase(words[2].explain.find(del_str[0]),del_str[0].length());
    }
    if(words[2].explain.find(del_str[10])!=string::npos)
    {
     words[2].explain.erase(words[2].explain.find(del_str[10]),words[2].explain.length());
    }
    for(int i=3;i<=6;i++)
    {
     while(words[2].explain.find(del_str[i])!=string::npos)
     {
      words[2].explain.erase(words[2].explain.find(del_str[i]),del_str[i].length());
     }
    }
    words[2].explain=StringReplace(words[2].explain.c_str(), "\n", "", TReplaceFlags() << rfReplaceAll).t_str(); // 清除換行字元
    words[2].explain=StringReplace(words[2].explain.c_str(), del_str[7].c_str(), "<div class=pcixin>", TReplaceFlags() << rfReplaceAll).t_str();
    words[2].explain=StringReplace(words[2].explain.c_str(), del_str[8].c_str(), "。", TReplaceFlags() << rfReplaceAll).t_str();
    words[2].explain=StringReplace(words[2].explain.c_str(), del_str[9].c_str(), "", TReplaceFlags() << rfReplaceAll).t_str();
    words[2].explain=StringReplace(words[2].explain.c_str(), del_str[7].c_str(), "", TReplaceFlags() << rfReplaceAll).t_str();
    words[2].explain=StringReplace(words[2].explain.c_str(), del_str[11].c_str(), "", TReplaceFlags() << rfReplaceAll).t_str();
    AnsiString cixing[2];
    cixing[0]="a.";
    cixing[1]="ad.";
    words[2].explain=StringReplace(words[2].explain.c_str(), cixing[0].c_str(), "adj.", TReplaceFlags() << rfReplaceAll).t_str();
    words[2].explain=StringReplace(words[2].explain.c_str(), cixing[1].c_str(), "adv.", TReplaceFlags() << rfReplaceAll).t_str();
    if(words[2].explain.find("<br>")!=string::npos)
     words[2].explain.erase(words[2].explain.find("
"),words[2].explain.length());
    AnsiString RootAdd = strRoot + " " + words[2].explain.c_str();
    if(Memo_Memo->Text.Pos(RootAdd)<1)
     Memo_Memo->Lines->Add(strRoot + " " + words[2].explain.c_str());
    else
     ShowMessage("Data Exist");
   }
  }
  IdHTTP1->Disconnect();
 }
}
//---------------------------------------------------------------------------
	 
			
	
						
	
	
	
		
	
				
			
		
	 
								