2008-12-11

show一下我的TreeGrid

折腾了好多天才算做出来。IE7下测试开发的,结果到IE6下一看,全乱了,后来改了CSS就可以了。显示时有点小BUG,不过不影响大局。速度慢,数据量大时就挂掉了,所以实际用的时候加了分页显示。

扩展DateChooser类使之可以突出显示特殊日期

花了将近一天时间,总算整出来了。


----------------------
calendar_test.mxml:
----------------------


xmlns:calendar="calendar.*" layout="absolute" creationComplete="init()">


import mx.controls.Alert;
private function init():void
{
dateChooser.addSpecialDate(new Date(2008, 0, 1));
dateChooser.addSpecialDate(new Date(2008, 4, 1), 0xFFF000);
dateChooser.addSpecialDate(new Date(2008, 9, 1), 0xFFF000);

dateChooser.addSpecialDate(new Date(2008, 11, 1));
dateChooser.addSpecialDate(new Date(2008, 11, 10), 0x00FF00);
dateChooser.addSpecialDate(new Date(2008, 11, 12), 0x0000FF);
dateChooser.addSpecialDate(new Date(2008, 11, 25), 0xFFF000);
}
]]>







----------------------
CustomDateChooser.as:
----------------------

package calendar
{

import mx.controls.DateChooser;
import mx.core.mx_internal;
import mx.events.CalendarLayoutChangeEvent;
import mx.events.DateChooserEvent;
import mx.styles.StyleProxy;

use namespace mx_internal;

public class CustomDateChooser extends DateChooser
{

public static const SPECIALDATE_BACKGROUNDCOLOR:Number = 0xFF0000;

public function CustomDateChooser()
{
super();
}

// 添加特殊日期及显示的背景色(背景色是-1时为透明色)
public function addSpecialDate(date:Date,
backgroundColor:Number = SPECIALDATE_BACKGROUNDCOLOR):void
{
var grid:CustomCalendarLayout = CustomCalendarLayout(mx_internal::dateGrid);
var object:Object = new Object;
object.date = date;
object.backgroundColor = backgroundColor;
grid.specialDateList.push(object);
grid.update();
}

// 移除需要特殊显示的日期
public function removeSpecialDate(date:Date):void
{
var grid:CustomCalendarLayout = CustomCalendarLayout(mx_internal::dateGrid);
var i:int = 0;
for (i = 0; i < grid.specialDateList.length; i++)
{
if (grid.specialDateList[i].date == date)
{
grid.specialDateList.splice(i, 1);
grid.update();
break;
}
}
}

// 返回特殊日期数组
public function getSpecialDateList():Array
{
var grid:CustomCalendarLayout = CustomCalendarLayout(mx_internal::dateGrid);
var array:Array = new Array();
var i:int = 0;
for (i = 0; i < grid.specialDateList.length; i++)
array.push(grid.specialDateList[i].date,
grid.specialDateList[i].backgroundColor);
return array;
}

override protected function createChildren():void
{
super.createChildren();
if (mx_internal::dateGrid)
removeChild(mx_internal::dateGrid);
mx_internal::dateGrid = new CustomCalendarLayout();
mx_internal::dateGrid.styleName = new StyleProxy(this, calendarLayoutStyleFilters);
addChild(mx_internal::dateGrid);
mx_internal::dateGrid.addEventListener(CalendarLayoutChangeEvent.CHANGE,
dateGrid_changeHandler);
mx_internal::dateGrid.addEventListener(DateChooserEvent.SCROLL,
dateGrid_scrollHandler);
}

private function dateGrid_scrollHandler(event:DateChooserEvent):void
{
dispatchEvent(event);
}

private function dateGrid_changeHandler(event:CalendarLayoutChangeEvent):void
{
selectedDate = CustomCalendarLayout(event.target).selectedDate;
var e:CalendarLayoutChangeEvent = new
CalendarLayoutChangeEvent(CalendarLayoutChangeEvent.CHANGE);
e.newDate = event.newDate;
e.triggerEvent = event.triggerEvent;
dispatchEvent(e);
}

}

}


------------------------
CustomCalendarLayout.as:
------------------------

package calendar
{

import flash.events.MouseEvent;

import mx.controls.CalendarLayout;
import mx.core.IUITextField;
import mx.core.mx_internal;

use namespace mx_internal;

public class CustomCalendarLayout extends CalendarLayout
{

public var specialDateList:Array = new Array();

private var currentLabelName:String = "";
private var lastLabelColumnIndex:int = -1;
private var lastLabelRowIndex:int = -1;
private var lastLabelBackground:Boolean = false;

public function CustomCalendarLayout()
{
super();
addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
}

public function update():void
{
updateDisplayList(width, height);
}

override protected function updateDisplayList(
unscaledWidth:Number, unscaledHeight:Number):void
{
var array:Array = new Array();
var date:Date = null;
var i:int = 0;
var j:int = 0;
var k:int = 0;
var day:Number = 0;
super.updateDisplayList(unscaledWidth, unscaledHeight);
for (i = 0; i < specialDateList.length; i++)
{
date = specialDateList[i].date;
if (date.getFullYear() == CustomDateChooser(this.parent).displayedYear &&
date.getMonth() == CustomDateChooser(this.parent).displayedMonth)
array.push(specialDateList[i]);
}
for (i = 0; i < mx_internal::dayBlocksArray.length; i++)
{
for (j = 0; j < mx_internal::dayBlocksArray[i].length; j++)
{
mx_internal::dayBlocksArray[i][j].background = false;
day = Number(mx_internal::dayBlocksArray[i][j].text);
if (isNaN(day) == false)
{
for (k = 0; k < array.length; k++)
{
if (day == array[k].date.getDate() &&
mx_internal::dayBlocksArray[i][j].name != currentLabelName)
{
if (array[k].backgroundColor >= 0)
{
mx_internal::dayBlocksArray[i][j].background = true;
mx_internal::dayBlocksArray[i][j].backgroundColor =
array[k].backgroundColor;
}
}
}
}
}
}
}

private function mouseMoveHandler(event:MouseEvent):void
{
var currentX:int = -1;
var currentY:int = -1;
var currentBackground:Boolean = false;
var i:int = 0;
var j:int = 0;
var label:IUITextField = null;
for (i = 0; i < mx_internal::dayBlocksArray.length; i++)
{
for (j = 0; j < mx_internal::dayBlocksArray[i].length; j++)
{
label = mx_internal::dayBlocksArray[i][j];
if (label.mouseX == event.localX && label.mouseY == event.localY)
{
if (i != lastLabelColumnIndex || j != lastLabelRowIndex)
{
currentX = i;
currentY = j;
currentBackground = label.background;
label.background = false;
}
}
else
{
if (i == lastLabelColumnIndex && j == lastLabelRowIndex &&
label.name != currentLabelName)
label.background = lastLabelBackground;
}
}
}
if (currentX != -1 || currentY != -1)
{
lastLabelColumnIndex = currentX;
lastLabelRowIndex = currentY;
lastLabelBackground = currentBackground;
}
}

private function mouseUpHandler(event:MouseEvent):void
{
var i:int = 0;
var j:int = 0;
var label:IUITextField = null;
currentLabelName = "";
for (i = 0; i < mx_internal::dayBlocksArray.length; i++)
{
for (j = 0; j < mx_internal::dayBlocksArray[i].length; j++)
{
label = mx_internal::dayBlocksArray[i][j];
if (label.mouseX == event.localX && label.mouseY == event.localY)
{
currentLabelName = label.name;
break;
}
}
}
}

}

}


2008-11-29

一幅3D作品

  用Google SketchUp做的,样子惨了点。呵呵。

2008-11-28

用Flex搞定一个文件上传功能

  其实Flex文件上传功能几个月之前就写过,后台是Java,那段程序上传文件的同时还要保存一些其他信息,当时陆陆续续用了两个星期。这次后台是ASP.NET,功能还要简单些(文件上传时不附加其他信息),用了三天时间。与以前写的程序相比,新增的功能是上传完图片可以调整图片尺寸或者剪裁图片,调整图片尺寸是弹出TitleWindow设定宽、高,然后改变加载图片的Loader的大小,剪裁图片是用鼠标选择剪裁区域,做完以上的操作将图片信息传到服务器,由C#来修改图片。这些大概用了一天多。后来是把这段程序嵌入到现有的系统中,要从JavaScript处获取几个参数,这就用到了FABridge。开始是把Flex编译好的Flash放入层中,由层的显示/隐藏来模拟窗口。但遇到了一个问题:JavaScript从AS那里获取对象或属性时第一次还好,以后则会产生错误,一直没有找到解决方案。于是只好改成了弹出模式窗口,原来的系统在非IE浏览器中变形严重,所以我就没任何顾虑的用模式窗口了。还有个问题就是为了把上传相关的功能都写在一个程序文件里,接收文件信息我是直接读的Request.InputStream,先在AS里把参数用分隔符隔开并采用Base64编码,然后C#解码。开始是随机生成的文件名,没有特殊字符一切还好,后来参数里会有汉字,然后服务器端就不能正确读出了。后来写了段函数在AS中对字串做处理再往服务器端传问题得以解决,代码如下:


  private function encodeBase64(string:String):String
  {
    var result:String = "";
    var array:ByteArray = new ByteArray();
    var encoder:Base64Encoder = new Base64Encoder();
    array.writeUTFBytes(string);
    encoder.encodeBytes(array, 0, array.length);
    result = encoder.toString();
    return result;
  }

2008-11-09

潭柘寺

  苹果园地铁站转931路至潭柘寺,早晨八点多出门,十一点才到。下午返回后已经六点了。









2008-11-08

关于校内网的狗狗

  怎么赚取骨头?除了邀请好友以外,那就是多遛狗了。当然,遛狗也有损失骨头的时候,不过总的来说还是得骨头的机会多。(“主人,我刚才帮警察叔叔找到了迷路的小妹妹,并把她送回家,警察叔叔夸奖我,还奖励给我5根骨头呢!” )
  风险小一点的,还可以去喂挨饿的狗,喂水喂食抚摸后通常会得1-3根骨头。不过最好不要喂布拉多,以我的经验,这种狗不管怎么喂都不加骨头。也许是因为我自己养的就是这种狗?不得而知。当然,喂狗是要消耗狗食的。此外,多抚摸一下自己的狗狗,也会加一点骨头。
  还有一种比较好的方法,赚狗粮的方法,那就是先把自己的骨头全都消耗掉,比如换狗窝换背景换垫子什么的,然后骨头就剩一两块,或者干脆就没了。这时,扔飞盘或者捡球,狗接不住没关系,反正骨头变成0了也不会再减了,总有一次它会接会飞盘的,一旦够5块骨头了,就去买狗粮,然后再扔飞盘,如此周而复始,只要你不嫌烦。扔的次数多了游戏会要求输入验证码。
  我的皮皮:

2008-11-04

下班时遇到拍电视剧的了

  今天晚一个多小时下班,路过安贞桥西的过街天桥时,看到上面围了一大堆人,人群中架设着聚光灯、反光板之类的东西。以为是拍婚纱照呢,走近了才发现好像是在拍电视剧,于是走到一边停下来看热闹。我旁边一堆人围着一个小显示器,上面就是正在拍摄的画面。然后工作人员暂时阻止行人过桥,开始拍摄。两个演员,一个中年男子,一个小姑娘,小姑娘感觉长得比较一般,中年男子有些味道。两个人在夜景下对话。其间有些行人不耐烦,嚷嚷着表示抗议。几分钟以后拍摄告以段落,放行人通行。我也就下桥坐公交去了。
  下面这张照片是以前在那个过街天桥上拍的,时间大概是奥运前后。

随机产生A-Z任意一个字母

  领导交待给同事找一个随机产生A-Z任意一个字母的例子,然后同事打开百度,搜索。后来他又记起自己写过类似的东西,于是又找代码。这一幕场景似乎很搞笑。本人以前没用C#做过东西,今天下午被领导问起C#学的怎么样了,怕被BS,腆着脸说自己只学个皮毛。不过这类简单代码还是不在话下的:


    Random rand = new Random();
    int i = (int)Math.Floor(rand.NextDouble() * 26);
    char c = (char)(65 + i);
    Console.Write(c);

2008-10-30

昨晚做的一些梦

  晚上做梦梦到见了一盘清蒸蛇肉,好像很粗的样子,切成了三段,有两段里面有肠子,像粉条。这盘菜的外形很漂亮,然后厨师对我们几个人说可以把蛇头留下做纪念,我们没留蛇头,留了蛇尾。据说这蛇有剧毒。我没吃,还是有点心理障碍。然后又梦到一个同学被这种蛇给咬死了。然后呢,好像知道自己在做梦,但是眼前有盘蛇肉,于是想拍下来,想看下把梦里的东西拍下来醒来是什么样。找了半天相机,后来找到了,形状变得有些怪。拍完蛇肉后却发现相机显示屏上显示的是电视,然后里面是一种动物,好像演的是《动物世界》或《人与自然》。心想,看这种节目难怪要梦到蛇肉了。后来又梦到我们家乡的一所小学发生了凶杀案,凶手异常残忍,死者身上多处受伤。然后我奔赴凶杀现场,在路上收听广播,广播里是一对黑人情侣,在朗诵和死亡有关的散文,什么恐惧、瘟疫(和这些天的桔子有关,所以这个词才在我梦里出现吧)、艾滋啦,又说死亡是个缓慢的过程,它如何如何折磨垂死的人。后来到了学校,外面有很多人,见妈妈也在其中,哭地很伤心,我心一紧,赶紧上前大声问死的是谁,妈妈在抽噎,没有回答,于是我更急了,又继续问(生怕是我们家里人)。后来妈妈说是一位女教师,我才算长出一口气,甚至露出庆幸的表情。后来想到自己这样在这种场合不合适,于是让自己的表情变得凝重起来。
  又梦到公司组织过一场运动会,然后大家看比赛时让写下自己对公司的建议或者对自己的评价,交给公司做汇总统计。(运动会是从来没开过,问卷调查倒是在网上进行过一次,同事写的程序。)然后一位女同事拿着我们写的东西来到我的座位,对我说我们组有两个人中奖(原来还带抽奖的),一位是我们组领导,一位是我们组唯一一个女孩子同事(看中奖情况倒像是人为安排的),于是我把这些东西分发给大家,顺便还看了一下。其中还有两份是用英文写的。每份东西后面都有评语,英文的两份评语不是太好,仔细看了一下,原来其中一份连着好几页写的竟都是几个字母。我的评语是牛根生给写的(汗),署名是“牛牛”,对我充满了肯定。不过发现我标点用错了很多处,并且也不是手写的,是打印出来的。后来得知公司请了许多评委,评委之一的牛根生要求自己看的东西都是打印稿。原来如此。

2008-10-29

这年头,地铁也靠不住了

  昨天上班坐5号线,一路上走走停停,结果平时15分钟的路程走了有25分钟。今天5号线,在某站地铁门关不上了,结果又晚了10分钟。不知明天会怎样。

2008-10-25

红叶岭

  九点左右在德胜门坐上919红叶专线,十点多到达八达岭森林公园,两点返回。风有点大,稍稍有些冷,人不是特别多。

















2008-10-24

人民公社黄骅渔港

  昨天去廊坊办二代身份证时看到的,在人才市场对面。已经倒闭了。


2008-10-18

以后就用GOOGLE的博客了

  以前用的是YOURBLOG(http://thornbird313.yourblog.org),后来不知怎么就成博客大巴了,页面也全变了,还把我发的文章都给截了。以后就GOOGLE的博客吧。不过我平时倒是不怎么写博客。