Archives for: August 2006

Delphi中重载Create,Destroy方法
Category: delphi

例:
声明:在TModifyTaskForm类中
public
constructor Create(AOwner: TComponent; AUserId: Integer); reintroduce; overload;
destructor Destroy; reintroduce;
实现:
constructor TModifyTaskForm.Create(AOwner: TComponent; AUserId: Integer);
begin
inherited Create(AOwner);
处理重载内容;
end;
destructor TModifyTaskForm.Destroy;
begin
inherited Destroy;
处理重载内容;
end;

32 Words • 115 views • 06-08-31 • 12:25:00• 高 玉昆 Email Permalink
部分delphi文件操作函数
Category: delphi

1、返回文件扩展名
function ExtractFileExt(const FileName: string): string;
2、返回文件名
function ExtractFileName(const FileName: string): string;
返回应用程序的文件名
function ExtractFileName(ParamStr(0)): string;
返回应用程序的路径
function ExtractFilePath(ParamStr(0)): string;
3、检测文件是否存在
function FileExists: Boolean;
4、查找目录中是否存在某一文件
function FileSearch(const Name, DirList: string): string;
5、返回路径名
function ExpandFileName(const FileName: string): string;
6、返回文件大小
function FileSize(var F): Integer;
7、返回上上一次I/O操作的状态
function IOResult: Integer;
8、返回文件属性
function FileGetAttr(const FileName: string): Integer;
9、设置文件属性
function FileSetAttr(const FileName: string; Attr: Integer): Integer;
10、设置文件的DOS日期戳
On Windows:
function FileSetDate(Handle: Integer; Age: Integer): Integer; overload;

Cross-platform:
function FileSetDate(const FileName: string; Age: Integer): Integer; overload;
11、返回文件的DOS日期戳
function FileGetDate(Handle: Integer): Integer;
12、把Delphi日期格式转化为DOS日期格式
function DateTimeToFileDate(DateTime: TDateTime): Integer;
13、把DOS日期格式转化为Delphi日期格式
function FileDateToDateTime(FileDate: Integer): TDateTime;
14、 修改文件扩展名
function ChangeFileExt(const FileName, Extension: string): string;
15、删除文件
function DeleteFile(const FileName: string): Boolean; (SysUtils)
16、打开文件
function FileOpen(const FileName: string; Mode: LongWord): Integer;(SysUtils)返回为文件句柄
打开模式:fmOpenRead fmOpenWrite fmOpenReadWrite fmShareCompat fmShareExclusive fmShareDenyWrite fmShareDenyRead fmShareDenyNone
17、把光标定位到某一点
function FileSeek(Handle, Offset, Origin: Integer): Integer; overload;
function FileSeek(Handle: Integer; const Offset: Int64; Origin: Integer): Int64; overload;

Offset为偏移量

Origin为开始模式
Origin Action

0 The file pointer is positioned Offset bytes from the beginning of the file.
1 The file pointer is positioned Offset bytes from its current position.
2 The file pointer is positioned Offset bytes from the end of the file.

18、把文件读到缓冲区
function FileRead(Handle: Integer; var Buffer; Count: Integer): Integer;
19、关闭文件
procedure FileClose(Handle: Integer);

205 Words • 177 views • 06-08-11 • 10:08:18• 高 玉昆 Email Permalink
第一次使用此blog
Category: 随笔

老大早就给我这个blog地址了,但一直没有使用,从今天开始我就要天天写了,哈哈!

1 Words • 116 views • 06-08-10 • 21:45:44• 高 玉昆 Email Permalink
设置选择网格整条记录的属性 TcxGrid
Category: delphi

当点击TcxGrid网格的时候,焦点设置在整条记录上,而不是字段上。 解决方法:点击TcxGrid网格上的cxGrid1DBTableView1,找到属性OptionsSelection里的CellSelect,把属性 CellSelect设置为False;
大功告成,呵呵,其实就这么简单。

8 Words • 196 views • 06-08-25 • 19:14:43• 高 玉昆 Email Permalink
网线的排列方法
Category: 常识

双绞线是局域网中连接网络设备常用的元件,它由双绞线和RJ45头组成,由于制作不当会影响网络的连通。下面简单介绍双绞线的与制作方法。
双绞线按连接的方式一般分为直通线和交叉线。
直通线:是用于连接网络中计算机与集线器(或交换机)的双绞线。它又分为一一对应接法和100M接法。一一对应 接法,即双绞线的两头连线要一一对应,这一头的一脚,一定要连着另一头的一脚,虽无顺序要求,但要一致。100M接法,是指它能满足100M带宽的通讯速率。它的接法虽然也是一一对应,但每一脚的颜色是固定的,具体排列顺序为:白 橙/橙/白绿/蓝/白蓝/绿/白棕/棕 。
交叉线:是用于连接网络中相同类型设备的双绞线,如:计算机与计算机之间,或交换机的级连等.
下面就介绍双绞线的制作方法,具体步骤如下:
步骤 1: 利用斜口钳剪下所需要的双绞线长度,至少 0.6米,最多不超过 100米。然后再利用双绞线剥线器(实际用什么 剪都可以)将双绞线的外皮除去2-3厘米。
步骤2: 剥线完成后,此时可看到四对共8条线,它们双双扭在一起,这四对线是:白橙/橙、白蓝/蓝、白绿/绿、白棕/棕 。然后小心地剥开每一对线,因为我们是遵循EIA/TIA 568B的标准来制作接头,所以对线的颜色是有一定排列顺序要求的。如果制作的是100M直通线,两端则按下面顺序排列:白橙/橙/白绿/蓝/白蓝/绿/白棕/棕。如果制作的是交叉线,则按以下顺序排列: 一 端: 白橙/橙/白绿/蓝/白蓝/绿/白棕/棕 另一端: 白绿/绿/白橙/蓝/白蓝/橙/白棕/棕
步骤3:将排好顺序的8条线捋直,用压线钳将多余的线切除,只剩下约14mm的长度,之所以留下这个长度是为了符 合EIA/TIA的标准,注意切口部分要整齐。
步骤4:将RJ45头有接触铜片的一面朝上,把切好的8条线按已排列的顺序插入RJ45头的线槽内,在确定双绞线的每根线 都已正确插放好之后,就可以用RJ-45压线钳用力将RJ45头压实。
重复以上步骤,做好相应的另一端,这样一条双绞线便作好了。此时,您可以把原来正常接入、运行畅通的网线拔下来, 换上您制作的双绞线,试着看是否能继续浏览网页;或在DOS命令下运行PING命令,看是否能连通。

17 Words • 613 views • 06-08-14 • 10:10:39• 高 玉昆 Email Permalink
TTreeView的OnChange事件的触发
Category: delphi

OnChange事件一般是在焦点变化时触发。不需要调用或调用的时候不能想调函数那样传参数。

1 Words • 263 views • 06-08-28 • 20:11:54• 高 玉昆 Email Permalink
过滤内存表 Filter
Category: delphi

当使用一个内存表,需要查询一部分记录的时候可使用Filter属性:
例如:
FPrivilegeMemoryTableKBM为内存表名称,business_type_id 为内存表字段

//过滤
FPrivilegeMemoryTableKBM.Filtered := False; FPrivilegeMemoryTableKBM.Filter := 'business_type_id = ' + Inttostr(Integer(FFocus.Data));
FPrivilegeMemoryTableKBM.Filtered := True;

//使用该内存表
ShowAllPrivilege(FPrivilegeMemoryTableKBM);

还原
FPrivilegeMemoryTableKBM.Filtered := False;
FPrivilegeMemoryTableKBM.Filter := '';
FPrivilegeMemoryTableKBM.Filtered := True;

30 Words • 186 views • 06-08-23 • 16:44:59• 高 玉昆 Email Permalink
判断网格是否有重复记录解决办法
Category: delphi

在前一文章的解决办法中的第一种的改进方案:
定义一个保存记录移动位置的变量VIndex,当每一条和其他的记录比较完后,把变量加1(VIndex := VIndex+1),把记录焦点定位到第一条,然后向后移动VIndex个单位,取的记录再进行下一次比较。

4 Words • 154 views • 06-08-14 • 13:10:11• 高 玉昆 Email Permalink
拨开SOA的面纱
Category: 软件设计

【导读】最近半年以来,在企业级应用开发领域,谈论最多的一个词,恐怕非SOA(Service-Oriented Architecture,面向服务架构)莫属。那么SOA究竟拥有什么样的魔力,能够让众多的软件厂商对他趋之若骛,掀起新的一轮企业架构浪潮。让我们在本文中一探SOA的究竟。

什么是SOA?

SOA是一种架构模型,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署、组合和使用。服务层是SOA的基础,可以直接被应用调用,从而有效控制系统中与软件代理交互的人为依赖性。

SOA的关键是“服务”的概念,W3C将服务定义为:“服务提供者完成一组工作,为服务使用者交付所需的最终结果。最终结果通常会使使用者的状态发生变化,但也可能使提供者的状态改变,或者双方都产生变化”。

Service-architecture.com将SOA定义为:“本质上是服务的集合。服务间彼此通信,这种通信可能是简单的数据传送,也可能是两个或更多的服务协调进行某些活动。服务间需要某些方法进行连接。所谓服务就是精确定义、封装完善、独立于其他服务所处环境和状态的函数。”

Looselycoupled.com将SOA定义为:“按需连接资源的系统。在SOA中,资源被作为可通过标准方式访问的独立服务,提供给网络中的其他成员。与传统的系统结构相比,SOA规定了资源间更为灵活的松散耦合关系。”

Gartner则将SOA描述为:“客户端/服务器的软件设计方法,一项应用由软件服务和软件服务使用者组成……SOA与大多数通用的客户端/服务器模型的不同之处,在于它着重强调软件组件的松散耦合,并使用独立的标准接口。”

Gartner相信BPM和SOA的结合对所有类型的应用集成都大有助益??“SOA极大的得益于BPM技术和方法论,但是SOA面临的真正问题是确立正确的企业意识,即:强化战略化的SOA计划(针对供应和使用)并鼓励重用。”

虽然不同厂商或个人对SOA有着不同的理解,但是我们仍然可以从上述的定义中看到SOA的几个关键特性:一种粗粒度、松耦合服务架构,服务之间通过简单、精确定义接口进行通讯,不涉及底层编程接口和通讯模型。

需着重注意的是,SOA并不是新生事物??大型IT组织成功构建和部署SOA应用已有多年的历史??这要比现有的XML和Web服务长很多。IBM CICS和BEA TUXEDO就是过去被用于构建SOA应用的两种技术范例。

重点说明的是SOA并不是一种现成的技术,而是一种架构和组织IT基础结构及业务功能的方法。SOA是一种在计算环境中设计、开发、部署和管理离散逻辑单元(服务)的模型。这一定义阐明了SOA的范围。

SOA要求开发人员将应用设计为服务的集合。SOA要求开发人员跳出应用本身进行思考,考虑现有服务的重用,或思索他们的服务如何能够被其他项目重用。“单独的”、“独立的”、“封装完善的”服务所具有的一个关键的好处是,可以采用多种不同方法将它们组合成较大型的服务,由此来实现重用。

但是,SOA并不仅仅是一种开发方法??它还具有管理上的优点。例如,现在管理员可直接管理开发人员所构建的相同服务,这远胜于以往管理单个应用的方式。通过分析服务间的交互,SOA可以帮助企业了解何时以及为什么业务逻辑被切实执行了,这使管理员或分析师能够有针对性的优化业务流程。

SOA的基本特征

SOA的实施具有几个鲜明的基本特征。实施SOA的关键目标是实现企业IT资产的最大化重用。要实现这一目标,就要在实施SOA的过程中牢记以下特征:

1 可从企业外部访问

通常被称为业务伙伴的外部用户也能像企业内部用户一样访问相同的服务。业务伙伴采用先进的B2B协议(ebXML或RosettaNet)相互合作。当业务伙伴基于业务目的交换业务信息时,他们就参与了一次会话。会话是业务伙伴间一系列的一条或多条业务信息的交换。会话类型(会话复杂或简单、长或短等)取决于业务目的。

除了B2B协议外,外部用户还可以访问以Web服务方式提供的企业服务。

2 随时可用

当有服务使用者请求服务时,SOA要求必须有服务提供者能够响应。大多数SOA都能够为门户应用之类的同步应用和B2B之类的异步应用提供服务。同步应用对于其所使用的服务具有很强的依赖性。

许多同步应用通常部署在前台,其最终用户很容易受到服务提供者短缺的影响。很多情况下,同步应用利用分布式服务提供者,这样可以响应更多的用户请求。但是,随着提供特定服务功能的服务器数量的增长,出现短缺的可能性也呈指数级上升。

相比之下,异步应用要更为稳健,因为其采用队列请求设计,因此可以容许出现服务提供者短缺或迟滞的情况。异步应用大多数情况下部署在后台,用户通常不会觉察到短暂的短缺。大部分情况下异步应用能够稳健应对短时间短缺,但是长时间短缺则会引发严重问题。在服务短缺解决、队列引擎将罕见的大量工作推到共享的应用资源中时,可能会出现队列溢出甚至服务死锁。

服务使用者要求提供同步服务时,通常是基于其自身理解或使用习惯。在多数情况下,采用异步模型可以达到同样的效果,但更能够体现SOA的最佳特性。

当然,并不是所有情况下都应当采用异步设计模式。但大多数情况下,异步消息可以确保系统在不同负荷下的伸缩性,在接口响应时间不是很短时尤其如此。

3 粗粒度服务接口

粗粒度服务提供一项特定的业务功能,而细粒度服务代表了技术组件方法。举个例说明最为清楚??向计费系统中添加一个客户是典型的粗粒度服务,而你可以使用几个细粒度服务实现同一功能,如:将客户名加入到计费系统中,添加详细的客户联系方式、添加计费信息等等。

采用粗粒度服务接口的优点在于使用者和服务层之间不必再进行多次的往复,一次往复就足够。Internet环境中有保障的TCP/IP会话已不再占据主导、建立连接的成本也过高,因此在该环境中进行应用开发时粗粒度服务接口的优点更为明显。

除去基本的往复效率,事务稳定性问题也很重要。在一个单独事务中包含的多段细粒度请求可能使事务处理时间过长、导致后台服务超时,从而中止。与此相反,从事务的角度来看,向后台服务请求大块数据可能是获取反馈的唯一途径。

4 分级

一个关于粗粒度服务的争论是此类服务比细粒度服务的重用性差,因为粗粒度服务倾向于解决专门的业务问题,因此通用性差、重用性设计困难。解决该争论的方法之一就是允许采用不同的粗粒度等级来创建服务。这种服务分级包含了粒度较细、重用性较高的服务,也包含粒度较粗、重用性较差的服务。

在服务分级方面,须注意服务层的公开服务通常由后台系统(BES's)或SOA平台中现有的本地服务组成。因此允许在服务层创建私有服务是非常重要的。正确的文档、配置管理和私有服务的重用对于IT部门在SOA服务层快速开发新的公开服务的能力具有重要影响。

5 松散耦合

SOA具有“松散耦合”组件服务,这一点区别于大多数其他的组件架构。该方法旨在将服务使用者和服务提供者在服务实现和客户如何使用服务方面隔离开来。

服务提供者和服务使用者间松散耦合背后的关键点是服务接口作为与服务实现分离的实体而存在。这是服务实现能够在完全不影响服务使用者的情况下进行修改。

大多数松散耦合方法都依靠基于服务接口的消息。基于消息的接口能够兼容多种传输方式(如HTTP、JMS、TCP/IP、MOM等)。基于消息的接口可以采用同步和异步协议实现,Web服务对于SOA服务接口来讲是一个重要的标准。

当使用者调用一个Web服务时,被调用的对象可以是CICS事务、DCOM或CORBA对象、J2EE EJB或TUXEDO服务等,但这与服务使用者无关。底层实现并不重要。

消息类Web服务通常是松散耦合和文档驱动的,这要优于与服务特定接口的连接。当客户调用消息类Web服务时,客户通常会发送的是一个完整的文档(如采购订单),而非一组离散的参数。Web服务接收整个文档、进行处理、而后可能或者不会返回结果信息。由于客户和Web服务间不存在紧密耦合请求响应,消息类Web服务在客户和服务器间提供了更为松散的耦合。

6 可重用的服务及服务接口设计管理

如果完全按照可重用的原则设计服务,SOA将可以使应用变得更为灵活。可重用服务采用通用格式提供重要的业务功能,为开发人员节约了大量时间。设计可重用服务是与数据库设计或通用数据建模类似的最有价值的工作。由于服务设计是成功的关键因此,因此SOA实施者应当寻找一种适当的方法进行服务设计过程管理。

服务设计管理根本上讲是服务设计问题,服务设计需要在两点间折衷??走捷径的项目战术与企业构建可重用通用服务的长期目标。

超越项目短期目标进行服务接口的开发和评估是迈向精确定义服务接口的重要一步,同时还需要为接口文档、服务实现文档及所有重要的非功能性特征设立标准。

在大型组织中实现重用的一个先决条件是建立通用(设计阶段)服务库和开发流程,以保证重用的正确性和通用性。此外,对记述服务设计和开发的服务文档进行评估也是成功利用服务库的关键。

简言之,不按规则编写服务将无法保证可提供重用性的SOA的成功实施。在执行规则的过程中会产生财务费用,需要在制定SOA实施计划时加以考虑。

7 标准化的接口

近年来出现的两个重要标准XML和Web服务增加了全新的重要功能,将SOA推向更高的层面,并大大提升了SOA的价值。尽管以往的SOA产品都是专有的、并且要求IT部门在其特定环境中开发所有应用,但XML和Web服务标准化的开放性使企业能够在所部署的所有技术和应用中采用SOA。这具有巨大的意义!

Web服务使应用功能得以通过标准化接口(WSDL)提供,并可基于标准化传输方式(HTTP和JMS)、采用标准化协议(SOAP)进行调用。例如,开发人员可以采用最适于门户开发的工具轻松创建一个新的门户应用,并可以重用ERP系统和定制化J2EE应用中的现有服务,而完全无须了解这些应用的内部工作原理。采用XML,门户开发人员无须了解特定的数据表示格式,便能够在这些应用间轻松地交换数据。

你也可以不采用Web服务或XML来创建SOA应用,但是这两种标准的重要性日益增加、应用日趋普遍。尽管目前只有几种服务使用者支持该标准,但未来大多数的服务使用者都会将其作为企业的服务访问方法。

8 支持各种消息模式

SOA中可能存在以下消息模式。在一个SOA实现中,常会出现混合采用不同消息模式的服务。

q 无状态的消息。使用者向提供者发送的每条消息都必须包含提供者处理该消息所需的全部信息。这一限定使服务提供者无须存储使用者的状态信息,从而更易扩展。

q 有状态的消息。使用者与提供者共享使用者的特定环境信息,此信息包含在提供者和使用者交换的消息中。这一限定使提供者与使用者间的通信更加灵活,但由于服务提供者必须存储每个使用者的共享环境信息,因此其整体可扩展性明显减弱。该限定增强了服务提供者和使用者的耦合关系,提高了交换服务提供者的服务难度。

q 等幂消息。向软件代理发送多次重复消息的效果和发送单条消息相同。这一限定使提供者和消费者能够在出现故障时简单的复制消息,从而改进服务可靠性。

9 精确定义的服务接口

服务是由提供者和使用者间的契约定义的。契约规定了服务使用方法及使用者期望的最终结果。此外,还可以在其中规定服务质量。此处需要注意的关键点是,服务契约必须进行精确定义。

META将SOA定义为:“一种以通用为目的、可扩展、具有联合协作性的架构,所有流程都被定义为服务,服务通过基于类封装的服务接口委托给服务提供者,服务接口根据可扩展标识符、格式和协议单独描述。”该定义的最后部分表明在服务接口和其实现之间有明确的分界。

SOA的优点

了解了SOA的定义和基本特征,最后我们再来看看SOA潜在的优点:

编码灵活性

可基于模块化的低层服务、采用不同组合方式创建高层服务,从而实现重用,这些都体现了编码的灵活性。此外,由于服务使用者不直接访问服务提供者,这种服务实现方式本身也可以灵活使用。

明确开发人员角色

例如,熟悉BES的开发人员可以集中精力在重用访问层,协调层开发人员则无须特别了解BES的实现,而将精力放在解决高价值的业务问题上。

支持多种客户类型

借助精确定义的服务接口和对XML、Web服务标准的支持,可以支持多种客户类型,包括PDA、手机等新型访问渠道。

更易维护

服务提供者和服务使用者的松散耦合关系及对开放标准的采用确保了该特性的实现。

更好的伸缩性

依靠服务设计、开发和部署所采用的架构模型实现伸缩性。服务提供者可以彼此独立调整,以满足服务需求。

更高的可用性

该特性在服务提供者和服务使用者的松散耦合关系上得以体现。使用者无须了解提供者的实现细节,这样服务提供者就可以在WebLogic集群环境中灵活部署,使用者可以被转接到可用的例程上。

SOA可以看作是B/S模型、XML/Web Service技术之后的自然延伸。SOA将能够帮助我们站在一个新的高度理解企业级架构中的各种组件的开发、部署形式,它将帮助企业系统架构者以更迅速、更可靠、更具重用性架构整个业务系统。较之以往,以SOA架构的系统能够更加从容地面对业务的急剧变化。

143 Words • 104 views • 06-08-21 • 09:42:56• 高 玉昆 Email Permalink
Category: 软件设计

昨天去参加了IBM关于SOA及其产品的讲座,现将讲座内容进行整理。讲座大体分俩大部分:
一、关于SOA。
1、什么是SOA?
把业务需求和IT需求统一起来,实现业务与IT的一致性。
2、SOA的生命周期。(建模、集合、部署、管理)
(1) 收集需求
(2) 收集不同的服务
(3) 把人员、流程、管理、信息整合在一起
(4) 管理应用和服务,关注相同和一致的服务
3、SOA的价值和意义
(1) 提高了业务流程的灵活性
让产品提早上市
(2) 降低风险(投资少)
服务的质量被保证
(3) 团队的工作效率提高
业务与IT之间的沟通更清楚
4、用IBM的方法来管理SOA(计划、定义、管理资产的生命周期、衡量的有效性)
(1) 能做什么?是否已准备好?有那些可使用的工具可以帮助?线路是什么?
(2) 把已有的服务进行整理,那些服务是普通需要的?那些服务是要被共享的?
(3) 怎样组织服务共享,协作,使以后实现高效复用?谁被允许改变这些复用的服务?
谁使用这些服务?
(4) 项目的绩效,项目的成本
这里的关键部分是要把所有步骤的产物文档化。
上面的四个部分想要的结果IBM都有工具帮助完成。
二、加速软件的全球交付
1、 需求变更管理
实现需求变更的可跟踪性,图表化(操作结果文档化)
2、 任务管理
每个员工都有一个任务管理列表,显示分配给他的所有任务,同时每个任务都有优先级,员工根据优先级来判断该完成什么工作。每个员工的的任务列表都图表化了,项目经理看图就知道那位可以接受新的任务,并分配给他。(操作过程文档化,记录完成人)
3、 质量管理
客户可以提交bug,同时标注严重程度。
(操作结果文档化)
4、进度跟踪
跟踪并控制项目的进度。

实现上面的步骤有IBM的工具ClearQuest可以实现。
汉昌管理系统同样可以实现上面的全部功能。
5、比较:
(1) 汉昌管理系统增加了实时通信这一功能,使异地的开发人员能更好急时的合作,ClearQuest是使用EMAIL通信的。
(2) ClearQuest使用的是浏览器(B/S),汉昌管理系统使用的是客户端(C/S)。(看着ClearQuest的界面像是把客户端的界面嵌套在了Explorer里了)
(3) 汉昌管理系统可以实施浏览器安装或自动安装(方便客户提交bug)。
(4) ClearQuest可跨平台。

(支持国产软件 ^_^)

26 Words • 200 views • 06-08-18 • 11:18:36• 高 玉昆 Email Permalink
软件业三国时代来临(转)
Category: 资料

今天是我们ISV巡展的第三站,继北京和广州之后,我们来到了四川成都。在四川附近的三十多家软件企业的老总们今天到会,其中近一半是从软件外包起家的从事软件开发的中小型企业。

来到了成都这个三国时代蜀国的故都,既感受到蜀都浓厚的历史氛围,又惊叹于成都近年来的快速发展。更有趣的是纵观全球,软件业的发展在两个层面上都仿佛又进入了三国时代。从软件厂商的角度来看,独立软件的主流厂商无疑是SAP、甲骨文和微软三强争霸的局面,而且近年来软件业你讨我伐,联合兼并此起彼伏。从地域的角度来看,美国俨然是软件业“胁天子以令诸侯”的魏国,欧洲恰似那“具江东已立三世”的吴国,而中国和印度无疑在争取成为三足鼎立的蜀国。

近年来,中国软件业开始摆脱长期以来发展缓慢的局面,随着中国经济的快速发展有了长足的进步。近一段时间以来,中国各地软件园如雨后春笋般纷纷出现,全球大的IT公司也加强了对中国软件业的投资。 一些西方的软件业头面人士甚至提出了中国将成为西方软件行业的主要威胁和竞争对手的论点。他们的这个论断主要是基于下述三点:中国经济的快速发展所带来的巨大的软件市场,中国企业商务模式的独特发展和创新,以及中国低成本和相对高质量的软件从业人员。这些观点可以说是看到了中国软件业未来发展的前景和潜力。

但另一方面,中国软件业的发展仍然举步艰难、步履蹒跚,软件业的规模仍落后于中国经济的整体发展水平。这主要是由于下述三点造成的:中国企业的整体管理水平和IT水平有待进一步提高,软件业分工不够精细、专业化程度不高,而且高水平的软件人才非常短缺。看到这些不足,我们应该保持清醒的头脑,避免盲目乐观。

纵观当今软件业的天下,正在日益显现其重要性的面向服务的企业架构(Enterprise SOA)将是兵家必争的荆州, 而企业应用软件则是“沃土千里,天府之国”的益州巴蜀。中国软件业要广揽人才、修好内功、先得“荆州”、再取“益州”, 则可三分天下有其一。 待时机成熟、“天下有变” , 借中国企业商务模式的独特发展和创新的优势积累更可挺进中原、 直取洛阳和西安,“则霸业可成,汉室可兴亦”。

中国软件业才俊辈出,以“隆中对策”争雄天下此即其时。

6 Words • 96 views • 06-08-30 • 12:33:54• 高 玉昆 Email Permalink
TactionList 里的Taction的Update事件
Category: delphi

一般这个事件是控制按扭是否可点击用的(他是在cup空闲的时候触发的事件)。但满足某一个条件的时候,按扭的enable设置为true ,当不满足的时候,设置enable为False。一般的写法是
if 条件成立 then
enable := true;
else
enable := False;
其实有一个更好的方法:
enable := 条件;
这样enable就随着条件的变化而变化了。
+哈哈+

14 Words • 166 views • 06-08-25 • 19:24:00• 高 玉昆 Email Permalink
有一句话是这样说的
Category: 随笔

世界上没有一个人值得你为他流泪,真正值得的那个人却永远不会让你哭的

Words • 115 views • 06-08-14 • 12:26:33• 高 玉昆 Email Permalink
判断是否有重复记录
Category: delphi

背景:
汉昌管理系统-服务器管理功能
用内存表和网格来实时管理服务器信息,最后保存到文件中。
问题:
把内存表中的信息保存到文件中的时候要判断是否有重复记录。
解决办法:
1、在保存的时候,先取内存表中的第一条记录和后面所有的记录比较,如果有重复,提示,如果没有,取下一条,和他后面的所有的记录比较,类推。
困难:当取内存表第一条记录的时候,要把这个状态保存下来,第一条记录要和其他的记录比较,取其他记录的时候内存表的记录焦点就移动了,当想再取第二条的时候,就没法取了。如果能把内存表的一个状态保存下来,应该就解决了。
2、在保存、添加的时候都判断是否有重复记录,判断的时候把当前的数据和所有的记录比较,如果重复数大于1,(考虑本身重复)提示错误。(目前解决方案)

Words • 165 views • 06-08-11 • 17:37:57• 高 玉昆 Email Permalink
当判断内存表中是否有某种条件的记录或要定位到某条记录 Locate
Category: delphi

当判断内存表中是否有某种条件的记录或要定位到某条记录的时候可使用Locate来实现。
分两种情况及单条件查询或多条件查询:
1、单条件查询

例如:FPrivilegeMemoryTableKBM为内存表,business_type_id为字段名,Integer(FFocus.Data)为值
FPrivilegeMemoryTableKBM.Locate('business_type_id', Integer(FFocus.Data), [])
如果找到有满足条件的记录返回True,同时指针定位到查到的第一条记录。
如果没找到返回False.

2、多条件查询

例如:FPrivilegeMemoryTableKBM为内存表,role_id,privilege_id,State为字段名,Integer(tvRole.Selected.Data), Integer(VNode.Data)为值

FRolePrivilegeMemoryTableKBM.Locate('role_id; privilege_id; State', vararrayof([Integer(tvRole.Selected.Data), Integer(VNode.Data), 0]), [])

如果找到有满足条件的记录返回True,同时指针定位到查到的第一条记录。
如果没找到返回False.

48 Words • 185 views • 06-08-23 • 16:54:33• 高 玉昆 Email Permalink
Category: delphi

打开电脑,进入Windows操作系统,在资源管理器的左边栏中清楚地显示了系统管理的所有磁盘的信息以及各个磁盘所容纳的文件与文件夹(如图一)。这种常见的显示方式是由一个根节点和若干个子节点构成的,这被称为“树形结构”。这种树形结构的用途非常广泛,在很多常用软件中都出现过它的身影。Windows中将这种结构封装为“树形控件”,即TreeView控件,它与ListView、Button等一样都属于系统自带的通用公共控件。在Delphi中,TreeView也被封装成了VCL组件,它的位置在“Win32组件”面板上,是我们最常用的几个组件之一。

  Delphi自带的TreeView组件可以显示树形结构,也可以为每个节点指定不同的图标来区分各自的功能。但在平时的使用中,我们发现它并不能嵌入CheckBox或者是RadioButton组件,这样用户就不能直观地选择某一部分节点或某个节点。如何来解决这个问题呢?我们思考之后发现,有两种思路可以完成前面所述的任务。一种是在TreeView组件的基础上继承的它的功能,并添加所要的功能(使TreeView能嵌入CheckBox或者是RadioButton组件)即重写一个组件。另一种是利用用户的错觉,将CheckBox或者是RadioButton所能实现的外观用两种状态的图片(一种是选中状态另一种是未选中状态)来交替显示,走迂回路线来完成任务。我们来分析一下这两种方法的优缺点:第一种方法要重写一个组件,显然难度较大,所用时间较长;第二种方法,利用TreeView组件本身就具备的显示图标功能,简便易行,所用时间短,能够完成需求。比较之后,我们选择作用第二种方法,先来看一下完成之后的效果(如图二),应该说是达到了目的,现在我们来细述一下完成的过程:

  首先,我们在Win32面板上选择ImageList组件,设置它的StateImages属性,包括两种状态的图标,一种是选中状态,另一种是未先中状态。

  其次,我们调用ToggleTreeView过程(实现方法见后文),实现在鼠标单击和键盘选择的状态下改变状态图标的功能。

  ToggleTreeView过程实现代码如下:

  procedure ToggleTreeViewCheckBoxes(
   Node :TTreeNode;
   cUnChecked, //CheckBox未选中状态
   cChecked, //CheckBox选中状态
   cRadioUnchecked, //RadioButtion未选中状态
   cRadioChecked :integer); // RadioButtion选中状态
  var
   tmp:TTreeNode;
  begin
   if Assigned(Node) then
   begin
  //如果当前是未选中状态则变为选中状态
   if Node.StateIndex = cUnChecked then
   Node.StateIndex := cChecked
  //如果当前是选中状态则变为未选中状态
   else if Node.StateIndex = cChecked then
   Node.StateIndex := cUnChecked
   else if Node.StateIndex = cRadioUnChecked then
   begin
   tmp := Node.Parent;
   if not Assigned(tmp) then
   tmp := TTreeView(Node.TreeView).Items.getFirstNode
   else
   tmp := tmp.getFirstChild;
   while Assigned(tmp) do
   begin
   if (tmp.StateIndex in
   [cRadioUnChecked,cRadioChecked]) then
   tmp.StateIndex := cRadioUnChecked;
   tmp := tmp.getNextSibling;
   end;
   Node.StateIndex := cRadioChecked;
   end; // if StateIndex = cRadioUnChecked
   end; // if Assigned(Node)
  end;
  第三,上面的代码解决的是状态图标转换的问题,那如何解决在鼠标单击和键盘选择之后就改变状态呢?下面给出实现代码:

  (1)当鼠标单击时,代码如下:

  procedure TForm1.TreeView1Click(Sender: TObject);
  var
   P:TPoint;
  begin
   GetCursorPos(P); //得到光标的位置
   P := TreeView1.ScreenToClient(P);
   if (htOnStateIcon in
   TreeView1.GetHitTestInfoAt(P.X,P.Y)) then
   ToggleTreeViewCheckBoxes(
   TreeView1.Selected,
   cFlatUnCheck,
   cFlatChecked,
   cFlatRadioUnCheck,
   cFlatRadioChecked);
  end;

  (2)当键盘选择时,代码如下:

  procedure TForm1.TreeView1KeyDown(
   Sender: TObject;
   var Key: Word;
   Shift: TShiftState);
  begin
   if (Key = VK_SPACE) and
   Assigned(TreeView1.Selected) then
   ToggleTreeViewCheckBoxes(
   TreeView1.Selected,
   cFlatUnCheck,
   cFlatChecked,
   cFlatRadioUnCheck,
   cFlatRadioChecked);
  end;

  最后,我们给出一个小例子,来验证一下的我们试验的结果。在窗体上的摆放TreeView、ImageList、Button和一个Memo组件(如图三),在加入上面的代码之后,我们来编写这个Button的单击事件的代码:

    procedure TForm1.Button1Click(Sender: TObject);
    var
     BoolResult:boolean;
     tn : TTreeNode;
    begin
     if Assigned(TreeView1.Selected) then
     begin
     tn := TreeView1.Selected;
     BoolResult := tn.StateIndex in
     [cFlatChecked,cFlatRadioChecked];
     Memo1.Text := tn.Text +
     #13#10 +
     'Selected: ' +
     BoolToStr(BoolResult, True);
      //Memo给出所选中的节点和当前的状态
     end;
    end;

  因为篇幅所限,上面的例子给出是最简单的一个情况,如果要编写更为专业的软件,请读者朋友充分发挥想象,一定做出更好的效果(如图四)。

226 Words • 51 views • 06-08-23 • 08:39:40• 高 玉昆 Email Permalink
拨开soa的面纱
Category: 软件设计

内容简介
SOA是英文Service-Oriented Architecture,即服务导向架构的缩写。这个词汇最近一两年频频出现在各种技术期刊上。但是一直以来对于SOA到底是什么一直没有明确的回答;SOA有什么特点?适合用于解决哪些问题?与其他的技术有什么区别与联系?Web Service和SOA又是什么关系?SOA的出现对于软件架构设计有什么影响?本文将就上面提到的这些问题,尝试根据作者自己的理解给出SOA的定义;总结出SOA特有的三个基本特征;然后以HTTP协议为例对这些特征进行解释;最后简要的说明SOA对今后软件架构设计可能带来的影响。

SOA定义
下面是作者给SOA下的一个定义:SOA是指为了解决在Internet环境下业务集成的需要,通过连接能完成特定任务的独立功能实体实现的一种软件系统架构。从这个定义中我希望表达的前提有下面两点:

1)软件系统架构: SOA不是一种语言,也不是一种具体的技术而是一种软件系统架构,它尝试给出在特定环境下推荐采用的一种架构,从这个角度上来说,它更像一种模式(Pattern)。因此它与很多已有的软件技术比如面向对象技术,是互补的而非互斥的。它们分别面向不同的应用场景,用来满足不同的特定需求。

2)SOA的使用范围:需求决定同时也限制功能。SOA并不是包治百病的万灵单,它最主要的应用场合在于解决在Internet环境下的不同商业应用之间的业务集成问题。在下面我们会详细讨论Internet的各种特点是如何决定了SOA的特点,这里我们只需要先简单回顾一下Internet环境区别于Intranet环境的几个特点:a)大量异构系统并存,计算机硬件工作方式不同,操作系统不同、编程语言也不同;b)大量、频繁的数据传输仍然速度缓慢并且不稳定;c)版本升级无法完成,我们根本就无法知道互联网上有哪些机器直接或者间接的使用某个服务。

基于上面的前提,下面就让我们一起看一下SOA的基本特征。

SOA三大基本特征
独立的功能实体
在Internet这样松散的使用环境中,任何访问请求都有可能出错,因此任何企图通过Internet进行控制的结构都会面临严重的稳定性问题。SOA非常强调架构中提供服务的功能实体的完全独立自主的能力。传统的组件技术,如.NET Remoting, EJB,COM或者CORBA,都需要有一个宿主(Host或者Server)来存放和管理这些功能实体;当这些宿主运行结束时这些组件的寿命也随之结束。这样当宿主本身或者其它功能部分出现问题的时候,在该宿主上运行的其它应用服务就会受到影响。

SOA架构中非常强调实体自我管理和恢复能力。常见的用来进行自我恢复的技术,比如事务处理(Transaction),消息队列(Message Queue),冗余部署(Redundant Deployment)和集群系统(Cluster)在SOA中都起到至关重要的作用。

大数据量低频率访问
对于.NET Remoting,EJB或者XML-RPC这些传统的分布式计算模型而言,他们的服务提供都是通过函数调用的方式进行的,一个功能的完成往往需要通过客户端和服务器来回很多次函数调用才能完成。在Intranet的环境下,这些调用给系统的响应速度和稳定性带来的影响都可以忽略不计,但是在Internet环境下这些因素往往是决定整个系统是否能正常工作的一个关键决定因素。因此SOA系统推荐采用大数据量的方式一次性进行信息交换。

基于文本的消息传递
由于Internet中大量异构系统的存在决定了SOA系统必须采用基于文本而非二进制的消息传递方式。在COM、CORBA这些传统的组件模型中,从服务器端传往客户端的是一个二进制编码的对象,在客户端通过调用这个对象的方法来完成某些功能;但是在Internet环境下,不同语言,不同平台对数据、甚至是一些基本数据类型定义不同,给不同的服务之间传递对象带来的很大困难。由于基于文本的消息本身是不包含任何处理逻辑和数据类型的,因此服务间只传递文本,对数据的处理依赖于接收端的方式可以帮忙绕过兼容性这个的大泥坑。

此外,对于一个服务来说,Internet与局域网最大的一个区别就是在Internet上的版本管理极其困难,传统软件采用的升级方式在这种松散的分布式环境中几乎无法进行。采用基于文本的消息传递方式,数据处理端可以只选择性的处理自己理解的那部分数据,而忽略其它的数据,从而得到的非常理想的兼容性。

HTTP协议:一个典型的SOA实现
每一项新技术都是在一些旧的技术基础上发展出来的。正如XML根本思想来自于在60年代就已经出现的早期标记性语言一样,SOA虽然这两年才出现,但是它所表达的观念应该说在网络这种分布式系统结构出现不久就已经广泛应用了。例如我们最熟悉的HTTP协议就是一个非常典型的SOA架构设计。HTTP协议的工作过程简单叙述如下:

1)客户端,通常是通过浏览器,向服务器端以文本的方式发送一个请求,索取一个Web页面;

2)服务器端接收到这个请求之后,根据请求的内容进行处理并且返回一个符合HTML语法的文本;

3)客户端接收到服务器端的响应文本后调用本地的程序,通常还是浏览器,把返回的HTML文本的内容展现出来。

下面来看一下HTTP协议如何满足了SOA的特点:

独立的功能实体:作为服务器端的Web服务器是绝对不会因为客户端的状况变化而改变的,它总是非常稳定的按照自己的内在逻辑运行,响应外部的请求,管理自己的资源和数据。这里一个非常好的例子就是Web服务器对缓存(Cache)的处理,很多Web服务器为了提高性能都或多或少的对数据进行缓存,但是缓存数据、刷新数据这些于客户端完全无关的操作完全由服务器端独立完成,完全不受客户端的影响。
大数据量低频率访问:对于一个HTTP请求来说,客户端与服务器之间访问的边界非常简单:就是一个请求,一个响应,没有任何其它的信息往返。无论客户端申请的网页上除了文字之外还有什么信息,对于客户端来说,它发出的请求只是简单的告诉Web服务器它所需要的网页的位置;至于为了生成这个网页,服务器端是否需要访问数据库,执行Servlet或者其它的CGI程序对客户端而言,都是完全透明的。
基于文本的消息传递:迄今为止兼容性最好的系统可能就是HTTP协议支撑的大部分的web应用了,我们可以在Windows平台下用IE查看互联网上一个Linux+Apache服务器上的由Perl脚本自动生成的网页。这里的关键就是所有内容都是以格式化的文本方式传递的,不管Perl脚本如何执行,只要它的输出是符合HTML规范的网页,就可以被客户端的浏览器解释。而由于不同的操作系统上对于相同的HTML的解释遵循相同的规范,因此不同操作系统下仍然能够看到一致的用户界面。
我们上面基本描述了SOA作为一种软件架构有哪些特点,下面让我们一起看看Web Service与SOA的关系。

SOA于Web Service
Web Service是就现在而言最适合实现SOA的一些技术的集合,事实上最近SOA的火爆在很大程度上归功于Web Service标准的成熟和应用的普及为广泛的实现SOA架构提供了基础。下面让我们看看Web Service中的各种协议是如何互相工作来满足SOA所需的特点的:

独立的功能实体:通过UDDI的目录查找,我们可以动态改变一个服务的提供方而无需影响客户端的应用程序配置。所有的访问都通过SOAP访问进行,只要WSDL接口封装良好,外界客户端是根本没有办法直接访问服务器端的数据的。
大数据量低频率访问:通过使用WSDL和基于文本(Literal)的SOAP请求,我们可以实现能一次性接收大量数据的接口。这里需要着重指出的是SOAP请求分文本方式和远程调用(RPC)两种方式,正如上文已经提到的,采用远程调用方式的SOAP请求并不符合这点要求。但是令人遗憾的是现有的大多数SOAP请求采用的仍然是远程调用(RPC)方式,在某些平台上,例如IBM WebSphere的早期版本,甚至没有提供文本方式的SOAP支持。
基于文本的消息传递:Web Service所有的通讯是通过SOAP进行的,而SOAP是基于XML的,不同版本之间可以使用不同的DTD或者XML Schema加以辨别和区分。因此只需要我们为不同的版本提供不同的处理就可以轻松实现版本控制的目标。
SOA对于软件架构设计的影响
无论您现在的系统是否牵涉到基于Internet的业务集成,采用SOA推荐的架构都对提高您系统的扩展性有很大帮助,下面是在系统中引入SOA后需要在软件架构方面做出的改变:

使用基于文本方式的SOAP调用,摆脱远程调用中出现的函数参数类型等与数据无关的信息,保证所有SOAP传递的都是有意义的商业数据。依赖于Schema,而不是类定义对这些数据进行解释。
传统的三层Web应用将可能变成四层结构:传统意义上的商业逻辑层将被进一步划分为存放每个会话(Session)信息的客户逻辑层和与状态无关Sateless的SOA层。

140 Words • 93 views • 06-08-21 • 09:26:03• 高 玉昆 Email Permalink

高玉昆

August 2006
Mon Tue Wed Thu Fri Sat Sun
  Current > >>
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Search

Categories

Linkblog

公益网站

Misc

Syndicate this blog XML

What is RSS?

Who's Online?

Guest Users: 15

powered by
b2evolution