posts - 7, comments - 14, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2008年7月1日

Firefox可以使用Firebug来调试js,后来发现使用VS更方便,关键有些只能支持IE的系统。。。恐怕只能:P

无意间想到的,既然VS可以拦截js错误来进行调试,应该也能通过自由设置断点的方式。

首先要将IE的Debug JS选项打开。Internet选项->高级->禁用脚本调试 把它后面的队勾去掉。

接着打开VS,2003或者2005都行,附加(Attach)要调试的IE的进程即可。注意要选择Script类型的调试

然后选择VS中的工具栏-->调试-->窗口-->运行文档。之后就会打开当前HTML页面的所以文档,找到要设置断点的位置即可。

然后运行页面即可,通过Vs可以方便的查看各个对象的值和状态,快速定位问题!

 

posted @ 2008-07-01 22:47 暴风雪 阅读(359) | 评论 (0)编辑

2008年6月17日

苦思冥想快2天的SplitContainer的Click事件控制SplitterDistance的问题,终于让我查出是什么问题!哈哈哈!

这个按说可以说是个微软的bug了,或者说是设计的时候没有考虑太多。有些东西他们设计也不是很精致亚,嘿嘿。

看张图可能你就明白了。

当鼠标按下的时候,splitContainer会响应自己的MouseDown事件,在这个事件里,他会生成一个新的层从而盖住了下面真正的Splitter。从而会影响到Click时间的执行情况,具体是啥情况就说不清楚了,我猜是:本来Click能好好的执行,可偏偏半路杀出一个MouseDown,这个MouseDown新产生的阴影层挡住了MouseUp的执行(不能算是一次Click操作)。从而使得界面闪了一下就又恢复原状了。

后来的实验也能证实,分别在MouseDown、MouseUp、MouseClick中实验。只有MouseDown可以完全正常执行。

解决方法:
其中一些思路来自于CollapsibleSplitter from codeproject
在Spliter中间画出一部分,点击这部分的时候进行快速切换操作,而点击其它部分的时候,就是控件默认调整

新建class继承自SplitContainer,然后覆盖OnPaint方法

    protected override void OnPaint(PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Rectangle r = this.SplitterRectangle;
            g.FillRectangle(new SolidBrush(Color.Aqua), r);
            if (Orientation == Orientation.Vertical)
            {
                rr = new Rectangle(r.X, (int)r.Y + ((r.Height - 115) / 2), 8, 115);
                this.SplitterWidth = 8;
  g.FillRectangle(new SolidBrush(hotColor), new Rectangle(rr.X + 1, rr.Y, 6, 115));                
                g.DrawLine(new Pen(SystemColors.ControlDark, 1), rr.X + 1, rr.Y, rr.X + rr.Width - 2, rr.Y);
                g.DrawLine(new Pen(SystemColors.ControlDark, 1), rr.X + 1, rr.Y + rr.Height, rr.X + rr.Width - 2, rr.Y + rr.Height);

                if (this.Enabled)
                {
                    // draw the arrows for our control image
                    // the ArrowPointArray is a point array that defines an arrow shaped polygon
                    g.FillPolygon(new SolidBrush(SystemColors.ControlDarkDark), ArrowPointArray(rr.X + 2, rr.Y + 3));
                    g.FillPolygon(new SolidBrush(SystemColors.ControlDarkDark), ArrowPointArray(rr.X + 2, rr.Y + rr.Height - 9));
                }

            }

     //do not Dispose,is it Ok???
            //g.Dispose();
        }

 

然后在MouseMove中进行判断当前鼠标是否在所画的区域即可,然后分别调用不同的事件处理。

private void OnMouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            // check to see if the mouse cursor position is within the bounds of our control
            System.Console.WriteLine(e.X.ToString() + " " + e.Y.ToString());
            if (e.X >= rr.X && e.X <= rr.X + rr.Width && e.Y >= rr.Y && e.Y <= rr.Y + rr.Height)
            {
                if (!this.hot)
                {
                    this.hot = true;
                    this.Cursor = Cursors.Hand;
                    this.Invalidate();
                }

            }

            else
            {
                if (this.hot)
                {
                    this.hot = false;
                    this.Invalidate(); ;
                }


                this.Cursor = Cursors.Default;

                if (controlToHide != null)
                {
                    if (!controlToHide.Visible)
                        this.Cursor = Cursors.Default;
                    else // Changed in v1.2 to support Horizontal Splitters
                    {
                        if (this.Orientation == Orientation.Vertical)
                        {
                            this.Cursor = Cursors.VSplit;
                        }

                        else
                        {
                            this.Cursor = Cursors.HSplit;
                        }

                    }

                }

            }

        }

 

另外还要覆盖MouseDown事件。如果MouseDown的时候是在所画的区域则不调用base的MouseDown

protected override void OnMouseDown(MouseEventArgs e)
        {
            if (!this.hot)
                base.OnMouseDown(e);
        }

posted @ 2008-06-17 21:39 暴风雪 阅读(201) | 评论 (0)编辑

2008年4月29日

现实与理想总是有差距,当初我认为这么一个企业是完全有实力建立自己的工程体系和方法的,实际上还完全处于吹牛阶段(CMMI3)。

而事实上不仅仅要有实力还要有能力。每个项目都做的乱糟糟的!作坊式的生产工艺。也许部门也不想这样,因为上面的更大的领导也许根本不关心,只要能干活儿就行了!所有的人都在强调,很多客观因素是无法改变的。没人有试图改变什么,大家都在改变自己,无论是心态还是方法等等。领导的意思很明了,别哀求什么时间不够用,你们还年轻,很有冲劲,潜力很大,做好主力,当好MT,抗住!

软件开发,是个脑力活儿。有时候重复性工作也比较多,所以程序员也有IT民工的称号。并不是所有的代码都可以重用,coding的同时也留下了思维的痕迹,拷贝-粘贴之余,也要思考一番这个东西怎么做,做成啥?所以人在软件开发当中是非常之重要的因素。我讨厌别人把程序员当成纯粹的code maker来用。人不机器,机器也写不出代码(虽然可以替代一部分吧)。

工程是需要计划、组织、人员、管理等等要素的。

在软件开发当中,其实有一点很重要,就是能够比较准确合理的评估出工程所需要的时间。一个正常的项目,起码要根据工作量和团队的水平,给一个合理的估算。但一个问题是,怎么才能估算准啊?国外好像有人发明了几种数学模型,可以用。但我讨厌用数学。。。呃。不爱计算。如果估算的话,最好是让承担任务的程序员来估算,而且不要给他压力,这样应该能够得到一个比较合理的值。但前提是,要先大概分析下要开发的东西需要修改或者新增的东西,然后和以往的工作进行一下类比。最好的情况是,能够在项目进行中,如果发现了偏差可以进行修正。这个因为有些项目是难以修改DeadLine的,所以可以会有些不切实际。

在建筑领域,交付时间是由甲方来定的,软件也是一样,一般都是甲方定好的。相对于建筑,软件的不确定因素太多,且大多时候甲方都是急功近利,从而导致了很多不爽的事情。建筑方面,由于受限于资金流等因素,所以甲方有可能会把交付时间订的比较长,而施工单位也可以通过简单的增加人员的方式来提交工程速度。而做软件一般需求都比较紧迫,项目中也很难通过简单的增加程序员来提高开发速度。另外对于估算工期,建筑方面也很好估算,主体结果的施工,最快7天左右一层,这个要受限于混凝土的凝固速度。而做软件就没这么早的福气了,更多的团队都是期盼,计划能够偏差不大就ok了,实在不行,只能通过加班来处理。

据说印度的软件公司,很强大,工作量可以细化到比较小的粒度,这样可以相当准确的估算出时间。从而减少了加班的出现。

所以,估算工作量,指定交付时间,怎么也要在需求分析之后。否则,就是胡诌了。

关于加班,除了给自己打工的,恐怕没人愿意加班。没有补偿的加班更会打击团队的士气与信心。出现了加班也就意味着出现了偏差,所有人都想努力挽回,可如果偏差太大,再也无法挽回……

不写了,累了。

p.s.  nnd,每个项目都要靠无休止的加班来完成,哪个X订的计划。

posted @ 2008-04-29 22:52 暴风雪 阅读(27) | 评论 (0)编辑

2008年3月20日

昨天在项目突然发现个IE6的bug。

以前也没注意。

有个同事在css文件里面加了好多注释,还是中文的。

结果导致一些奇怪的现象,页面显示出的不是期望的结果。

一开始我看到那么多注释也感到奇怪,因为没见过那么多注释的css文件。后来没想到删除了注释就ok了。

在网上查了查,好像和编码有关系。最好还是写英文注释吧:P

posted @ 2008-03-20 22:30 暴风雪 阅读(278) | 评论 (0)编辑

2007年12月27日

     摘要: 2007年,我走出了朝夕为伴的校园,迈入了社会。  阅读全文

posted @ 2007-12-27 23:51 暴风雪 阅读(1658) | 评论 (13)编辑

2007年12月22日

     摘要: 对于HTML中的Id和Name。  阅读全文

posted @ 2007-12-22 09:50 暴风雪 阅读(1276) | 评论 (1)编辑

2007年4月26日

测试第一帖子测试第一帖子测试第一帖子测试第一帖子

posted @ 2007-04-26 22:05 暴风雪 阅读(22) | 评论 (0)编辑