博文

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是不匹配的,所以就无法调试......

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

C#学习笔记开始继续更新(2010-07-24 15:39:00)

摘要:     6月换工作,从东莞跑到了上海。离家近多了,算是有点小开心吧。 工作暂时算稳定下了,可以挤出时间继续更新C#了。向追C#学习笔记的网友道歉,呵呵。......

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

读一读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......

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

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

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

有穷自动机_1(2010-04-20 21:34:00)

摘要:NFA(不确定的有限自动机)与DFA(确定的有限自动机) DFA的定义:    一个确定的有限自动机(DFA)M是一个五元组:M(S,∑,f,S0,Z)    S:代表一个有限状态集合。    ∑:代表一个字母表,它的每个元素称为一个输入字符。   f:代表......

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

正规文法转为正规式的规则(2010-04-20 21:09:00)

摘要:正规式:也叫正则表达式,它是一种表达正规集的工具。一个正规式对应一个正规文法。   正规文法转换成正规式:   规则1:A→xB,B→y               A→xy 规则2:A→xA|y                  A→x*y(*代表0到无穷个x)规则3:A→x,A→y                A→x|y......

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

编译原理中的文法类型(2010-04-20 19:59:00)

摘要:文法类型: 0型文法:对于推导式α→β,那么α∈(Vn∪Vt)*且至少含有一个非终结符,β∈(Vn∪Vt)*,则该推导式属于~。 1型文法:也叫上下文有关文法,此文法对应线性有界自动机。1型文法在0型文法的基础上满足|β|>=|α|,则该推导式属于~。||代表长度。 2型文法:也叫上下文无关文法,它对应下推自动机。2型文法在1型文法的基础上满足推导式(α→β)的左侧都是非终结符。 3型文法:也叫正规文法,它对应有限状态自动机。它在2型文法的基础上满足A→a|aB(一个非终结符推导出一个终结符或一个终结符带一个非终结符。右线性),A→a|Ba(左线性)。 |代表“或”的意思。......

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

堆排序(2010-04-15 22:49:00)

摘要:    什么是堆?     堆是以完全二叉树形式存储的一组数据。 堆排序步骤 1、建立堆     用层次遍历的方式将一组数值构建成一棵树。 2、调整堆      刚建立的树是未完成排序的,需要对构建好的树进行调整。这里需要先了解2个概念:      大顶堆,小顶堆。      什么是大顶堆、小顶堆呢?如果我们用层次遍历的方式从数值1开始依次对第一步建成的树的顶点给一个标号的话,那么大顶堆需要满足以下条件:1号顶点的值>=2号顶点的值>=3号顶点的值,如果顶点的标号用变量i表示的话可推导出以下公式:i>=2i>=2i+1。小顶堆则刚好相反,可表示为i<=2i<=2i+1。     虽然明白了上面的定义,但是现在还是不能下手对第一步构建的树进行调整。因为上面的定义只告诉了我们排序完成后的堆是什么样子的,还差了一把让我们动手的钥匙。     现在让我们来分析一下这把钥匙是什么?一个完全二叉树有以下特性:顶点总数/2+1的顶点是叶子节点,而且由于树的存储结构是单向的,叶子节点没有指向父节点的指针。所以要比较节点值大小的话一定要从一个父节点开始。如果一棵树的节点数为n的话,那我们就应该从n/2号顶点开始比较。但是假如n是一个奇数呢?那我们就直接取整。至于原因大家画一个5或9个节点的树分析一下就知道了。    好了正式动手,按大顶堆排序调整这棵树吧。方法如下:     1、假如有该父节点只有一个孩子节点,且父节点值>孩子节点。不用调整     2、假如有该父节点只有一个孩子节点,且父节点值<孩子节点。值互换     3、假如有该父节点有两个孩子节点,且父节点值>2个孩子节点。不用调整      4、假如有该父节点有两个孩子节点,且父节点值<2个孩子节点。和最大值的孩子......

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

常用内部排序算法及分类(2010-04-15 21:19:00)

摘要:1、插入排序(直接插入,希尔排序) 2、选择排序(简单选择,堆排序) 3、交换排序(冒泡,快速排序) 4、归并排序 5、基数排序......

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