蒋晟的专栏

http://jiangsheng.net

蒋晟ID:jiangsheng
340061次访问,排名150好友13人,关注者661
男性,美国,武汉,吉林大学校友,数学专业,Vista使用者,MFC程序员,Biztalk程序员,Facebook使用者,C++程序员,CSDN大版主,微软最有价值专家,CSDN社区人物接龙,MSDN中文技术论坛版主,博客堂堂主,维基百科执行编辑,客观唯心主义者,民主党
jiangsheng的文章
原创 93 篇
翻译 0 篇
转载 3 篇
评论 139 篇
蒋晟.Net的公告
我不私下回答问题,有问题请在论坛公开提出,这样后来者可以从讨论中受益
这下要维护4个BLOG了,faint 其他的地址
所有的文章版权归原文作者所有,任何人需要转载文章,必须征得原文作者授权。
找工作中……
最近评论
jiangsheng:RTM是指批量生产的版本
cnhome:好像现在发布的RTM不支持BCG,而且Feature Pack里也没有BCG的支持吧。顺便问一句老蒋同志,RTM是真正的正式版么?!
iyranly:发现老蒋这里的好东西太多了!
iyranly:期待,,程序员生活
tingya:我在CWebBrowser中,有一个样式表L
Body{
background-color: #00ffff;
font-size:12px
}
我现在给定Selector为body,想获取background-color的值怎么获取?IHTMLStyle->GetAttribute是用作这个图用途的吗?我调用了好像返回……
文章分类
收藏
    相册
    Posts
    BLOG
    个人BLOG(博客堂)(RSS)
    板砖横飞之地
    人世间
    微软中文社区
    听香小榭
    知识的泉源
    MVP FAQs
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 关于自动完成功能的一段会话收藏

    新一篇: MFC Feature Pack发布 | 旧一篇: 保存浏览器控件中的网页

    已经是下午三点了。太阳已经不再直射软件开发部的窗户。在窗前的电脑桌边,程序员甲斜靠在他的真皮靠背椅上,瞪着天花板。

    “怎么了?”去饮水机倒水路过程序员甲背后的程序员乙说:“你又卡住了?”

    “是啊!”程序员甲叹了口气,说:“那个该死的自动完成功能问题太多。”他深呼吸了一下,甩甩头说:“再搞不出来我就得和老板谈谈是不是要取消这个功能了。”

    “你设置了TextBox类的AutoCompleteCustomSource和AutoCompleteMode属性?”

    “是啊。”

    “我也是这么做的,没发现什么问题啊?”

    “那是你的数据量小。我的查询返回的数据量大,全部从数据库读出来保存到内存不现实,老板要求只从数据库读匹配当前用户输入的数据。”

    “听起来好像很简单啊?在文本框的TextChange里面用当前文本作为过滤条件查询数据库,用结果填充一个AutoCompleteStringCollection,然后复制给AutoCompleteCustomSource不就好了。”

    “说得轻巧,我这么做的结果是经常得到一个访问违例异常“尝试读取或写入受保护的内存,这通常指示其他内存已损坏”,而且我在TextChange里面设置的try/catch抓不到这个异常。即使不出现异常的时候,我的替换的选项也没有被显示出来。”

    “等我去倒杯水,我一会来看看你的代码。”

    5分钟后,程序员甲和程序员乙并肩坐在电脑桌前。程序员乙抬起来,说:“我看不出这段代码

    public AutoCompleteStringCollection GetFilteredList(string prefixText) {

      AutoCompleteStringCollection AutoCol = new AutoCompleteStringCollection();

      Random random = new Random((int)DateTime.Now.Ticks);

    for (int i = 0; i < 100; i++) {

        char c1 = (char)random.Next(33, 127);

    char c2 = (char)random.Next(33, 127);

    char c3 = (char)random.Next(33, 127);

    AutoCol.Add(prefixText + c1 + c2 + c3);

    }

    return AutoCol;

    }

    private void textBox1_TextChanged(object sender, EventArgs e) {

      //fill autocomplete textbox..

      //SyncRoot-object is not locked at all, so it looks like that is not important

      lock (textBox1.AutoCompleteCustomSource.SyncRoot) {

        textBox1.AutoCompleteCustomSource = GetFilteredList(textBox1.Text);

    }

    }

    有什么问题。异常是在哪一行抛出来的?让我看看”

    在设置了在抛出异常时中断之后,程序员乙启动了Visual Studio调试器。在几次测试之后,调试器停了下来,报告了一个访问违例错误。

    程序员乙马上打开了调用堆栈窗口,看了看调用历史,说:“记录报告异常是在Application.Run这里抛出的?嗯……抛出异常的好像是Windows内核?”

    程序员甲说:“我原先假定Windows是在另一个线程来读AutoCompleteCustomSource,但是我锁定AutoCompleteCustomSource的SyncRoot没有效果。我又没有办法改Windows的源代码,这条路好像行不通。”

    程序员乙侧头想了想,说:“不替换AutoCompleteCustomSource,直接用Clear和AddRange修改AutoCompleteCustomSource的内容行不行?”

    “好主意,说不定在Windows访问AutoCompleteCustomSource的时候不能替换这个对象”。

    十五分钟之后,程序员乙抬起头,说:“嗯,Windows的源代码不能动,那么我们就只好试图创造条件绕过抛出异常的这段代码了。我想这个访问越界违例是一个BUG?”

    程序员甲摇着头,说:“MSDN文档没有说动态替换AutoCompleteCustomSource是被支持的,也没有说不支持。”

    程序员乙说:“用Refactor看看吧,要是这个功能是.Net基础类库的问题的话,你看看是不是可以绕过它自己实现同样的功能。我记得Internet Explorer里面就有这个功能,我们应该可以用Internet Explorer的接口。嗯——让我搜索一下——这里有一篇文章,说怎么用IAutoComplete接口实现自动完成功能的。”

    十五分钟之后,程序员甲靠在他的椅子背上说:“从Refactor分析来看,TextBox也是用的同一个接口。只不过AutoCompleteCustomSource实现了IEnumString而已。等等,是不是不能替换IEnumString的实现呢?看起来我需要自己实现IEnumString了。我恨p-invoke……”

    程序员乙打断了他的话:“干活吧,没试过你怎么知道行不行。”

    程序员甲开始敲键盘。程序员乙一口喝干了被子里面的水,起身倒了杯水回自己的座位上去了。

    两个小时之后程序员甲冲到程序员乙的座位旁边,兴高采烈地说:“嘿,我的程序现在没抛异常了!”

    程序员乙回应:“哦,等我敲完这段代码——你的IP是多少?登录到你的机器,我们来看看你怎么写的。”

    在程序员甲用远程桌面控制他的机器之后,程序员乙开始扫描程序员甲的代码。

    十分钟后,程序员乙开口说:“看起来你从替换IEnumString的实现改成了实现替换IEnumString替换它的数据源?”

    程序员甲说:“就是这样。但是在用户打字的时候动态改变数据源的内容似乎没有用。IEnumString::Next根本没有被调用。看起来Windows在输入第一个字母的时候缓存了提示列表的内容。”

    未完待续……

     

    发表于 @ 2007年10月01日 10:15:00|评论(loading...)|编辑

    新一篇: MFC Feature Pack发布 | 旧一篇: 保存浏览器控件中的网页

    评论

    #NewVC1978 发表于2007-10-02 06:23:51  IP: 222.70.204.*
    老蒋也搞连载,土人一个,呵呵

    不要生气哦,太知道你也是一只非常非常鸟的菜鸟了。。。
    #orichisonic 发表于2007-10-02 10:51:40  IP: 222.92.195.*
    不错,不错,我的msn是orichisonic@Hotmail.com
    #cncoc 发表于2007-10-03 08:55:45  IP: 222.131.194.*
    不错
    #efdev 发表于2007-10-05 02:43:54  IP: 60.21.104.*
    看不懂哦......用的编程语言是C#?还是EF?
    #freasy 发表于2007-10-05 19:17:24  IP: 222.240.167.*
    既然是使用的上层的类库,为什么那两个程序员总是在说windows的机制呢?这个跟windows有什么关系,基于的操作系统而已。
    #lqscoke 发表于2007-10-08 00:19:52  IP: 59.56.249.*
    同上
    #amingo 发表于2007-10-08 02:13:14  IP: 220.249.98.*
    QQ 31767702
    #norsd 发表于2007-10-18 07:27:55  IP: 58.35.91.*
    高低结合会死的很难看的.
    #iyranly 发表于2008-01-23 04:02:47  IP: 124.77.131.*
    期待,,程序员生活
    #iyranly 发表于2008-01-23 04:03:12  IP: 124.77.131.*
    发现老蒋这里的好东西太多了!
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 蒋晟.Net