2006年06月03日

前几天更换了博客园的blog: http://basilwang.cnblogs.com ,这里不打算更新了。请大家关注我的新家

2006年05月23日

一直以为offsetParent和parentElement是一回事,最近在做web控件才发现原来的理解是大错特错。


parentElement 在msdn的解释是Retrieves the parent object in the object hierarchy.


而offsetParent在msdn的解释是Retrieves a reference to the container object that defines the offsetTop and offsetLeft properties of the object. 这个解释有些模糊。我们再来看看他的remarks



Most of the time the offsetParent property returns the body object.


大多说offsetParent返回body



Note  In Microsoft® Internet Explorer 5, the offsetParent property returns the TABLE object for the TD object; in Microsoft® Internet Explorer 4.0 it returns the TR object. You can use the parentElement property to retrieve the immediate container of the table cell.

 

对于IE 5.0以上,TD的offsetParent返回Table。


但是msdn并没有讨论在页面td元素中存在绝对/相对定位时offsetParent的值。

以下是我个人总结的规律

在td中的元素会把第一个绝对/相对定位的hierarchy parent当作offsetParent,如果没有找到需要分三种情况讨论

  一,如果该元素没有绝对/相对定位,则会把td当作offsetParent

  二,如果该元素绝对/相对定位并且table没有绝对/相对定位,则会把body当作offsetParent


  三,如果该元素绝对/相对定位并且table绝对/相对定位,则会把table当作offsetParent 


看一下示例代码


1.<BODY >
<TABLE BORDER=1 ALIGN=right>
  <TR>
    <TD ID=oCell><div id=”parentdiv” style=”position:relative” >parentdiv<div id=”sondiv”>sondiv</div></div></TD>
  </TR>
</TABLE>


运行结果parentdiv.offsetParent.tagName IS “body”


                sondiv.offsetParent.id     IS ”parentdiv”

2.<BODY >
<TABLE BORDER=1 ALIGN=right>
  <TR>
    <TD ID=oCell><div id=”parentdiv” style=”position:relative” >parentdiv<div id=”sondiv” style=”position:relative”>sondiv</div></div></TD>
  </TR>
</TABLE>


运行结果parentdiv.offsetParent.tagName IS “body”


                sondiv.offsetParent.id     IS ”parentdiv”


3.<BODY >
<TABLE BORDER=1 ALIGN=right>
  <TR>
    <TD ID=oCell><div id=”parentdiv” >parentdiv<div id=”sondiv” style=”position:relative”>sondiv</div></div></TD>
  </TR>
</TABLE>


运行结果parentdiv.offsetParent.tagName IS “TD”

                sondiv.offsetParent.tagName    IS ”body”


4.<BODY >
<TABLE BORDER=1 ALIGN=right>
  <TR>
    <TD ID=oCell><div id=”parentdiv” >parentdiv<div id=”sondiv”>sondiv</div></div></TD>
  </TR>
</TABLE>



运行结果parentdiv.offsetParent.tagName IS “TD”


                sondiv.offsetParent.tagName    IS ”TD”


5.<BODY >
<TABLE BORDER=1 ALIGN=right style=”position:relative”>
  <TR>
    <TD ID=oCell><div id=”parentdiv” style=”position:relative” >parentdiv<div id=”sondiv” style=”position:relative”>sondiv</div></div></TD>
  </TR>
</TABLE>


运行结果parentdiv.offsetParent.tagName IS “Table”

                sondiv.offsetParent.tagName    IS ”parentdiv”


注:relative和absolute结果一致,此处指讨论relative

本篇文章使用aigaogao Blog软件发布, “我的Blog要备份”

2006年05月22日

今天发现一种情况同我在css中的relative和absolute(原创,转载请注明)中的理解不太相同,看代码


1 <SPAN>Span</SPAN>
<DIV style=”POSITION: absolute”>Div</DIV>


2 <SPAN>Span</SPAN>
<DIV>Div </DIV>


3 <DIV>Span</DIV>
<DIV style=”POSITION: absolute”>Div</DIV>


4 <DIV>Span</DIV>
<DIV>Div</DIV>


其中1的结果


2,3,4的结果


不知道为什么?


本篇文章使用aigaogao Blog软件发布, “我的Blog要备份”

一直对relative和absolute的定义不清楚,从网上看到的资料感觉不是


很详细,决定自己写例子。


1 relative


 <script>#div-1 {
 position:relative;
 top:20px;
 left:40px;
 border:1 1 1 1 solid #000000
 }
</script>


 <body>
<div id=”div-1″>ssssssssssssss<BR>sssss<BR>ssss<BR></div>
sdfdffffff
</body>


运行结果



结论:同greengnn在CSS教程——元素定位中关于relative的结论不大相同,他认为接下来的层和div-1是在同一高度出现。从图中我们可以看到,他们并不在同一高度上。我个人认为接下来的层应该是和没有采取特殊定位是一致的。


2 positive


将对象从文档流中拖出,也就是说其后面的元素会忽略该元素来进行定位


3 positive和relative


CSS教程——元素定位一文中,greengnn认为“如果给父元素定义为position:relative;子元素定义为position:absolute,那么子元素的位置将相对于父元素,而不是整个页面”。我认为这句话是不正确的。应该是只要父元素采取了特殊定位relative或者absolute,子元素的位置是按照父元素的起始位置来计算relative或者absolute的。这时候需要注意,父元素中子元素接下来元素的位置(参考对relative的解释)。来看一下示例


<body>
<div  style=”padding:10px;background:#bbC080;”>block</div>
<div id=”outerElement” style=”top:50px;left:60px;padding:0px;background:#ccC080;width:100px;height:80px;position:relative;text-align:left;”>
<span id=”innerElement” style=”top:50px;left:40px;width:80px;height:30px;background:#FFC080;padding:0px;position:relative;”>innerElement</span><div style=”background:#eeC080″;>text</div></div>
<div style=”background:#bbC080;”>outer text</div>
</body>



当父元素relative,子元素absolute



当父元素absolute,子元素relative



当父元素absolute,子元素absolute



对static在此不作讨论,当采用static时,style中left和top定位无效。


 


 


 


 

本篇文章使用aigaogao Blog软件发布, “我的Blog要备份”

2006年05月20日

昨天晚上添加了展现/隐藏菜单的按钮,今天早晨一打开博客,出现Internet Explorer 无法打开 Internet站点已终止操作。开始以为是网络的问题,可是刷新以后问题依旧。在google上搜索有网友采用document.readyState!=”complete”来判断状态,我没有试成功。但是此时问题已经比较明显,在页面没有完全加载的时候就调用了insertAjacementElement。msdn中说到在用AppendChild的时候容易出现该问题,解决办法是采用setTimeout。经过反复的试验,其实主要是单双引号的匹配问题,终于成功。现贴出代码


[img onload ="
window.setTimeout(function(){{var div=document.createElement('span');
document.body.insertAdjacentElement('beforeEnd',div);
var main=document.getElementById('main');
div.style.cssText='position:absolute;display:block;top:44;left:2;width:90;height:20;color:green;background:#D8E4F8;border:2 outset;cursor:hand;';
div.innerText='<<收回菜单';
div.onclick=function()
{
var isHide=(leftmenu.style.display=='none');
leftmenu.style.display=isHide?'block':'none';
div.innerText=isHide?'<<收回菜单':'展开菜单>>';
if(leftmenu.style.display!='block')
{
   main.style.marginLeft=0;
}
else
{
   main.style.marginLeft=180;
}
}
}},3000);" width="0" height="0" style="display:none" src="http://p.blog.csdn.net/images/p_blog_csdn_net/basil/204527/t_empty.gif"]


由于donews的blog不支持直接添加script,好像用

也不行,希望有网友告知。因此参考其他网友的方法,用了img加载script代码,完成了左侧导航兰的隐藏和显示,再次对那位网友表示感谢。


另外,在donews快两年了,第一次这么正式的写blog,也是惭愧。不过由于本人一直不喜欢在线写blog的这种方式,现在借助于好搞搞这款软件,终于可以完成了本人离线blog写作和备份的心愿。我觉得这种方法对于理清学习思路,举一反三都有重要的作用,废话少说,今天就到这里了。晚安!

本篇文章使用aigaogao Blog软件发布, “我的Blog要备份”

2006年05月19日

页面布局更新如下:


    更改了CSS;


    增加了展开/隐藏左侧列表按钮


    申请了计数器


    添加了天气预报


    添加了日历


    增加了滚动简介


 

本篇文章使用aigaogao Blog软件发布, “我的Blog要备份”

2006年04月21日

对于java语法,对于覆盖,如果这样写
   class father
   {
     public void method()
     {
       out.println(“father”);
     }
   }
   public class son extends father
   {
     //这样写表示覆盖
     public void method()
     {
       
     }


   }
   如果子类执行的方法内容和父类执行的方法内容一样,可以在method()内部加super.method();
   如果此时有一个接口interface1
   interface interface1
   {
     void method();
   }
   对于son,有相应的改动
   public class son extends father implements interface1
   {
     如果没有任何方法,也是正确的,因为son继承了method发法相当于实现了interface1中的method抽象方法


   }
而对于c#语法,对于覆写(个人理解与java中的覆盖一个意思),应该这样写
   public class father
   {
     public virtual void method()
     {
       out.println(“father”);
     }
   }
   public class son : father
   {
     //这样写表示覆盖
     public override void method()
     {
        super.method();
     }


   }
   如果此时有接口Ifather
   public interface Ifather
   {
     void method();
   }
   对于son, 有相应的改动
   public class son:father,Ifather
   {
      如果没有任何方法,也是正确的,因为son继承了method发法相当于实现了interface1中的method抽象方法,如果想要覆写,同样需要加override


   }

本篇文章使用aigaogao Blog软件发布, “我的Blog要备份”

2006年03月28日

在AdaptiveServerAnywhere和Oracle之间构造通用函数

辽河油田锦采地质大队 邓先永  

在使用PowerBuilder编制程序时,使用的最多的数据库接口是它自身集成的Adaptive Server Anywhere和大型数据库管理系统Oracle;有时,为了使程序的运行⒁浦哺臃奖悖热绱臃衿鞯氖莨芾矶肆⒓醋降セ氖莨芾矶耸保婕暗接没г诔绦虻腟QL语句中所使用的不同数据库平台上,函数的兼容性问题。

比如在最后的数据汇总时,为了保证计算结果的正确性,就要使用防止空值发生的函数,这个函数在Oracle中是nvl(x,y);用法为:

select name,nvl(age,”年龄未知”) age,nvl(zipcode,”无邮政编码”) zipcode from unknow_personal;

则可能出现的结果为:
name age zipcode
张三 45   无邮政编码
李四  年龄未知   234567
王五  年龄未知 无邮政编码

而在Adaptive Server Anywhere的单机数据库平台上,就要用isnull等函数了,语法为:

select name,isnull(age,”年龄未知”) age,isnull(zipcode,”无邮政编码”) zipcode from unknow_personal;

最后的结果是一样的。

现在问题是当我们所用的数据库要从Oracle移植到单机版的Adaptive Server Anywhere上时,由于某些函数的不通用性,程序就要修改相应的函数调用,重新编译,如果在程序中大量或多处使用这种函数时,就很有可能导致人为的错误,从而使程序的维护工作量加大,我曾在网上发过有相关帮助的帖子,但不太切中要害。经过仔细研究一段时间后,终于在Adaptive Server Anywhere单机平台上实现了Oracle上的函数nvl(),使我的程序应用更加方便,现写下来与大家共享。

另外,本人以前用PB6的时候,在PB6的Database Administrater Painter中曾编写过比较复杂的Stored Procedure,但是由于PB6中在处理和Database直接接口的Script时,对于” ; ”和” ’ ”的使用上较多的不方便之处,因而实现时花费了不少的气力,虽然在PB7中此毛病仍然存在,但在PB7的光盘中集成的Adaptive Server Anywhere 6.0的管理工具却比在PB6中的优秀很多,使用Manager Adaptive Server Anywhere这个工具就能很轻松地对数据库进行操作。

首先,如果大家已经正确安装了PB7.0.1后,就可以通过以下步骤来启动Manager Adaptive Server Anywhere:开始→Sybase→Manager Adaptive Server Anywhere。

启动后出现管理界面,再按如下步骤:选菜单Tools→Connect→Adaptive Server Anywhere,再选择你在系统ODBC中配置好的数据源(PB7.0.1对此处理比较好,把各种数据源都集成到系统的ODBC配置中来进行,比较正规,可能初学者还不太适应吧!),如果有必要,可以在User ID:和Password:处输入连接数据库的用户名和口令,之后按确定,就进行数据库的连接。  

比如我们此次连接ASA 6.0 Sample,当然用户在实际应用中就要连接自己的数据库了,如果连接成功,会在Sybase Central下的Adaptive Server Anywhere下出现asademo的图标了;双击鼠标,打开asademo;再双击asademo(dba),打开其下的Tables,Views,Procedures&Functions
等子项,单击rocedures&Functions
项,在右边窗口中就会出现当前连接的数据库中所支持的过程和函数,在右边窗口中双击Add Function (Template),此时会出现New Function的窗口,窗口中有一个函数的大致框架,但为了实现在Oracle中的nvl()函数,请将New Function窗口中的语句改为如下的形式:  

create function nvl(in x text,in y text)
returns text
begin
declare z text;
if x is null then
set z=y
else
set z=x
end if;
return(z)
end  

为了以上几行Script,本人也试过多次才成功,首先是上面的(in x text,in y text),表示函数有两个输入参数:x,y,而数据类型是text。这个text数据类型真是很有趣,我想就算是Sybase公司很好的创意吧!刚开始时,我用的是real类型,但它处理数值型字段时可以,但在处理字符型的字段时就不灵了,后来又仔细分析了一下Adaptive Server Anywhere所提供的数据类型后,改用text一切才OK!后面的Script,我曾想直接调用Adaptive Server Anywhere的isnull()函数,却没有成功,欢迎广大网友积极参与讨论;至于其它的Script,大家仔细看看Adaptive Server Anywhere的帮助后,应该是可以写出来的。

之后,选择New Function窗口的File→Excute Script执行此语句,就行了,这时回到Manager Adaptive Server Anywhere的管理界面,在Procedures&Functions项中,就会有nvl()函数了,用它即可参与实战。

下来还有一步,本来这一步可有可无,因为在数据库只要有了nvl()的定义后,就可以在PB中直接写带有nvl()的Script,而不会出现语法错误了,但是,为了用户能在PB中直接调用,就算是形成一个完整的应用,建议大家还是坚持完成下面的过程,反正又不太费劲,另外还可以长知识呢。

大家在构建DataWindow的时候,相信已经使用过相应数据库中的函数,特别是在用计算列时,就很有可能用到函数了,现在,我们要把在Adaptive Server Anywhere中实现的类似于Oracle的nvl()函数,让它出现在DataWindow Painter的可以直接选取的函数名中(本来用Oracle连库是有的,但用Adaptive Server Anywhere连库时就会有isnull()函数可选,而没有nvl()可选),经过我们的分析,可以用以下几步来实现:

1.找到Sybase安装目录的\Shared\PowerBuilder下的pbodb70.ini文件,打开它,找到[Adaptive Server Anywhere],可以看到PBFunctions=’ASA_FUNCTIONS’,即Adaptive Server Anywhere数据库所用的函数是从ASA_FUNCTIONS处来获得,只要我们把关于nvl()的声明放到ASA_FUNCTIONS的相应部分,就可以在Adaptive Server Anywhere 数据库中,在PB的开发界面中,直接使用nvl()函数了(由此可见在PB中ini文件的重要性)。

2.在pbodb70.ini文件中找到Functions段的[ASA_FUNCTIONS],在Functions=abs(x)…的合适的地方加入关于nvl()的声明:”nvl(x,y),”(建议加到ifnull(x,y,z),处)即可。存盘退出,之后启动PB,大家就可以看到,即使使用Adaptive Server Anywhere 数据库,也一样可以使用Oracle中的nvl()函数了。

这样有一个比较重大的意义是:实现了这样的函数后,用户的程序就可以在服务器版和单机版间通用了,省去了为服务器版和单机版分别开发不同代码的麻烦;一旦在单机数据库上建立好同服务器相同的库结构,装载相似的数据后,就可以同等使用。
  
以上是本人日常开发的经验所得,错误和不足疏漏之处再所难免,本文旨在抛砖引玉,关于数据库开发工具PowerBuilder的使用,且就本文上述的各个方面,确有许多可以大开论坛,讨论一番的必要,欢迎广大PB,VC开发者与我联系hard_deng@netease.com。
2000年6月9日
另外我还在又造了其它的几个函数:即在sqlanywhere下生成的ceil、add_months和to_char函数:

create function ceil(in x real)
returns integer
begin
declare z integer;
set z=ceiling(x);
return(z)
end

create function add_months(in x date,in y integer)
returns date
begin
declare z date;
set z=months(x,y);
return(z)
end

create function to_char(in x date,in y TEXT)
returns TEXT
begin
declare z TEXT;
declare ii integer;
if y=’yyyymm’ then
set ii=112
end if;
set z=convert(char(8),x,ii);
set z=”left”(z,6);
return(z)
end

本篇文章使用aigaogao Blog软件发布, “我的Blog要备份”

2006年03月27日

一般情况之下Sybase server的网络地址应与所对应的主机IP地址相一致,否则是不能启动的。但如果主机的IP地址改变以后,如何修改Sybase server的网络地址使之能正常工作呢?修改Sybase的interfaces文件即可。interfaces文件是客户端和服务器之间联系的纽带,它列出了每个已知服务器的名称和地址,当使用客户机程序连接到服务器时,程序在interfaces文件中查找该服务器名,然后使用其地址连接到服务器。根据操作系统的不同,interfaces文件通常别命名为interfaces、interfac或sql.ini。interfaces文件的格式如下:


##注解


server_name retry_count retry_delay

service_type network_type network_protocol network_listen_device


\x0002PortIpaddress0000000000000000


其中,server_name:为sql server 或backup server 或open server的名称;retry_count:允许客户在连接失败后重试的次数;retry_delay:重试的时间间隔(秒);service_type:该登记项的服务类型:query,供客户端程序去找SQL SERVER的端口;master,SQL SERVER确定用来监听客户端连接请求的端口(SQL SERVER使用同一个端口来提供这两种服务);network_type:络类型;network_protocol:络规程;network_listen_device:络侦听设备;Port:络端口号(在2049到65535之间,十六进制显示),各SQL SERVER的port号必须不同,且是空闲端口;Ipaddress:SQL SERVER所对应主机的网络地址(十六进制显示)。

本篇文章使用aigaogao Blog软件发布, “我的Blog要备份”

2006年03月18日


症状


在 Visual Studio .NET 集成开发环境内使用从源代码管理打开时,会出现下列错误消息:
无法读取项目文件“<文件名>”。 系统找不到指定的文件。

原因


用户试图通过从源代码管理打开菜单命令打开一个文件,而该文件尚未通过 Visual Studio IDE 添加到源代码管理时,将出现此错误消息。

解决方案


若要解决此错误,请按照下列步骤操作:










1. 将文件从 Visual SourceSafe 数据库复制到本机。
2. 打开 .sln 文件和所有子项目。
3. 文件菜单中,单击源代码管理,然后单击更改源代码管理。 将项目重新绑定到源代码管理 (SCC) 数据库中最初下载该项目的位置。

状态


这种现象是设计使然。

参考


有关如何将一个项目绑定到其 SCC 提供程序的其他信息,请单击下面的文章编号,查看 Microsoft 知识库中的文章:
305106 (http://support.microsoft.com/kb/305106/EN-US/) HOWTO: SSAFE – Reconnect a Project to Source Control in Visual Studio .NET(SSAFE – 在 Visual Studio .NET 中将项目重新连接到源代码管理)

本篇文章使用aigaogao Blog软件发布, “我的Blog要备份”