博文
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是不匹配的,所以就无法调试......
C#学习笔记开始继续更新(2010-07-24 15:39:00)
摘要: 6月换工作,从东莞跑到了上海。离家近多了,算是有点小开心吧。
工作暂时算稳定下了,可以挤出时间继续更新C#了。向追C#学习笔记的网友道歉,呵呵。......
读一读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......
怎样在三层结构的系统中对应用程序服务器传出的数据压缩?(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......
一份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......
有穷自动机_1(2010-04-20 21:34:00)
摘要:NFA(不确定的有限自动机)与DFA(确定的有限自动机)
DFA的定义:
一个确定的有限自动机(DFA)M是一个五元组:M(S,∑,f,S0,Z)
S:代表一个有限状态集合。
∑:代表一个字母表,它的每个元素称为一个输入字符。 f:代表......
正规文法转为正规式的规则(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......
编译原理中的文法类型(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(左线性)。
|代表“或”的意思。......
堆排序(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个孩子节点。和最大值的孩子......
常用内部排序算法及分类(2010-04-15 21:19:00)
摘要:1、插入排序(直接插入,希尔排序)
2、选择排序(简单选择,堆排序)
3、交换排序(冒泡,快速排序)
4、归并排序
5、基数排序......
