博文

BPL调试诀窍(2011-07-01 09:48:00)

摘要:BPL包无法调试(设置断点)的问题,欢迎讨论    做开发不能调试实在是太痛苦了,忍了好久了 由于系统结构是Host主程序动态加载BPL包的模式。所以用到了Package的调试,但无论如何有一个包就是无法调试(加断点不起作用)。经过N久的查找,发现:      1.包Package在编译,生成的时候会自动产生DCP和BPL文件,缺省产生到DelphiProjectsBPL下。      2.BPL文件的生成路径可以在Project/Options/Directories中修改      3.多个Package联合调试时,最好把DCP生成在同一个路径下,并且在Tools/Invironment Options/Library的Library Path中添加。      4.调试时Delphi在Library中按从上到下的顺序搜索DCP文件,如果第一个搜索到的DCP和最新的源代码是配套的,会进入调试,否则不会进入调试。      经常遇到这样的问题:首先保存了一个包,顺手Build了一下,这时候生成的BPL和DCP都在DelphiProjectsBPL下。后来又改了Project中的DCP生成路径,生成到专门放DCP的文件夹。在后来的运行调试中,由于系统第一个会找到我生成到DelphiProjectsBPL下的那个没有任何功能的DCP,自然和我目前的BPL是不匹配的,所以就无法调试......

阅读全文(3259) | 评论:2

读一读Scktsrvr.exe的源程序(2010-04-23 21:13:00)

摘要:使用DELPHI做多层开发的朋友们都应该对Scktsrvr.exe这个程序不陌生的,Borland公司在DELPHI中给出了它的源代码。这是一个900来行的程序,程序不算长,现在我只选其中部分仔细读一读。走的线路大致是,从服务器接到客户端连接,处理客户端的一个请求(这儿选了客户端向服务器发出的"取应用服务器列表"请求) 服务器接受了客户端连接后,因为ServerSocket采用的是阻塞模式,服务器执行了下面这个线程来服务客户端: //SCKTMAIN.PAS procedure TSocketDispatcherThread.ClientExecute;var  Data: IDataBlock;  msg: TMsg;  Obj: ISendDataBlock;  Event: THandle;  WaitTime: DWord;begin  CoInitialize(nil);                 //初始化COM  try    Synchronize(AddClient);             //在程序界面上显示客户信息,        //用同步保证AddClient线程安全性    FTransport := CreateServerTransport;    try      Event := FTransport.GetWaitEvent;      PeekMessage(msg, 0, WM_USER, WM_USER, PM_NOREMOVE);      GetInter......

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

怎样在三层结构的系统中对应用程序服务器传出的数据压缩?(2010-04-23 21:00:00)

摘要:转自:http://topic.csdn.net/t/20020708/15/858595.html我把图形文件(TiF格式)存放在SQl   Server数据库中,当时我要在客户端取时速度很慢(3-4秒),我想通过实现IDataIntercept接口,来压缩图像,该怎样实现。 我不知道,不过delphi中有demo的.我想,如果你在客户端用了clientdataset,在服务端用了datasetprovider,那你可以在   datasetprovider的OnGetData事件中,对图像进行压缩,然后在ClientDataSet的AfterGetRecords事件中,对图像进行解压。你的想法不错,我觉得我的系统也可以用这样的方法提高效率,能不能告说我你准备用什么方式对数据进行压缩?也许我们可以继续交流一下?用IDataIntercept的方式也不错,有空我也研究一下。实现IDataIntercept的方法不错.     我做过,但只是用于SocketConnection.它只需要实现两个方法,     1,数据进,   在里面实现解压.     2,数据出,   在里面实现压缩.         理解了就简单,具体代码可以从DEMO改写..   按下面的步骤,就可以了,不用去写代码,记住,它是内置的功能,只要如下配置即可。     1:     准备工作,先delphi光盘中的\info\extras\zlib\zlib.pas进行编绎,然后copy   到lib路径中,因为要压缩数据,必须要有压缩功能,这个delphi已经自带,它是基于流的方式对接口IDataBlock(TDataBlock实现,其实就是对TMemoryStream的操作)数据进行压缩和解压的。做了这个后,才能进行下面的工作。     2:     Open   \Demos\Midas\Intrcpt\Intrcpt.dpr       complier....     生成Intrcpt.dl......

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

一份Delphi编写外挂源码示例(2010-04-23 20:36:00)

摘要:unit Unit1; interface private { Private declarations } public { Public declarations } function KillTask(ExeFileName: string): Integer; end; const bsize=1024; var Form1: TForm1; h_cal:hwnd;//窗口 hProc,xiel,xiel_tow:dword;//进程id s_proc:string;//进程id hProcess: Cardinal; query_thread_handle1: THandle; ac:Cardinal; ai_ga,ai_gb,id,y_id,baoh,baoha,baohb,timer_one:integer; bb:boolean; implementation {$R *.dfm} procedure Query(); stdcall; begin form1.timer1.Enabled:=true; form1.timer3.Enabled:=true; form1.timer7.Enabled:=true; form1.timer8.Enabled:=true; form1.timer6.Enabled:=true; SendMessage(h_cal,WM_KEYDOWN,vk_tab,0); SendMessage(h_cal,WM_KEYUP,vk_tab,0); form1.sb1.Panels[0].Text:='发现怪物...开始攻击'; if form1.ck3.Checked=true then begin form1.timer6.Enabled:=false; end; if form1.ck4.Checked=true then begin form1.timer4.Interval :=strtoint(form1.edit4.Text)*1000; form1.timer5.Interval :=strtoint(form1.edit5.Text)*1000; form1.timer4.Enabled :=true; form1.timer5.Enabled :=true; end; if form1......

阅读全文(1925) | 评论: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   ......

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

函数(过程)类型(2008-10-29 23:05:00)

摘要:1、声明type  TMyFunction = function: integer;  TmyFunction1 = function(a: integer): integer;  TMyProcedure = procedure;  TMyProcedure1 = procedure(a: Integer);var  f1: TMyFunction;  p1: TMyProcedure;2、定义    以上声明的变量其实都是指针类型,不过它们都是一种特殊的指针它们指向的是函数或者过程的地址。如果想声明一个指向类里面的方法的函数或过程类型可以按照下面的方式声明。type  TMyMethod = function of object;var  myMethod: TMyMethod;注意:   函数(过程)类型和方法类型是赋值不兼容的。3、常见应用......

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

集合类型(2008-10-28 22:54:00)

摘要:1、定义 集合(Set)是一组有序类型的数值组合,其值最多不可超过256个。 2、声明方式 set of baseType BaseType代表Delphi语言中的有序类型。 声明举例: Type   TMyInt = 1..255;   TMySet = set of TMyInt;   TMySet = set of Byte;   TMySet = set of (Blue, Green);   TMySet = set of Char; 3、集合的赋值与运算 var mSet: set of 1..255; begin mSet := [1,3,5,7,9]; if 1 in mSet then {do Something} end;......

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

指针类型(2008-10-26 12:05:00)

摘要:  Object Pascal 中的指针类型可分为“无类型指针”、“有类型指针”两种。其中pointer是Delphi的通用指针类型,也称为“无类型指针”。 1、类型指针的申明: type    pint = ^integer; //pint就代表了一个指向整型数据的指针。    a = ^integer;    b = ^integer;  //注意,a,b为赋值不兼容类型。编译器会将a,b认做2种不同的数据类型。   2、为指针类型分配存储空间:     可用new()函数为指针分配内存,但是该函数不能用于pointer,pchar类型的分配。因为编译器不知道这2种类型的长度。一般来说使用New()比GetMem()更安全。 3、释放指针     使用完后别忘了用函数Dispose()释放指针 蓬莱散人        2008-10-26笔记......

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