博文

Delphi每日构建(2009-11-27 17:24:00)

摘要:   看到ccBoy的Daily Build 的链接 ,我也加两个。还是以前对delphi项目进行每日构建时用的,不过对.net同样支持。      FinalBuilder  : http://www.atozedsoftware.com/finalbuilder/  。非常好用,可惜是商业软件。支持每日构建的各个环节,内部已集成了对主流版本控制软件,主流语言等支持,甚至可以直接刻录光盘。还可以写自定义插件(只能是delphi的bpl包,不过不会也不要紧,可以调用可执行文件)。并且能够组织的井井有条。     Want : http://sourceforge.net/projects/want/     看链接就知道是开源的了。它是针对delphi工程的。以前为了选择,写了个评估报告。   每日构建采用软件的评估报告 一、目的: 选择一个符合本公司软件开发实际需求的每日构建软件,并有一定前瞻性。 二、评估项目               1、基本功能 :                      (1)、能调用多种版本控制软件取得代码。                      (2)、对代码进行编译,并自动管理版本号。                    &......

阅读全文(2563) | 评论:0

三层传递图片(2009-03-28 11:01:00)

摘要:function StreamToVariant(Stream: TStream): OleVariant;var p: Pointer;begin Result := VarArrayCreate([0, Stream.Size - 1], varByte); p := VarArrayLock(Result); try   Stream.Position := 0;   Stream.Read(p^, Stream.Size); finally   VarArrayUnlock(Result); end;end;在 中间层用\procedure VariantToStream(const Data: OleVariant;Stream:TMemoryStream);var p: Pointer;begin p := VarArrayLock(Data); try   Stream.Write(p^, VarArrayHighBound(Data,1) + 1); finally   VarArrayUnlock(Data); end;end; //=============================================================== 在D6+Access2K中测试通过:服务端方法如下:procedure TTestDM.Insert_Img(var Pic: OleVariant);var P : Pointer;   FileStream:TMemoryStream;begin  FileStream:=TMemoryStream.Create; //生成内存流  try     FileStream.Size := VarArrayHighBound(Pic, 1) - VarArrayLowBound(Pic, 1) + 1;     P := VarArrayLock(Pic);    ......

阅读全文(1463) | 评论:0

Delphi SQL程序发布(2009-03-28 10:55:00)

摘要:很多朋友在编写完成基于SQLServer的程序后对发布程序感到头疼,因为仅仅发布应用程序和BDE是不够的,必须安装SQLServer Client软件,难道还要提供一张SQLServer的光盘?下面jojo为大家介绍一个解决之道:      1.准备一份Install Shield Express,最好是2.01以上的版本,在Delphi的安装盘上有一个专用版本也可以用,按照制作一般程序安装盘的方法建立安装程序, 必须安装BDE和SQL LINKS.     2.在你的Windows\System下面找到以下几个文件(当然你的机器必须已经安装SQLServer):       Dbmssocn.dll    TCP/IP 支持文件        Dbmsspxn.dll    IPX 支持文件        Dbnmpntw.dll    命名管道支持文件        Ntwdblib.dll    SQLServer核心文件(这个文件最重要)      3.在Fpecify Components and Files的Groups and Files中,将以上几个文件加入到Program Files中去.当然你也可以建立一个组,将这些文件拷贝到System目录中,不过jojo个人倾向于拷贝到安装目录,以便反安装的时候可以彻底的删除它们.     4.如果你的程序运行比较简单(比如只有一个网段)现在你已经大功告成了,但不幸的是大多数人的网络环境没有如此简单,下面还要修改注册表:    增加一个:hkey_local_machine_/software/Microsoft/MSSQLserver/CLIENT/db-lib,其中DSQUERY设定默认的连接协议,这里设定的是IPX,128.1.1.1则是专有的连接, 这里是设定一个连接名称为128.1.1的连接,使用TCP/IP协议,IP地址为128.1.1.1,你也可以把键......

阅读全文(1646) | 评论:0

SOAP一周谈 第一日 SOAP专有词汇(2008-11-11 23:39:00)

摘要:1、Independent Element(独立元素) 位于Envelope、Header和Body元素之外第一层的元素。独立元素的目的是为了代表特定类型的样例,例如SOAP封包中远程调用的方法既是一个样例,因此它是一个封装在Body元素的中独立元素。 2、Embedded Element(内嵌元素) 不是独立元素的其它封装元素就是内嵌元素。内嵌元素是使用来代表访问元的。 3、Simple Type(简单类型) 整数、字串等不具名称参考部分的类型。 4、Compound Type(复合类型) 可以使用名称参考到的类型,如Record或数组。 5、Single Reference(单一参考) 只能由一个访问元参考的元素。 6、Multiple Reference(多重参考) 可以由一个以上访问元参考的元素。 7、Serialization 程序语言把调用的信息转换为SOAP封包的过程称之为。 8、Schema(纲要) 用以指明SOAP包的封装方法。......

阅读全文(1704) | 评论:0

Delphi中Web Service组件简介(2008-11-08 22:54:00)

摘要:1、   THTTPRIO 通过SOAP或HTTP封包调用远程Web Service 2、   TOPToSoapDomConvert 把Object Pascal调用的Web Service服务转换为SOAP形式的封包,并把Web Service返回的SOAP结果封包转换为Object Pascal的类型以便让客户端应用程序访问结果。 3、   THTTPReqResp通过Wininet.dll传送出HTTP请求的SOAP封包给远程的Web Service,或接受远程的Web Service返回的HTTP结果。 4、   THTTPSOAPDISPATCHER   THttpSoapDispatcher会拦截HTTP的请求,并且把SOAP的请求分派给THTTPSOAPPASCALINVOKER组件以激活对应的Web Service函数。 5、   THTTPSOAPPASCALINVOKER THTTPSOAPPASCALINVOKER负责根据HTTP请求调用正确的Web Service服务。 6、   TWSDLHTMLPUBLISH   TWSDLHTMLPUBLISH负责自动产生描述Web Service的服务信息以及WSDL内容。 7、   TSOAPCONNECTION TSOAPCONNECTION负责调用在Web Service实现的应用程序服务器。 ......

阅读全文(3189) | 评论:0

简单工厂模式分析与实践(2008-11-03 15:08:00)

摘要:type  TSimpleFactory = Class    class function CreateForm(FormName: string): TForm;  end; implementation  class function TSimpleFactory.CreateForm(FormName: string): TForm;begin  Result := nil;  if FormName = '销售订单' then    Result := TfmSalesOrder.Create(Application)  else if FormName = '生产单' then    Result := TfmManufacturingOrder.Create(Application)  else if FormName = '生产入库单' then    Result := TfmProductToStock.Create(Application)  else if FormName = '送货单' then    Result := TfmDeliveryOrder.Create(Application);end;   也许有人认为上面的代码过于画蛇添足了,同样的功能完全可以用一个函数实现。如下: function CreateForm(FormName: String): TForm;begin  Result := nil;  if FormName = '销售订单' then    Result := TfmSalesOrder.Create(Application)  else if FormName = '生产单' then    Result := TfmManufacturingOrder.Create(Application)  else if FormName = '生产入库单' then&n......

阅读全文(2414) | 评论:0

“封装变化”面向对象的另一条设计原则(2008-11-03 11:17:00)

摘要:  面向对象的编程的另外一条非常重要的设计原则是“封装变化”。找出应用中可能需要变化的地方,把它们独立出来,不要和那些不需要变化的代码混在一起。......

阅读全文(2001) | 评论:0

一条十分重要的面向对象的设计原则(2008-11-03 10:57:00)

摘要:  面向对象的编程有一条非常重要的设计原则,那就是“针对接口编程,而不是针对实现编程。”针对接口编程的真正含义是针对超类“SuperType”编程。所谓的“接口”有多个含义,它是一种概念,也是一种interface类型。这里所说的“接口”可以不涉及interface类型。而"针对超类编程"这句话可以明确的说成“变量的声明类型应该是超类。”......

阅读全文(2333) | 评论:1

枚举类型(2008-10-31 23:02:00)

摘要:1、定义  枚举类型是一组由有效的标识符代表的有序数值的集合。2、声明方法  type    TMyCongregate = (val1..valn);//其中类别名和val都是符合语法规则的标识符。  或  var    MyCongregate: (val1..valn);//注意,这种声明方式会导致相同的数值范围只能用一个变量表示。  //如,下面这种声明方式将导致编译器报错。  var    myCongregate1: (Green, yellow, blue);    myCongregate2: (Green, yellow, blue);  //下面的声明方式就不会产生编译器错误  type    TMyCongregate = (Green, yellow, blue);  var    myCongregate1: TMyCongregate;    myCongregate2: TMyCongregate;3、赋值运算  //声明同上  myCongregate1 := Green;4、逻辑运算  //声明同上  myCongregate1 := Green;  myCongregate2 := blue;  if myCongregate1 > myCongregate2 then {do Something}  //枚举类型值的大小和其值在声明中的顺序相关(此处为本人估计),当然也能用下面方法在声明时指定顺序值。  type    TMyCongregate = (Green = 5, yellow = 10, blue = Green + yellow);  5、其它应用  myCongregate1 := Green;  case myCongregate1 of   ......

阅读全文(2153) | 评论:0

结合编译指令巧妙实现“单例模式”(2008-10-30 16:48:00)

摘要:type TMyClass = Class  procedure myProcedure; stdcall;  function myFunction: string; stdcall;end; {  技巧在于通过编译指令FInstance可以被赋值,且同时FInstance又具有常量的性质不会象变量每次进入其作用域就会重新分配初值。  用变量来实现相同的功能则该变量必须被定义成全局变量,而编程守则则要求少使用全局变量。}function FindInstance(Request: Boolean = True): TMyClass;{$j+}//该编译指令功能为使常量可以被赋值  Const FInstance: TMyClass = nil;{$j-}begin  if not Assigned(FInstance) then    FInstance := TMyClass.Create;  if not Request then    FInstance := nil;  Result := FInstance;end;......

阅读全文(2414) | 评论:0