最近为Delphi吐血超过一公升

虽然这是一些牢骚,不过和编程还是多少有些关系的,先放这里吧。

    虽不敢称对Delphi有多精通,但自信对Delphi的熟悉程度绝对超过绝大多少的Delphi的开发人员。不过最近实在是吐血,大口大口的吐,血如泉涌。粗略估计绝对吐血量绝对超过一公升。按我的说法,最近真是将数年来未遇的问题都全部给遇了个遍。这些问题搜遍地了互联网,能找到的除了问题还是问题。最的的感觉是,某些和系统结合紧密的东西还是用VC吧,毕竟都是老比家的。    
    那些小吐的就不说了,这里只列举些失血过度的。
    最先遇到的是类似WORD的多窗口程序问题(一个程序的各个窗体都在任务栏上显示一个按钮)。其实这个问题以前也遇到过,而且网上也有不少人遇到。但这问题一只就没有过一个好的解决方案。Delphi做多窗口程序最大的问题就是,不能使用模态窗口,模态窗口很容易跑到主窗口后面,这时候就是死都出不来了,这能动用任务管理器。由于这个问题涉及到Delphi的VCL体系因此很难解决。
    为了这个问题,有将互联网翻了个遍。网上应用的信息实在是太少了。我将能找到的一切方法都试了个遍,甚至连hack Delphi的方法都用过了,依旧是无疾而终。真是整到让人绝望。不过好在问题最终解决了,虽然解决方式不太优雅(应当说是,实在是太uglily了),但至少算是解决了。
    然后IE插件的右键菜单问题。由于Delphi的UI并不是线程安全的,导致IE插件的右键菜单只能在当前窗口弹出,通过URL打开的新IE窗口无法弹出右键菜单。这个还好点,在网上至少还恩能找到解决方案。网上说方案有两个一个是使用API,另外一个使用线程安全的第三方控件easymenu。由于不习惯使用API(而且还不知道用API是否会带来更多的其他问题),于是先找了easymenu测试了下。死得更惨,直接挂掉。API还好,可以正常工作,不过太过繁琐。于是尝试对Delphi的控件进行扩至,可是发现根本就无法实现要求。还好,这个问题最终也算是解决了,使用的方法依旧比较无耻。
    再下面的这个问题我就实在是无能为力了,血流不止。Delphi的IE插件弹出的窗口并没有使用XP的界面风格。如果是应用程序这倒好处理,放个控件就可以,但IE插件就是不行。又是放狗(google)又是划船(baidu)的,找到的都是一些鸡毛蒜皮的东西。还拉了个兄弟帮忙,结果一同被郁闷。真的让人怀疑这世界上是否真的存在这么一样东西。(后记:就在我要吐血身亡的前一秒,终于让我找到解决方案了。EmbeddedWB里面有一个XP风格支持的Demo)
    就这些东西还不算,公司东西出的问题也是让人血流不止。
    公司用Delphi给星空极速做了个插件,看上去好好的,也可以正常的加载。但只要程序的焦点落到这个插件里,等再移开的时候程序就挂死了。即使是最简单的ActiveForm上放一个Edit也挂。用VC写了个简单的测试程序,问题依旧。用spy++,发现按在TabControl出现消息的死循环。去掉TabControl再尝试,发现OK了。本以为将TabControl全部换成TPanel就万事大吉了。那知道测试程序好了,星空急速里还是老样子。这下更惨,以前出现消息循环的地方是在插件里,这下在星空急速里就出现消息循环了,消息根本就没有传递到插件里。死得不明不白的。再次绝望。
    如果你想尝试吐血的滋味,使用Delphi写个Activex的插件吧。保证你爽到极点。

后记:
    星空极速的问题终于也被我给搞定了。给我的感觉是似乎没有什么问题是解决不了的,不过吐血已经吐得够多的了,且如果有时间我似乎应当关注些其他东西了。