# aardio 范例: 虚表示例 - COCA 20000 词汇表



```aardio
import fonts.fontAwesome;
import win.ui;
/*DSG{{*/
winform = win.form(text="虚表示例 - COCA 20000 词汇表";right=797;bottom=599;bgcolor=0xFFFFFF)
winform.add(
btnVoice={cls="plus";text="朗读（韦氏词典）";left=631;top=566;right=776;bottom=595;align="left";bgcolor=0xFFFFFF;color=0x3C3C3C;db=1;dr=1;font=LOGFONT(h=-13);iconColor=0x008000;iconStyle={align="left";font=LOGFONT(h=-13;name='FontAwesome');padding={left=8}};iconText='\uF028';notify=1;textPadding={left=25};z=4};
chkMeaning={cls="checkbox";text="显示全部释义";left=20;top=571;right=116;bottom=595;bgcolor=0xFFFFFF;db=1;dl=1;z=2};
lbMeaning={cls="static";left=134;top=574;right=613;bottom=604;nWrap=1;transparent=1;z=3};
listview={cls="vlistview";left=20;top=20;right=776;bottom=562;db=1;dl=1;dr=1;dt=1;edge=1;fullRow=1;z=1}
)
/*}}*/

//以下为 table.coca20000 扩展库范例简化版本
import table.coca20000;
winform.listview.columns = [["词频",50],["单词",100],["音标",120],["释义",0],["分类",-1]]

var dataset = table.coca20000;
var fields = ["word","phonetic","meaning","tag"]

//虚表
winform.listview.onGetDispItem = function(item,row,col){ 
	if(col==1) return {text = tostring(row)};
	return{ text=dataset[row][fields[col-1]]}; 
}
winform.listview.count = #dataset;//虚表项目总数

winform.chkMeaning.oncommand = function(id,event){
	
	winform.listview.setRedraw(false);

	if(owner.checked){
		winform.listview.setColumnWidth(150,5);
		winform.listview.fillParent(4);
	}
	else{
		winform.listview.setColumnWidth(0,4);
		winform.listview.fillParent(5);
	}
	
	winform.listview.setRedraw(true);
}

import com.wmPlayer;
var soundUrlCache = table.cache(); 
var pronounce = function(word,site){ 
	
	var url;
	if(site=="youdao"){
		url =  "https://dict.youdao.com/dictvoice?audio="+word+"&type=2"
	}
	else{
		url = soundUrlCache[word] || ..thread.invokeAndWait(
			function(word){
				import web.rest.htmlClient;
				var http = web.rest.htmlClient();
				var webster = http.api("https://www.merriam-webster.com/dictionary/","GET");
				 
				var htmlDoc = webster[word].get();//抓取韦氏词典网页
				var ele = htmlDoc.queryEle({"class":"play-pron-v2"});//获取指定 HTML 元素
				
				var url;
				if(ele && ele["data-dir"]  && ele["data-file"]){
					//合成韦氏词典美式发音链接
					url = "https://media.merriam-webster.com/audio/prons/en/us/mp3/" + ele["data-dir"] + "/" + ele["data-file"] + ".mp3"
				}
				else{
					//合成柯林斯词典美式发音链接
					url = "https://www.collinsdictionary.com/sounds/hwd_sounds/en_us_"+string.lower(word)+".mp3"
				}
				
				return url;
			} ,word
		)
		
		soundUrlCache[word] = url;
	}
	
	if(winform.btnVoice.disabledText) {
		//禁用按钮，显示 FontAwesome 字体音量变化动画
		winform.btnVoice.disabledText = ['\uF026','\uF027','\uF028'];
	}
	
	com.wmPlayer.url = url;
}

winform.listview.onSelChanged = function(selected,item,subItem,nmListView){
	var word = winform.listview.getItemText(item,2); 
	winform.lbMeaning.text = word + " " + winform.listview.getItemText(item,4); 
	winform.listview.selectedWord = word;
	
	pronounce(word,"youdao");	
}

winform.btnVoice.skin({
	color={
		active=0xFF00FF00;
		default=0xFF3C3C3C;
		disabled=0xFF999999;
		hover=0xFFFF0000		
	}
})

winform.btnVoice.oncommand = function(id,event){
	var word = winform.listview.selectedWord;
	if(!word) return winform.msgboxErr("请先点选单词");
	
	//禁用按钮，显示 FontAwesome 字体沙漏 （hourglass）动画。
	winform.btnVoice.disabledText = ['\uF254','\uF251','\uF252','\uF253','\uF250',text="获取音频 ..."];

	pronounce(word,"webster");
	thread.delay(1500);
	
	winform.btnVoice.disabledText = null;
}

winform.lbMeaning.ellipsis = "end";

winform.show();
win.loopMessage();
```

