Archive for February 2006

作者:TomMax (笑望人生) 出处:csdn community

有许多人问的,.Net中的委托以及事件处理。我拿简单的例子说明一下,是现实中的例子:

比如说一个公司(场景),你是老板,手下有两个员工,小张和小王。
你命令小王,如果小张玩游戏,则小王扣去小张500元钱。

这就是现实中的委托。

实际上,在写程序中,程序员就是老板,小张和小王就是两个对象。小张玩游戏是一个方法,小张还有一个游戏事件,他玩游戏激发这个事件。而小王就是事件处理对象,他负责把小张的钱扣除500。

所以,委托有如下几个要素:
1 激发事件的对象–就是小张
2 处理对象事件的对象–就是小王
3 定义委托,就是你让小王监视小张。

如果这三个要素都满足的话,则你就写出了一个完整事件的处理。

下面有个例子:在vs.net2003 C#控制台应用程序编辑运行成功:
using System;

namespace CSharpConsole
{
 public class 场景
 {
  [STAThread]
  public static void Main(string[] args)
  {
   Console.WriteLine(“场景开始了….”);
   // 生成小王
   小王 w = new 小王();
   // 生成小账
   小张 z = new 小张();

   // 指定监视
   z.PlayGame += new PlayGameHandler(w.扣钱);

   // 开始玩游戏
   z.玩游戏();

   console.writeline(“场景结束…”);
   Console.ReadLine();
  }
 }

 // 负责扣钱的人
 public class 小王
 {
  public 小王()
  {
   Console.WriteLine(“生成小王…”);
  }

  public void 扣钱(object sender,EventArgs e)
  {
   Console.WriteLine(“小王:好小子,上班时间胆敢玩游戏…”);
   Console.WriteLine(“小王:看看你小子有多少钱…”);
   小张 f = (小张)sender;
   Console.WriteLine(“小张的钱: ” + f.钱.ToString());
   Console.WriteLine(“开始扣钱……”);
   System.Threading.Thread.Sleep(500);
   f.钱 = f.钱 – 500;
   Console.WriteLine(“扣完了….现在小张还剩下:” + f.钱.ToString());
  }
 }

 // 如果玩游戏,则引发事件
 public class 小张
 {
  // 先定义一个事件,这个事件表示“小张”在玩游戏。
  public event PlayGameHandler PlayGame;
  // 保存小张钱的变量
  private int m_Money;

  public 小张()
  {
   Console.WriteLine(“生成小张….”);
   m_Money = 1000; // 构造函数,初始化小张的钱。
  }

  public int 钱 // 此属性可以操作小张的钱。
  {
   get
   {
    return m_Money;
   }
   set
   {
    m_Money = value;
   }
  }

  public void 玩游戏()
  {
   Console.WriteLine(“小张开始玩游戏了…..”);
   Console.WriteLine(“小张:CS好玩,哈哈哈! 我玩…..”);
   System.Threading.Thread.Sleep(500);
   System.EventArgs e = new EventArgs();
   OnPlayGame(e);
  }

  protected virtual void OnPlayGame(EventArgs e)
  {
   if(PlayGame != null)
   {
    PlayGame(this,e);
   }
  }
 }

 // 定义委托处理程序
 public delegate void PlayGameHandler(object sender,System.EventArgs e);

}

武大的考研成绩出来了,626的一帮强人出来的三个都是个牛牛的分数.真替替们开心.

老五不是很理想.他说他早就预料到了.眼角眉梢却流露出淡淡的悲伤.不过也没什么事情,对于他,还是没必要担心的.那小子天生狗屎运,再加一张忽悠嘴.混世松松的.而且他心也不在这上面.师傅考了个有点不上不下的分数.QQ里也是一颗悬着的心.劝她放下心来,自己却也有点担心.不过只要能划进线里,面试出出彩,也绝对NO P.对于她面试,我还是蛮有信心地.毕竟是偶地师傅么.毛毛,恩,似乎该改个绰号叫毛硕了吧,居然弄了个413…我倒.这家伙疯了.乐倒回我信息居然问我考的如何.我考的如何?我么…好像没报考吧…-_-!!

四人帮里俩MM方向算是定下来了.俩武大.我和老五就不知道要漂到哪里去了.师傅说我们都是大人了.要考虑怎么大方怎么得体,老是以前一样不好.不合适.恩,都是大人了,毛毛师傅努力面试好好表现,老五和我争取签份好工作.一起加油吧.

Feb 26

终于写完了

No comment - Post a comment

终于搞定了所有的部分.本来计划前天晚上就能搞定的.却还是在GDI+里遇到了一些意想不到的问题.还好有Google,还好有MSDN,还好有CSDN,还有QQ Group.呵呵.中午给晓明老师Email过去.然后开始着手写论文.这个,应该不太耽误时间的.

吃饭去嘎.

下午写到了这个系统最让我头疼的地方.动态折线图.

因为之前从来没接触过GDI+方面的东西.一点概念都没有.于是去MSDN转了圈,看了半天文档以后开始动手.摸摸索索的也搞没真么出问题.却忽然感觉肚子痛…郁闷.穿的太单薄,拉肚子了...跑了几趟WC以后终于安定下来.然后接着鼓捣.

生成折线图的类快写完了才注意到,昨天搞的那个调用代理类的接口似乎不太合理.居然直接传了DataSet对象过来….完了传过来还需要变成数组.晕,搞的这复杂.于是又跑到那个接口类里一顿修补…好了,传个结构数组过来.直接就能用..

晚上对着显示器一点力气都没有了.记起晓明老师说的话,怎么实现不重要,关键是一开始结构要想好…桌子上有本UML教程,寒假买的,没来得及翻几页.看来.真该抽时间好好看看了.

Feb 22

foreach遍历

No comment - Post a comment

下午写一个函数,试图遍历整个Form里的TextBox。想都没有想我就这样写了下来:

foreach(TextBox temp in this.Controls)
{
    temp.Text="……";
}

结果编译程序报错。汗。“指定的转换无效”????WHY?难道还要强制转换?难道遍历的还有不是TextBox的Control?可是已经指定了只遍历TextBox控件。

想了半天没弄明白。

想想还了个方式写:

foreach(Control temp in this.Controls)
{
    if(temp is TextBox)
    {
        temp.Text="……";
    }
}

编译通过。功能正常。奇怪奇怪真奇怪。难道前一个函数真的会遍历出非TextBox的Control??

于是再仔细看了看foreach in 的语法说明:

嵌入语句为数组或集合中的每个元素继续执行。当为集合中的所有元素完成迭代后,控制传递给 foreach 块之后的下一个语句。--MSDN2003

晕,我居然一直以来都以为的是遍历所有控件里的指定控件。。。

Feb 20

换新家啦

1 comment - Post a comment

学校的服务器要整理了.寄生的日子不长了.昨天去买了个ASP的空间,然后去改了域名解析.下午终于解析生效.呼呼.开心的一塌糊涂.终于不需要去搞那龌龊的URL转向了…HOHO.

这几天在写毕业设计里的一个小工具,功能是模拟水质检测探针,实时向数据库插入记录.

下午一个问题挡住了,想实现一个小功能:最小化窗口以后任务栏窗口不可见,只显示在状态栏.结果看了半天,居然查不到Form控件最小化所触发的事件.这可如何是好???

本来打算用MFC,可回头一想不对:偶这会用的索C#,哪里来的MFC可以用?没辙.MSDN转了一圈,没.GOOGLE也没有搜到.后来群里问了一下.有个兄弟说了下想法,用Deactivate事件.这个事件发生在当前窗口失去焦点,转换为不活动窗口时发生.想想也不错.只是有个缺点.就是即使不最小化,只是转换为不活动窗口时也会最小化到状态栏.不过还是先用着吧.写完了其他部分再回来看看该怎么搞.

Feb 18

回来了

No comment - Post a comment

早上6点起来,洗漱完毕就冲上了68路.赶到人才市场已经是七点半.大厦门口已经排起了很长的队伍.买完票进去才发现来的太早了,招聘单位还没来几个.晕.看看墙上的导航图和招聘单位名单,发现居然有个招聘养猪人员的.又汗了一下.想想一会估计人就该多了,挤进去不容易,就先跑到五楼.打算一会从上往下.也省些事情.

9点,招聘单位来的差不多了,大厅里人也差不多了.于是开始行动.五层投了一份软件工程师的职位,三层一层各投了一份网页设计师,然后赶紧冲出来吸口气.投最后一份简历的时候,那位负责人说你填张表吧.我问说有简历还要填表么?他说你的简历这么精致,我都不好意思拿来…我接着汗…

站在台阶上一往,才发现来的时候的那些人和现在比起来真的是小巫见大巫了.买票的队伍已经排到一百米以外了…回头看看里面拥挤的人群.唉,真担心会出什么事情.

一个感觉,经验,最重要.去问的几家企业,先问的都不是你学过什么,而是问你做过什么,有实际的经验没有.就算是应届毕业生,只要平时有参加一些项目实践.也还是很有竞争力的.

另外,精心做一份好的简历,说不定会有意外的收获.嘿嘿嘿嘿…

等通知吧,接着搞偶地毕业设计.

 

准备去明天的招聘会.郑州的高校都开学了,估计又要好挤.找工作这种事情,绝对是个体力活.Bless Me.

下午搞完了简历,简历封面贴这里,个人认为还不错的.

哼哼,一份简历搞下来5块多,不出3000一个月的公司,坚决不投.哇卡卡卡卡.

Google昨天发布了Google中国的Blog,取名Google黑板报,目前已经发布了两篇博客文章.按照他们自己的说法:"我们希望这里成为普通 Google 员工(简称 googler) 与用户分享点滴、自由涂画的小园地,就像我们童年教室后面的黑板报一样。我们在做什么,公司发生了什么新鲜的事,我们的新想法、新创意……"看来Google想把这里作为客户了解自己的一个渠道.通过员工自己的涂鸦,展现给中国Googler一个完整的,透明的,生动的IT公司."这也给关心我们、关心搜索的朋友提供了一个直接了解我们的窗口。Googler 会经常在这里发帖子…"可以知道的是:这个Blog的写作者是面向所有的Google.而根据DoNews的消息,李开复由于报名太迟,他的文章只能在数日以后才可以发布.Google的价值观和企业文化又再一次向我们展示了自身的魅力.

这个Blog是Google第三次开通企业Blog,之前有韩国Google总部的Blog和Google与李开复博士,后者在前段时间用于披露Google与Microsoft争夺李博士时发生的一些事情.现在已经停止了更新,但是仍然可以访问.而这三个Blog之间似乎没有任何关联.

众多追捧Google的网民有福了,通过这个Blog,会让很多人了解该企业独特的文化.而Google,相信已经做好了用这个Blog好好做广告的打算.

以上索leiz独家报道.

:)