2007年2月的存档

  • 18
  • 2月

Q:参看以下代码:
在类中定义了如下字段的方法:
private Cards hand;
public Cards PlayHand
{
get { return hand; }
}
其中Cards类继承了CollectionBase。
为什么明明PlayHand没有set,但仍可以使用PlayHand.Add()为hand增加内容呢?
14:35 2007-1-24
应该这样理解吧:PlayHand.add()实际上是get了hand,然后调用它的add()这个方法。并不是直接给hand赋了一个新值,所以不是set。

  • 16
  • 2月

忙碌了一周多,终于看到自己的成果——07年第一期的《希望泉》昨晚终于正式发布了,也终于可以长长抒一口气了。现在杂志最重要的就是等待读者的检验了。

07年第1期《希望泉》:
http://www.kaifulee.com/magazine/magazine200702/

  • 14
  • 2月

书上说了,控件的Anchor属性对解决控件对窗口大小改变时的响应问题特别有用。可惜,我看了半天也没从书中看出到是怎么个“有用”法,经过自己实验,终于明白了是个怎么回事。

anchor在lingoes中的解释是:
n.  锚
vt.  抛锚停泊, 使固定

在.net的窗口中,它应该是实现了“使固定”这个意思。

在属性窗口点击Anchor右边的下三角按钮,有一个非常形象的窗口可以让你选择Top,Bottom,Left,Right四个属性值的组合。

这四个属性的作用是当你选择了表示控件一个方向的属性,如Left,那么控件的这个方向的边与窗口同方向的边的距离将会被锁定,当Left时,控件的Left边与窗口的Left边的距离将不会随窗口大小的改变而改变。

这 样锁定的结果就是,如果对称的一对边(Left和Right、Top和Bottom)中锁定了其中一个,当窗口大小改变时,控件会改变自身的位置,确保与 窗口对应边的距离不变。如果将对称的一对边都进行了锁定,当窗口大小改变时,控件对应方向的大小会随之改变,即被拉伸或压缩。

回想起当年玩VB6的时候对窗口大小变化的无奈,这个Anchor实在是个好东西!

  • 14
  • 2月

今天终于把《C#入门经典》的第Ⅰ部分“C#语言”看完了,并且成功完成最后一个完整的例子:利用那个学习过程中被不断扩展的CardLib完成了一个控制台的游戏。

通过这个游戏的代码也感受到了面向对象编程的方法。
在这个程序中每一张牌是一个Card对象,拥有最基本的ToString()方法用于表示自身的花色和牌序和实现ICloneable接口的Clone()方法。

几张牌的集合是一个Cards对象,继承了CollectionBase类,实现了对集合中Card的索引,同时也实现了ICloneable接口的Clone()方法,返回经过复制的一个Cards对象。

一 副牌Deck则包含一个Cards集合,用于存储其中所有的牌。此外还实现了更多功能:重新洗牌Shuffle()、取得其中特定序号的牌GetCard ()、实现ICloneable接口的Clone(),再有一个用于解决在GetCard()时牌已经用完的事件LastCardDrawn()

每一个游戏玩家是一个Player()类的实例,拥有自己的Name、自己手里的几张牌PlayHand和判断自己是否已经获胜的方法HasWon()。

整 个游戏是一个Game类的实例,有一副要玩的牌playDeck、被玩家扔掉暂时不能用的牌的集合discardedCards和几个玩家的集合 players,使用SetPlayer()方法加入玩家,Reshuffle()方法来处理Deck的实例playDeck的 LastCardDrawn事件,DealHands()方法进行发牌,PlayGame()进行游戏并返回胜出者的编号。

这样,在main()函数中要做的只是建立player对象,调用newGame.SetPlayers()初始化玩家,再调用newGame.PlayGame()一切就都搞定了。

整个游戏中每一个独立的部分都与一个对象对应,代码中每一个部分保持独立,互不干扰。完成每一部分功能的时候不需要过多地考虑会不会对其他部分产生影响。That’s OOP!

  • 14
  • 2月

一般在一个有滚动条的网页上,由于窗口边框和滚动条占用了一部分,页面的实际可用宽度大约是屏幕水平分辨率-20左右的样子,例如在我的这台电脑,屏幕分辨率是1024×768,在不同浏览器默认界面下测得的网页可见区域大小为:
FireFox2:1007×606
IE6:1003×600
IE7(无菜单栏):1003×620
IE7(有菜单栏):1003×593
Opera9:1005×629

可见,做网页时,如果对宽度为1024的显示器,想不出现水平滚动条,1003还是个比较不错的宽度。对其他的分辨率,屏幕宽度-21应该是个合适的选择。

  • 12
  • 2月

刚刚看了《汉化教学文集2006》中的几篇文章,谈到了字符编码问题。终于明白了ASCII,Unicode,Unicode big endian,UTF-8的关系。

ASCII:学过计算机基础的都知道,8bits的英文编码。实际只用低7位,127个字符,32(0x20)为空格,之前是控制字符,之后是有效字符。当>128时,需要使用代码页(code page)来确定表示的字符。在保存文件时一般ANSI项就是指它。

Unicode:使 用两个字节对全球字符进行统一编码,有65536个编码。学名“UCS”——“Universal Multiple-Octet Coded Character Set”.UCS-2为两字节版本,UCS-4为四字节版本,目前两个版本内容是一样的(字符数还没超过2个字节能表示的范围)。

Unicode little endian:将Unicode中表示同一个字符的两个字节顺序返过来。主要目的是为了适应CPU处理字符的方式,加快处理速度。在Windows上为Unicode的默认存储方式(记事本保存对话框中的那个“Unicode”就是这个)。

Unicode big endian:Unicode字符编码以正序存储。非默认。

引用一段原文:

//  “endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,一个皇帝送了命,另一个丢了王位。

我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。  //

应该可以说明问题。

UTF-8:Unicode的一种传输及存储方式,主要是为了消除编码中那些0x0000的字节和减少存储英文时所占用的空间。

以下是Unicode(UCS-4)和UTF-8之间的转换关系表:
U-00000000 – U-0000007F: 0xxxxxxx
U-00000080 – U-000007FF: 110xxxxx 10xxxxxx
U-00000800 – U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 – U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 – U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 – U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。

BMP:Basic Multilingual Plane,UCS-4中0x0000—-这些字符。

引用一下原文:
//  UCS有两种格式:UCS-2和UCS-4。顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。下面让我们做一些简单的数学游戏:

UCS-2有2^16=65536个码位,UCS-4有2^31=2147483648个码位。

UCS -4根据最高位为0的最高字节(引注:即第一个字节)分成2^7=128个group。每个group再根据次高字节分为256个plane。每个 plane根据第3个字节分为256行 (rows),每行包含256个cells。当然同一行的cells只是最后一个字节不同,其余都相同。

group 0的plane 0被称作Basic Multilingual Plane, 即BMP。或者说UCS-4中,高两个字节为0的码位被称作BMP。

将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。而目前的UCS-4规范中还没有任何字符被分配在BMP之外。  //

BOM:Byte Order Mark,字节序,用以区分Unicode little endian与Unicode big endian。即使用名为”ZERO WIDTH NO-BREAK SPACE”的字符“0xFEFF”传输及存储时首先处理该字符。若读到FEFF,就表明这个字节流是Big-Endian的;而如果是FFFE,就表明 这个字节流是Little-Endian的。

以下为引用:
//  UTF-8不需要它来表明字节顺序,但但可以用BOM来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE”的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。 //

Windows就是使用BOM来标记文本文件的编码方式的。

区位码与GB2312之间的关系:
引用原文:
//  再说区位码,啊的区位码是1601,写成16进制是0x10,0x01。这和计算机广泛使用的ASCII编码冲突。为了兼容00-7f的ASCII编码, 我们在区位码的高、低字节上分别加上A0。这样“啊”的编码就成为B0A1。我们将加过两个A0的编码也称为GB2312编码,虽然GB2312的原文根 本没提到这一点。 //

  • 11
  • 2月

这两天可算是把我忙坏了,由于大家都在放寒假,很多人根本联系不上,本期《希望泉》的技术制作除模板和封皮的制作外,绝大部分工作都落到了我的头上……

一篇篇文章录入进模板,调整段首缩进,设置超级链接,一项项工作下来,时间很快就过去了。不过好在其中又体会到了不少东西:为了保证《希望泉》杂志页面对 不同分辨率显示器的适应能力,之前研究了很多CSS与javascript的东西。尤其是对层的定位和显隐有了比较明确的认识。最重要的是深刻体会到了人 员管理的重要性——如果你找不到人来给你干活,当主管的可能会累死!

春节前新一期《希望泉》就要发布了,看到自己的成果,还是很高兴的!*_^

  • 08
  • 2月

前一阵子从网上看到了一个非常好的制作CSS菜单的工具:Infinite Menus。完全可视化界面,制作出来的菜单那叫精美……
下载地址:http://www.opencube.com/download.asp

但软件是收费的,而且说得也不是很明白:制作和在本地调试期间是看不到收费的迹象的,但一旦发布到网上,每次撕开网页都会弹出个对话框“Infinite Menus must be purchased for Internet use.”相当令人郁闷。

仔细研究了一下它生成的代码,发现虽然做了隐藏,但要求注册的代码也做的太不够健壮了,只要把它生成的那个ocscript.js最后的这一段代码删除:

ims1a="Add your unlock code here.";;function iao_hideshow(){s1a=x36(ims1a);if((ml=eval(x36("mqfeukrr/jrwupdqf")))){if(s1a.length>2){for(i in(sa=s1a.split(":")))if((s1a=='hidden')||(ml.toLowerCase().indexOf(sa[i])+1))return;} eval(x36("bnhvu*%Mohlrjvh$Ngqyt\"pytv#ff\"syseketgg$gqu$Jpwisphx!wvi/$,"));}};function x36(st){return st.replace(/./g,x37);};function x37(a,b){return String.fromCharCode(a.charCodeAt(0)-1-(b-(parseInt(b/4)*4)));}

OK,再也不会有提示了!
ps:其实分析这段代码是件相当有意思的工作,你也可以试一试!(提示:eval函数可以执行字符串变量中的代码)

  • 06
  • 2月

刚刚从Google上搜到的一个用来显式固定菜单的代码。用来在页面上显示固定位置的菜单的。上次自己做《希望泉》的时候只知道position的fixed不能被IE6支持,只好用条件注释:

<!--[if lte IE 6]>
<script language="javascript">
document.getElementById("menu").style.cssText="width:80px; z-index:999999; position:absolute; top: 100px; left: 20px;";
</script>
<![endif]-->

将IE6下的属性换成absolute。没想到这个代码这么简单就实现了固定菜单对浏览器的“通吃”,学习…

<html>
<head>
<title>永远固定不随页面滚动的菜单 www.div-css.com</title>
<meta http-equiv=content-type content="text/html; charset=gb2312">
</head>
<body>

<div style= "position:fixed !important; top/**/:0px;
position:absolute; top:expression(offsetParent.scrollTop);
width:100%;">
<div  style= "width:100%; overflow:hidden; background:red; font-size:13px; ">
menu位置:<a xhref="http://www.div-css.com" mce_href="http://www.div-css.com"> www.div-css.com dic+css技术教程资料下载</a>
</div>
</div>

<div style="margin-top:30px;">
IE Firefox下测试通过
1<br />2<br />3<br />4<br />5<br />6<br /><br />
1<br />2<br />3<br />4<br />5<br />6<br /><br />
1<br />2<br />3<br />4<br />5<br />6<br /><br />
1<br />2<br />3<br />4<br />5<br />6<br /><br />
1<br />2<br />3<br />4<br />5<br />6<br /><br />
1<br />2<br />3<br />4<br />5<br />6<br /><br />
</div>
</body>
</html>
  • 03
  • 2月

对于一些资源,尤其是那些比较重要的系统级资源(如文件系统对象、网络系统对象、系统图形界面对象),使用后必需及时显式的释放,因为系统的垃圾回收器(GC)并不能保证在合适的时候被触发。
使用方法
1.用完后显式调用Dispose()方法
2.使用using结构,在对象超出作用域时using结构会自动调用Dispose()。
抄一段书上的代码:
using (Graphics g = this.CreateGraphics())
{
g.DrawLine(Pens.Black, new Point(0,0), new Point(3,5));
}
等价于:
Graphics g = this.CreateGraphics();
try{
g.DrawLine(Pens.Black, new Point(0,0), new Point(3,5));
}
finally{
if (g != null)
((IDisposable)g).Dispose();
}

所有标签:.net Ajax Java javascript Linux map MySQL RSS TD-SCDMA Ubuntu vim web Win7 乱码 基础知识 备份 奥运会 希望泉 性能 缓存 编程