摘要:
FASTREPORT的设计界面,保存的时候是生成扩展名为.fr3的文件来保存设计好的报表模板的。现在改为用数据表的BLOB字段来保存报表模板。 m :=TMemoryStream.Create; try Report.SaveToStream(m); f_printsetup.ClientDataSet1.Edit; tblobfield(f_printsetup.ClientDataSet1.FieldByName('rep')).LoadFromStream(m); f_printsetup.ClientDataSet1.Post; if RemoteMethod.Post 阅读全文
摘要:
1.字串统一使用WIDESTRING类型2.客户端调用适配器DLL时,参数传DELTA,不要传TCLIENTDATASET 阅读全文
摘要:
unit main;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, Menus, ExtCtrls, RemoteMethod ,DBClient, DB;type PNode = ^TNode; TNode = record id: string; cn: string; tw: string; en: string; dll: string; classname: WideString; dsc: string; pid:. 阅读全文
摘要:
客户端可以是D5~XE2任意版本的DELPHI来写。非常适合老系统升级。 阅读全文
摘要:
// 单元功用: 线程池// 单元设计: 陈新光// 设计日期: 2012-09-03unit ThreadPool;interfaceuses system.Classes, system.SyncObjs, system.SysUtils, system.DateUtils, GlobalVar, Vcl.Forms, Winapi.Windows;type TWorkThread = class(TThread) private FThreadMethod: TThreadMethod; Fsync: Boolean; FEvent: THandle; protected procedu 阅读全文
摘要:
单位时间内必须处理数目巨大的连接请求,但处理时间却相对较短。传统多线程方案中,一旦接受到请求之后,即创建一个新的线程,由该线程执行任务。任务执行完毕后,线程退出。这就是即时创建,即时销毁的策略。尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务执行时间很短,而且执行次数极其频繁,那么服务器将处于不停的创建线程,销毁线程的状态。t1: 线程创建时间t2: 线程执行时间,包括线程的同步等时间t3: 线程销毁时间线程本身的开销所占的比例为(t1+t3)/(t1+t2+t3)。如果线程执行的时间很短,这笔开销可能占到20%~50%左右。如果任务执行很频繁的话,这笔开销将是不可忽 阅读全文
摘要:
xe2 DATASNAP出来一年了。相信许多人同我一样领略它开发中间层的快捷(相对老的MIDAS确实简便了许多)。但苦于自己有许多的老系统是用DELPHI7甚至DELPHI6开发的,想用XE2开发的中间层升级,却不成。直接的话,它们确实是不兼容。还是那句话,既然直接的不行,咱就来间接的。使用桥接模式,正好可以解决问题。至少,我试过了,可以。思路是:使用XE2开发一个动态库,这个动态库负责SOCKET连接中间层,还有参数类型转换(主要是ANSISTRING和UNICODESTRING的问题),在这个桥接的动态库,这些全部都解决了。我测试的时候DELPHI7调用XE2 DATASNAP的中间层跑得 阅读全文
摘要:
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, ADODB, StdCtrls, ComCtrls, Grids, DBGrids;type PNodeRec=^TNodeRec; TNodeRec=record id: string; name: string; pid: string; end; TForm1 = class(TForm) TreeView1: TTreeView... 阅读全文
摘要:
生成一棵树方法一:procedure MakeTree(Query: TQuery; TreeView: TTreeView);var List: TStringList; Node: TTreeNode; Index: Integer;begin TreeView.Items.BeginUpdate; try TreeView.Items.Clear; List := TStringList.Create; try List.Sorted := True; while not Query.Eof do begin if ... 阅读全文
摘要:
关于延迟时间的一点智慧一般的做法:Sleep(2000); // 延迟2秒此种做法有俩个弊端:(1)如果实际需要的延迟时间不需要2秒,则明显有延迟时间浪费;(2)如果实际需要的延迟时间超过2秒,则很可能发生不可预料的错误。改进的做法: repeat Sleep(10); until FileExists('c:\temp\invoice.pdf')=True;优点:将一次大的延迟时间分割成小的,一旦条件成立就退出了延迟,使得延迟的时间同实际需要的几乎一样。也杜绝了前面第二种情况错误的发生。 阅读全文