Archive for the ‘Programming’ Category

我们都很菜
Tuesday, September 25th, 2007

昨天在修改以前同事写的JavaScript代码时,看到里面有这样的写法:
location.load(’/foo…’)
以此跳转到新的页面。

当时心想,哟,看别人代码就是有收获,又学到新东西了。于是修改的过程中,我也尝试用这种办法,一方面我可以copy原来的代码,另一方面,这种办法比起window.location.href = ‘/foo…’的写法要好看一些嘛……然而代码跑起来的时候却发现,location对象根本没有这个方法。原来,这位同事是看到location有reload(查一下标准)这个方法来重新载入当前页,就认为载入一个新页面应该有个方法为load,以一个字符串为参数。

记下这件事,并没有丝毫冷嘲热讽的意思。从程序语言设计的角度来说,这种思想是很合理的:为location对象的href属性赋值,应该只引起该对象属性的变化,而不是引发一个动作;而要想使浏览器加载新的页面,应该由一个方法来完成。然而,不论怎么合理,都不能想当然地这样写代码,这已经超出了写代码的范畴了,这是在设计语言。我也不应该看到这样的代码就想当然地认为有这样的方法,至少,google一下就知道它不存在了,万幸的是这个错误被及时地发现了。

还有一件事,在看到有人用system.out.println方法debug代码时,我经常会指出,除非万不得已,尽可能用IDE的Watch之类的功能,打印的函数很有可能被遗忘在代码中而不被删除。我是个比较自以为是的人,也很理解对方不以为然地说,没关系,完了都会删除的。我很不放心地走开,然而事后经常证明我的担心是对的,检查代码时,还可以看见许多的println debugger完好地留在代码中。

总之,虚心是很重要的一个品德,如果实在以下问为耻,可以Google啊,baidu啊。看到这些事情,在为别人惋惜的同时,我也把它们当作镜子,反观自己身上是不是有同样的缺点。对别人宽容,对自己严格,又是更难做到的一件事情。

推荐CSSVista
Thursday, August 23rd, 2007

CSSVista是一个免费软件,用它编辑CSS或inline style时,可以即时地看到在IE和Firefox中的实际效果:

CSSVista

安装它首先需要安装 .NET Framework,但是这是值得的。经常一些时候你在一种浏览器里面调试界面,终于好了,然而拿到另一种浏览器中,啊,一团糟!如果用CSSVista来编辑CSS,哪个改动引起了浏览器不同的render行为,你都可以及时地知道。

它还有一些handy的小功能如语法高亮、自动补全等,绝对值得一试。

CSSVista的主页不如一个开发者的blog文章详细。

在Flash中如何弹出链接
Saturday, July 28th, 2007

在AS2中,一般用getURL函数来打开链接:

getURL(”http://www.qingbo.org/”, “_blank”);

在AS3中,用navigateToURL函数:

navigateToURL(new URLRequest(”http://www.qingbo.org/”), “_blank”);

但它们都回被Firefox的ad blocker阻止并出现一个警告条(甚至是一个随机事件!)。我Google了好久,大部分都没有给出好的办法。

其实Google的第二条结果是blogspot的,因它被封我就懒得打开了。最后不得已用代理上去,发现解决办法就在那里,用ExternalInterface调用Javascript打开新窗口就可以了。简单的就是:

ExternalInterface.call(“window.open”, “http://www.qingbo.org/”, “_blank”, “”);

原文链接(链接加了代理,直接点击可访问):

http://skovalyov.blogspot.com/2007/01/how-to-prevent-pop-up-blocking-in.html

AS3如何fade文本(text)?
Sunday, July 8th, 2007

fade文本的效果在很多时候是需要的,但初试时总不成功。找到的答案是,文本必须是static,或者如果文本是dynamic的话,必须embed字体进去。

在Adobe的这篇文章里,讲到了如何在Flash中潜入字体,末尾还给了一个利用Tween类做Fading的例子,然而文中似乎并没有提到只有潜入了字体才可以做这样的Fading

Flash中如何让一个Label使用手形光标?
Sunday, July 8th, 2007

原来光label.useHandCursor = true;还不够,要加下面两条语句:
label.mouseChildren = false;
label.buttonMode = true;

AS3的Dictionary是个好东西
Sunday, July 8th, 2007

最近在学习Flash的简单东西。为了数据和表现的分离,我把读取数据的代码做成一个类,跟显示数据的控件分开。

在第一帧的AS中,将一个数组的数据用循环显示到控件上,控件也是一个数组。但是,如果要给控件加上事件处理,比如点击,在处理函数中想获得数据,怎么办呢?

最直接的办法是用Array.indexOf()函数取得控件在数组中的下标,然后再取数据数组中的对应下标的元素,不是太好。

本来我是想在控件中找类似“setAttribute/getAttribute”的函数的(Java的HttpServletRequest有get/setAttribute,另外Eclipse JDT的编译器语法结构类都有get/setProperty:) )。后来发现了帮助中在讲Array时提到两种,一种indexed,一种associative,后者就是Dictionary。

你可以写,

var map:Dictionary = new Dictionary();
map[displayObject] = data;

在event handler里,map[e.target]就可以取得对应数据了。嗯,也可以叫做Map

FCKEditor的Packager
Saturday, July 7th, 2007

FCKEditor的js很大,它特意提供了一个packager来压缩。

FCKEditor的下载页提供了最新2.4.3版的下载,包括源代码及压缩过的代码。然而当我改动了JS想重新打包的时候问题来了,从同一下载页下载到的FCKEditor.Packager却不能使用,报错说找不到_packager.xml。搞笑的是那个下载的下面还提示2.4以前版本的Packager请到某某地下载。

最后浏览FCKEditor的Trac站点终于找到了想要的东西,下载地址

把它放在FCKEditor的目录下(和editor和_samples两个目录在同一层)运行即可。

Visual C++ 2005, ArcGIS Engine 9.2, ATL对话框程序
Friday, July 6th, 2007

首先向还在被迫学习或使用MFC、ATL之类代表原始社会生产力的工具的同志们道一声,你们辛苦了!

我郁闷了好长时间才把一个使用ArcGIS Engine的ATL程序弄起来。把详细过程分享出来,避免像我一样不熟悉ATL/COM的人走弯路。ArcGIS可以用C#或Java开发,但有时候你不能自己决定。

准备工作:

  1. Ctrl+Shift+N,New Project
  2. 选择Visual C++下的ATL,在右侧选择ATL Project,在Name栏填写project name,ATLDialog,OK
  3. 在随即出现的ATL Project Wizard里,选择“Application Settings”,Server Type选择Executable,点击Finish
  4. 项目已经生成。在Class View中,右击ATLDialog,Add=>Class
  5. 在Add Class对话框中,选择ATL Dialog,点击Add。接下来的ATL Dialog Wizard中,在Short name中填写TestDialog,点击Finish
  6. 向导已经为我们生成了一个ATL对话框的框架。

试一下吧。在文件ATLDialog.cpp中,找到_tWinMain函数,在前面添加代码:

CTestDialog dlg;
dlg.DoModal();

并且在前面要包含我们对话框的声明:#include “TestDialog.h”
按下F7,编译结束后对话框弹出了,按下OK,程序正常结束。

接下来,我们就可以在此基础上加上ArcGIS的控件了(给地图控件加一个点击事件处理)。

  1. Resource View中,ATLDialog->ATLDialog.rc->Dialog->IDD_TESTDIALOG,打开对话框编辑窗口
  2. 对话框稍微拉大点,右键->Insert ActiveX Control。在弹出的框中选择ESRI MapControl,同样方法加入ESRI LicenseControl
  3. 调整好MapControl的大小位置后,右键->Add Event Handler
  4. 弹出的向导中,选择CTestDialog类,Message Type选择OnMouseUp,点击Add and Edit
  5. 输入代码:

    IMapControl3Ptr ipMapControl;
    GetDlgControl(IDC_MAPCONTROL1, IID_IMapControl3, (void**) &ipMapControl);
    ipMapControl->AboutBox();

  6. 关键时刻来了。IMapControl3Ptr这些接口的定义在哪里呢?不要试图在ArcGIS的VC++ Help for VS2005中找到答案,它会让你郁闷几天的。
    在stdafx.h中找到#include <atlcom.h>这行,把它替换成下面的代码(根据你的ArcGIS安装位置更改):

    #define ISegment IMSSegment
    #include <atlcom.h>
    #include <atlwin.h>
    #undef ISegment

    #include “C:\Program Files\ArcGIS\include\CPPAPI\SDK_Windows.h”

  7. 按下F7,对话框又出现了,并且有淡蓝色背景的地图控件,在上面点右键,ESRI的授权声明就跳出来了。

ArcGIS的文档里,我没有发现有关于如何解决ISegment重复定义的介绍。而且文档中也没有提到SDK_Windows.h这个文件,只说那些控件的定义应该如何去导入,很繁琐,其实包含这个文件就可以了。

好了,有了这个基础,其它的翻翻文档和Sample应该就问题不大了,你可以试试加载一幅地图进来。