分类 开发语言 下的文章

悲剧的Delphi-续

之前因为Delphi的编译器维护人员离职了,写过“悲剧的Delphi”,今天看到Delphi XE3的一些消息,真是为Delphi感到悲哀。

首先看到的是因为一个老项目维护更新,使用了Delphi XE,就检查一下IDE Fix Pack ,看有没更新。这的确是让Delphi的开发人员很郁闷的一件事,不知多少个Delphi版本了,Delphi IDE总是有这样那样的小问题,在上报官方不修复后,DDevExtensions的开发者 Andy 就开发了这个IDE Fix Pack,把大家在使用Delphi IDE过程中遇到的一些问题以第三方方式进行修复,使用了之后IDE的问题更少,IDE也更流畅。在更新了IDE Fix Pack后,随便看到了关于XE3的一个抱怨:

XE3–updated copy protection or how to slow down the IDE start

原来新的Delphi XE3更新了防盗版的保护机制,在启动时,会加载所有bin目录下的库文件进行签名检查,这导致IDE启动变得奇慢无比。甚至在SSD启动都感觉很慢。更是说Andy想尽办法搞了IDE Fix Pack来提高IDE的速度,结果官方却是想尽了办法让IDE更慢。

不过从Andy的博客上还是看到一条好消息:

Patches from IDE Fix Pack that were applied to XE3

官方终于在Delphi XE3里把IDE Fix Pack的修复内容都正式采纳了。

- 阅读剩余部分 -

Virtual Treeview使用要点

Virtual Treeview是一套Delphi下优秀的VCL控件,代码质量高,使用灵活、功能强大、性能非常好,可以用于表达Treeview和表格类数据。它的代码现在托管在google code上。

这套控件使用了很久了,非常满意其表现,之前一直使用V4版,现在V5正式发布了,新版花了几年时间进行重构, 代码结构更加合理,去除了老版大量的小缺陷,很多功能进行了重新设计,参与维护的人也更多了。

Virtual Treeview的设计思路与官方的Treeview完全不一样,VT是基于高性能和更丰富的表现而开发的,在上手方面比Treeview要慢一些,但一旦上手,就会发现非常好用。

在使用VT之前,就应该设计好以什么方式展示数据,每个节点应该有些什么属性。在构思好后,就可以按以下步骤来实现VT的使用了。

1、节点数据

在实际使用Virtual Treeview之前,应该先设计好一个节点数据的结构体,用于方便每个节点的展示。

比如一个典型的设计如下:

  PTreeData = ^TTreeData;
  TTreeData = record
    Level: integer;     // 节点级别:0根;1节点;2参数
    NodeType: integer;  // 节点类型
    Id: Integer;        // 数据id
    Caption: String;    // 节点标题
    obj : TObject;      // 节点对应的对象或空
  end;

其中Caption用于控制节点显示,Id用于方便节点对应数据的快速定位,obj用于把节点与相关的对象关联在一起,其它数据也是用于方便进行数据处理的。

2、列的处理

一般情况下,如果是只当成普通Treeview,无需考虑列(Column)的处理,直接使用即可。如果一行有多列数据需要显示,则得先在属性Header-Columns中增加所需的列,并设置合适的列宽。缺省列(Column)设置为空,列索引(TColumnIndex)应该为-1,在设置了列后,第一列的列索引为0,第二列的列索引为1。

- 阅读剩余部分 -

delphi里动态创建AlphaControls实现换肤

AlphaControls是一套Delphi下的优秀的皮肤vcl控件。几年前,一般用得比较多的是vclskin,使用很方便,可惜这套2010年已经停止维护了。后来就看到更多的人开始推崇AlphaControls,即能让别家的控件激活皮肤效果,也可以只使用AlphaControls的控件。

为了方便自动编译、避免异地安装控件的麻烦和日后维护的方便,我们一般是把这个控件选定版本的源码放在项目源码中,通过动态创建的方式来使用这套vcl控件。

比如在delphi项目的源码目录src中,增加一个third目录存放第三方vcl控件,把AlphaControls的源码放到 src/third/ac目录下。在delphi项目的搜索路径中增加./third/ac,即可。

动态创建的代码:

skin := TsSkinManager.Create(self);  //创建皮肤管理器对象
skin.SkinDirectory := extractfilepath(application.ExeName)+'skins\';  //设置皮肤文件目录
skin.SkinName := skinfilename;  //指定皮肤
skin.ExtendedBorders := true;
skin.IsDefault := true;
skin.SkinnedPopups := true;
skin.SkinningRules :=[srStdForms, srStdDialogs, srThirdParty];  // 皮肤使用规则
skin.Active := true;  // 激活皮肤

好了,运行后发现空白窗体的皮肤效果已经出来了。但增加了TMemo等控件后,发现这些控件并没有被影响,还是原生界面。因为缺省除AlphaControls提供的同类控件外,其它的控件都属于第三方控件,得单独处理才能有皮肤效果。

- 阅读剩余部分 -

PyGTK在Windows下的状态

Reddit上看到有人在问PyGTK现在pygtk在windows下可用么

pygtk现在在Windows下还是可用的,但只支持gtk2.x和python2.6+,还没有正式支持gtk3.x及python3.x。就pygtk的各类库一体打包版来说,基本上还是稳定的,虽然还有一些小问题,但不影响使用。GTK+在Windows下中文的设置可以查看之前写的“Windows下GTK中文显示问题

GTK+现在在Windows下最麻烦的就是各个库的配合问题,一些小问题都是因为各个库的兼容问题导致,最典型的就是libcairo和gdk的问题,比如:

GtkWarning: gdkdrawable-win32.c:2013 drawable is not a pixmap or window

这就是cairo库版本更新后出现的非严重问题,出现这种问题一般就只能提高日志中信息记录的等级,这种警告信息不再记录,不然,每次都会出现这种警告信息很烦人。

gtk+在windows下的gtk+3可以说基本上还属于玩票性质。官方缺少windows版的维护人员,所以一直到3.4版正式发布后,windows版都没法出来。只有一些志愿者公开了一些自己编译的版本。

http://optionexplicit.be/projects/gnome-windows/GTK+3/gtk+/git有一份非正式的最新编译版本,是针对python2.7编译的,有兴趣的可以试一下。

在邮件列表上,Dieter Verfaillie给出了这个gtk+3 在windows下使用的一些说明:

- 阅读剩余部分 -

悲剧的Delphi

今天看到Delphi编译器的维护人员BARRY KELLY的一条博文,称放弃Delphi编译器的开发工作并从Embarcadero辞职:

消息来源:http://blog.barrkel.com/2012/09/moving-on.html

Moving On

An update: I've left Embarcadero Technologies.

There's a lot of reasons. I was in the same position for more than six
years, but I didn't necessarily want to be pigeonholed as a compiler
guy. I was working remotely from London, with all the downsides that
remote working entails: relative lack of camaraderie, out of sight /
out of mind, disconnection from the actually quite vibrant local tech
scene (I live about 3 miles from Old Street roundabout). But more than
anything else, I'd fallen out of love with Delphi, and could no longer
motivate myself to try and make it better - the gap I'd try to bridge
would be a gap too far for the market to bear.

I'm currently taking stock, thinking about what I want to do next. No
specific plans, but it's going to be fairly different than what went
before!

Danny Thorpe走后,BARRY KELLY就接过了Delphi编译器的维护工作。后继版本的Delphi中,类似新RTTI、泛型、匿名方法等新语法特性都是他加进去的。

没想到作为Delphi 编译器架构师,竟然在这样的状态下工作了6年之久,难怪他厌倦了,从热爱Delphi并充满激情到一点也不喜欢这份工作及Delphi,BARRY KELLY坚持了6年。

作为一个曾经很伟大的开发工具,Delphi其实已经在慢慢地走向没落。

我在想如果Embarcadero在接手Delphi后,尝试走开源路线,增强与Freepascal的联系和支持,增强与llvm的联系和支持,改变盈利方式,尝试开源这个IDE,或者开源老版本的IDE,恐怕6年后的今天,Delphi这个开发工具的用户会更多,也会更成熟稳定。缺少用户和维护人员,又如何能开发出好的产品呢,每年的新版,都不断被老用户骂,一个新版,不发上3个update,总是bug不断,新的功能也总是差强人意。

现在还能招到喜欢愿意维护Delphi编译器的成熟开发人员么,恐怕很难了。

[python]Python代码里中文处理纪要

之前在“在Sublime Text2中运行pyside或pyqt的代码窗口出不来的问题”中,写了个小例子,用的是英文的"Hello World",我们把这改成中文的,即:

#!d:/python26/python
# -*- coding: utf-8 -*-
# Import PySide classes
import sys
from PySide.QtCore import *
from PySide.QtGui import *


# Create a Qt application
app = QApplication(sys.argv)

# Create a Label and show it
label = QLabel("你好,世界!")
label.show()
# Enter Qt application main loop
app.exec_()
sys.exit()

按Ctrl-B,运行,结果:

你好,世界!

是的,乱码了。

这是因为输出时把utf-8的编码当成两字节的unicode处理了。

所以,我们得这样,将

label = QLabel("你好,世界!")

改为:

label = QLabel(u"你好,世界!")

这样就能正常处理了。

你好,世界