用虚表做了个界面

光庆 9小时前 36

以下代码,因缺少必要文件,无法直接运行,仅供参考:

import win.ui;
import godking.vlistEx
/*DSG{{*/
var winform = win.form(text="aardio form";right=959;bottom=679;maximize=1)
winform.add(
plus={cls="plus";text="提取豆包价格";left=184;top=616;right=320;bottom=664;db=1;dl=1;notify=1;z=2};
plus2={cls="plus";text="计算明日价格";left=352;top=616;right=488;bottom=664;db=1;dl=1;dr=1;notify=1;z=3};
plus3={cls="plus";text="导出明日价格表";left=520;top=616;right=656;bottom=664;db=1;dr=1;notify=1;z=4};
plus4={cls="plus";text="复制豆包查询语句";left=16;top=616;right=152;bottom=664;db=1;dl=1;notify=1;z=5};
vlistEx={cls="vlistEx";text="自定义控件";left=8;top=8;right=952;bottom=600;border=1;db=1;dl=1;dr=1;dt=1;z=1}
)
/*}}*/

import godking.message
import console

winform.vlistEx.padding=0;
winform.vlistEx.setRowHeight(30);

var 豆包查询 = `今日蔬菜以下品种的批发价格:白萝卜、胡萝卜、马铃薯、大蒜、姜、大葱、黄洋葱、红洋葱、大白菜、结球甘蓝、菜花、西兰花、芹菜、黄瓜、青冬瓜、长南瓜、红南瓜、绿南瓜、西葫芦、大红西红柿、樱桃西红柿、长茄、圆茄、甜椒、尖椒、菜豆、油菜、青萝卜、小黄瓜、丝瓜、苦瓜、菠菜。`

//生成列数据
var day = time.now().addDays(1);
var 明日价格日期 = day.format("YYYY-MM-DD");
var 昨日价格日期 = time.now().format("YYYY-MM-DD");
var 明日价格列 = 0;
var 昨日价格列 = 0;
var 豆包列 = 10;

var count3=0;
var firstday;
do{
	var week = day.dayofweek;
	if week==3 count3++;
	if count3==2 {
		firstday = time(day);
		break;
	}
	day.addDays(-1);
} while(1);
var fields = {"品种"};
var weeks = {"周三","周四","周五","周六","周日","周一","周二","平均涨跌","豆包价","周三","周四","周五","周六","周日","周一","周二"}
var files = {};
var days = {};
for(i=1,7,1){
	var day = firstday.format("YYYY-MM-DD");
	if day === 昨日价格日期 {
		昨日价格列 = i+1;
	}	
	..table.push(days,day);
	..table.push(fields,weeks[i]++'\n'++day)
	var file = "\每日价格表\"++firstday.year++"年\"++firstday.month++"月\"++"每日价格_"++firstday.format("YYYYMMDD")++".xls";
	..table.push(files,file);
	firstday.addDays(1)
}
..table.push(days,"");
..table.push(fields,'平均价  周涨跌')
..table.push(files,"");

..table.push(days,"");
..table.push(fields,'豆包价')
..table.push(files,"");

for(i=10,16,1){
	var day = firstday.format("YYYY-MM-DD");
	if day === 明日价格日期 {
		明日价格列 = i+1;
	}
	if day === 昨日价格日期 {
		昨日价格列 = i+1;
	}
	..table.push(days,day);
	..table.push(fields,weeks[i]++'\n'++day)
	var file = "\每日价格表\"++firstday.year++"年\"++firstday.month++"月\"++"每日价格_"++firstday.format("YYYYMMDD")++".xls";
	..table.push(files,file);
	firstday.addDays(1)
}
winform.vlistEx.setColumns(fields /*列标题*/,90/*列宽*/,1/*0左1中2右*/);

//生成行数据
var shucai = string.split("白萝卜,胡萝卜,马铃薯,大蒜,姜,大葱,黄洋葱,红洋葱,大白菜,结球甘蓝,菜花,西兰花,芹菜,黄瓜,青冬瓜,长南瓜,红南瓜,绿南瓜,西葫芦,大红西红柿,樱桃西红柿,长茄,圆茄,甜椒,尖椒,菜豆,油菜",",");
import godking.libxl
//统计上周均价
var jiages,上周均价 = {},{};
for(i=1,#shucai,1){
	jiages[i] = {shucai[i]};
}
for(i=1,7,1){ //上周数据
	var file = ..io.exist(files[i]);
	if !file return winform.msgErr("上周价格文件缺失,无法形成对比数据:"++files[i]); 
	var book = godking.libxl.open(file /*文件*/,/*表名或索引*/,/*文件密码*/);
	var sheet = book.sheet(/*表名称或索引*/);
	var tb = sheet.getTable("D3","D30",/*字段表*/,/*空文本替代符*/,/*是否转文本*/,/*是否数字格式化*/,/*是否计算公式*/,/*公式空默认值*/);
	book.close();
	if #tb!==28 return winform.msgErr("品种价格缺失:"++files[i]); 
	table.remove(tb,27);
	tb = table.flat(tb);
	for(n=1,#tb,1){
		上周均价[n]:=0;
		上周均价[n] += tb[n];
		table.push(jiages[n],tb[n]);
	}
}
for(n=1,#上周均价,1){
	上周均价[n] = ..math.round(上周均价[n]/7,2);
}
//涨跌列数据
for(n=1,#jiages,1){
	table.push(jiages[n],"0%");
	table.push(jiages[n],0);
}
//统计本周价格数据
var 本周均价,本周数量 = {},0;
for(i=10,16,1){ //上周数据
	var file = ..io.exist(files[i]);
	if !file break;
	本周数量 ++;
	var book = godking.libxl.open(file /*文件*/,/*表名或索引*/,/*文件密码*/);
	var sheet = book.sheet(/*表名称或索引*/);
	var tb = sheet.getTable("D3","D30",/*字段表*/,/*空文本替代符*/,/*是否转文本*/,/*是否数字格式化*/,/*是否计算公式*/,/*公式空默认值*/);
	book.close();
	if #tb!==28 return winform.msgErr("品种价格缺失:"++files[i]); 
	table.remove(tb,27);
	tb = table.flat(tb);
	for(n=1,#tb,1){
		本周均价[n]:=0;
		本周均价[n]+=tb[n];
		table.push(jiages[n],tb[n]);
	}
}
for(n=1,27,1){
	if 本周数量 {
		本周均价[n] = ..math.round(本周均价[n]/本周数量,2);
	} else {
		本周均价[n] = 0;
	}
}
winform.vlistEx.setTable( jiages /*数据表*/, false/*列标题*/,/*列宽*/,/*0左1中2右*/,/*转数组*/,/*转Utf8*/,/*克隆表*/,/*恢复设置*/);
winform.vlistEx.setColumnWidth(9 /*列号*/,140 /*宽度*/)

var getjunjia = function(row){
	var count,all=0,0;
	for(i=11,17,1){
		var s = winform.vlistEx.getCellData(row /*行号*/,i/*列号或字段key*/);
		if s!==null {
			count ++ ;
			all += s;
		} else {
			本周均价[row] = all?(..math.round(all/count,2)):0;
		}
	}
}

winform.vlistEx.onDrawCellRectBg = function(row,col,hdc,rect,bkcolor,text,font,align,valign,recall){
	if col>=2 and col<=8 { //上周价格
		gdi.fillRect(hdc,bkcolor,rect)
		rect.top += (1-上周均价[row]/10)*rect.height
		gdi.fillRect(hdc,0xFFBBBB,rect)
		return true; 
	}
	if col===豆包列 { //doubao
		var rect1 = rect.clone();
		rect1.inflate(-5,-5);
		var p = godking.paint.fromHdc(hdc);
		p.smoothMode = false;
		p.offsetMode = false;
		p.drawRect(rect1 /*绘制范围RECT*/,0xFF32CD32,/*线宽*/,/*线型*/);
		p.close()
		return true;
	}	
	if col>=11 { //本周价格
		var rect1 = rect.clone();
		rect1.inflate(-5,-5);
		gdi.fillRect(hdc,bkcolor,rect)
		rect.top += (1-本周均价[row]/10)*rect.height
		gdi.fillRect(hdc,0xBBFFBB,rect)
		if 明日价格列===col {
			var p = godking.paint.fromHdc(hdc);
			p.smoothMode = false;
			p.offsetMode = false;
			p.drawRect(rect1 /*绘制范围RECT*/,0xFFFF4500,/*线宽*/,/*线型*/);
			p.close()
		}			
		return true; 
	}
}

import godking.paint
winform.vlistEx.onDrawCellRectContent = function(row,col,hdc,rect,bkcolor,text,font,align,valign){
	if col===9 {
		var p = godking.paint.fromHdc(hdc);
		p.textAntiAlias = 5;
		var y1 = rect.top + (1-上周均价[row]/10)*rect.height;
		var y2 = rect.top + (1-本周均价[row]/10)*rect.height;
		var pots = {{rect.left,y1},{rect.right,y2},{rect.right,rect.bottom},{rect.left,rect.bottom}};
		p.fillPolygon(pots /*多点数组*/,0xFFFFBBBB);
		p.drawText(rect /*文本范围RECT*/,'\u2000'++上周均价[row],::LOGFONT(name="宋体";h=12*owner.dpi;color=0xFF000000;brush=null),0/*格式*/,0/*水平*/,1/*垂直*/,false/*截短*/);
		p.drawText(rect /*文本范围RECT*/,本周均价[row]++'\u2000',::LOGFONT(name="宋体";h=12*owner.dpi;color=0xFF000000;brush=null),0/*格式*/,2/*水平*/,1/*垂直*/,false/*截短*/);
		var 涨跌 = math.round((本周均价[row]-上周均价[row])*100/上周均价[row],2);
		var w = rect.width/3.5;
		rect.inflate(-w,-5);
		if 涨跌>=0 {
			p.fillRoundRect(rect /*绘制范围RECT*/,60,0xFFFF4500);
		} else {
			p.fillRoundRect(rect /*绘制范围RECT*/,60,0xFF32CD32);
		}
		p.drawText(rect /*文本范围RECT*/,涨跌++"%",::LOGFONT(name="宋体";h=12*owner.dpi;color=0xFFFFFFFF;bold=0),0/*格式*/,1/*水平*/,1/*垂直*/,false/*截短*/);
		p.close();
		return true; 
	}
	if col===明日价格列 and #text { //本周价格
		var rect1 = rect.clone();
		rect1.inflate(-7,-7);
		var p = godking.paint.fromHdc(hdc);
		p.textAntiAlias = 5;
		p.drawText(rect1 /*文本范围RECT*/,text,font,0/*格式*/,0/*水平*/,1/*垂直*/,false/*截短*/);
		var v = tonumber(text);
		var v1 = winform.vlistEx.getCellData(row /*行号*/,昨日价格列/*列号或字段key*/);
		var cha = ..math.round((v-v1)/v1*100,1);
		rect1.left = rect1.left + rect1.width/2-5;
		if cha>=0 {
			p.fillRoundRect(rect1 /*绘制范围RECT*/,0/*圆角半径*/,0xFFFF4500);
		} else {
			p.fillRoundRect(rect1 /*绘制范围RECT*/,0/*圆角半径*/,0xFF32CD32);
		}
		p.drawText(rect1 /*文本范围RECT*/,cha++"%",::LOGFONT(name="宋体";h=12*owner.dpi;color=0xFFFFFFFF),0/*格式*/,1/*水平*/,1/*垂直*/,false/*截短*/);
		p.close()
		return true; 
	}	
	
}

winform.vlistEx.onResizeCol = false; 
winform.vlistEx.onEditBegin = {true,10,明日价格列}; 
winform.vlistEx.onEditEnd = function(row/*行*/,col/*列*/,text/*内容*/,endType/*结束类型*/){
	/*单元格编辑完毕事件。注意:只有onEditBegin事件返回true,此事件才会触发。若不定义此事件,则等同于返回true。
	  endType为触发编辑结束的事件类型,_vlistEx_endType开头的常量,定义如下:
	      1、失去焦点;2:按了回车;3:按了TAB;4:点击编辑框以外区域;5:下拉框选择了项目;
	  返回值可以有多个:
	      1、是否允许修改。false不允许,true允许,返回文本则改为新文本;
	      2、事件处理完毕后需继续执行的函数;
	      从第3个往后:给返回值2函数传递的参数;
	*/
	var jiage = tonumber(text);
	if !jiage return false; 
	var zuori = winform.vlistEx.getCellData(row /*行号*/,昨日价格列/*列号或字段key*/);
	if !zuori return false;
	if ..math.abs((jiage-zuori)/zuori)>0.1 return false;   
	return true; 
}

import win.clip
winform.plus.oncommand = function(id,event){
	var text = win.clip.read();
	text = ..string.replace(text,' ','');
	var 蔬菜 = {"白萝卜","胡萝卜",{"马铃薯","土豆"},"大蒜",{"姜","生姜"},"大葱","黄洋葱","红洋葱",
	"大白菜",{"结球甘蓝","包菜"},	"菜花","西兰花","芹菜",{"黄瓜","普通黄瓜"},"青冬瓜","长南瓜","红南瓜","绿南瓜","西葫芦",
	"大红西红柿",{"樱桃西红柿","千禧"},"长茄","圆茄",{"甜椒","彩椒","圆椒"},{"尖椒","青椒"},{"菜豆","芸豆"},{"油菜","上海青"}}	
	var t = {};
	var ss = ..string.split(text,'\r\n');
	for(i=1,#ss,1){
		var sss = ..string.split(ss[i],"<:>");
		if #sss=2 {
			sss[2] = tonumber(sss[2])
			if sss[2] {
				var s = ..string.split(sss[1],"((");
				sss[1] = s[1];
				..table.push(t,sss);
			}
		}
	}
	for(i=1,27,1){
		var s = 蔬菜[i];
		if type(s)===type.table {
			for(n=1,#t,1){
				for(j=1,#s,1){
					if t[n][1]===s[j] {
						winform.vlistEx.setCellText( i/*行号*/,10/*列号或字段key*/,t[n][2]/*单元格数据*/);
						continue;
					}
				}
			}
		} else {
			for(n=1,#t,1){
				if t[n][1]===s {
					winform.vlistEx.setCellText( i/*行号*/,10/*列号或字段key*/,t[n][2]/*单元格数据*/);
					continue;
				}
			}
		}
	}
}

winform.plus2.oncommand = function(id,event){
	for(i=1,27,1){
		zuori = winform.vlistEx.getCellData(i /*行号*/,昨日价格列/*列号或字段key*/);
		doubao = winform.vlistEx.getCellData(i /*行号*/,豆包列/*列号或字段key*/);
		if !zuori or ! doubao {
			winform.vlistEx.setCellText(i /*行号*/,明日价格列/*列号或字段key*/,0/*单元格数据*/);
			continue;
		}
		var mingri;
		if doubao>=zuori { //价格上涨
		    mingri = zuori*(1+math.random(1,6)/100);
		} else {	// 价格下跌
		    mingri = zuori*(1-math.random(1,6)/100);
		}
		mingri = math.round(mingri,2);
		winform.vlistEx.setCellText(i /*行号*/,明日价格列/*列号或字段key*/,mingri/*单元格数据*/);
		getjunjia(i);
	}
}
var getliang = function(min,max,base){
	if !min or !max or !base return 0; 
	var v = 0;
	do{
		v = base * (1+math.random(-10,10)/100);
	} while(v<min or v>max);
	return math.round(v,0); 
}

winform.plus3.oncommand = function(id,event){
	var zuoriwenjian = files[昨日价格列-1];
	var mingriwenjian = files[明日价格列-1];
	if !mingriwenjian {
		var day = time.now().addDays(1);
		mingriwenjian ="\每日价格表\"++day.year++"年\"++day.month++"月\"++"每日价格_"++day.format("YYYYMMDD")++".xls";
		..io.createDir("\每日价格表\"++day.year++"年");
		..io.createDir("\每日价格表\"++day.year++"年\"++day.month++"月");
	}
	if io.exist(mingriwenjian) {
		if !winform.msgAsk('文件已存在,是否覆盖?\n'++mingriwenjian) return ; 
	}
	var book = godking.libxl.open(zuoriwenjian /*文件*/,/*表名或索引*/,/*文件密码*/);
	var sheet = book.sheet(/*表名称或索引*/);
	//标题
	sheet.setCellStr(1/*行号*/,1/*列号*/,days[明日价格列-1]++"价格指数数据"/*文本*/,/*单元格格式*/,/*合并单元格处理方式*/);
	//正常品种
	for(i=1,26,1){
		var jiage = winform.vlistEx.getCellData(i /*行号*/,明日价格列/*列号或字段key*/);
		sheet.setCellValue(i+2/*行号*/,4/*列号*/,jiage/*写入值*/,/*单元格格式*/,/*合并单元格处理方式*/);
		var base = sheet.getCellNum(i+2/*行号*/,5/*列号*/,/*合并单元格处理方式*/):0;
		var min =  sheet.getCellNum(i+2/*行号*/,6/*列号*/,/*合并单元格处理方式*/):0;
		var max =  sheet.getCellNum(i+2/*行号*/,7/*列号*/,/*合并单元格处理方式*/):0;
		shuliang = getliang(min,max,base);
		sheet.setCellValue(i+2/*行号*/,5/*列号*/,shuliang/*写入值*/,/*单元格格式*/,/*合并单元格处理方式*/);
	}
	//油菜
		var jiage = winform.vlistEx.getCellData(27 /*行号*/,明日价格列/*列号或字段key*/);
		sheet.setCellValue(30/*行号*/,4/*列号*/,jiage/*写入值*/,/*单元格格式*/,/*合并单元格处理方式*/);
	//保存
	mingriwenjian = ..io.fullpath(mingriwenjian);
	book.save(mingriwenjian);
	book.close();
	winform.msgOk('已保存完至:\n'++mingriwenjian,1000);
}

winform.plus4.oncommand = function(id,event){
	win.clip.write(豆包查询);
	winform.msgOk("已复制到剪贴板",1000);
}

import godking.skin
godking.skin.setBlue(winform,/*排除列表*/,50/*圆角半径*/,/*渐变方向*/,/*文本颜色*/);
winform.show();
winform.vlistEx.redraw(/*是否强制*/);
win.loopMessage();
最新回复 (1)
  • yuantian 4小时前
    0 2
    蛙趣,这要是单元格中,能再加上折线,那可就更牛了
返回