随笔分类 - Delphi
摘要:unit uThreadPool;{ aPool.AddRequest(TMyRequest.Create(RequestParam1, RequestParam2, ...)); }interfaceuses Windows, Classes;// 是否记录日志// {$DEFINE NOLOGS}type TCriticalSection = class(TObject) protected FSection: TRTLCriticalSection; public constructor Create; destructor Destroy; override; // 进入临界区 pro
阅读全文
摘要:procedure ThreadTest;stdcall;var Handles:TWOHandleArray; //Handle:THandle; Test:TTest; i:Integer;begin for i := 0 to 10 do begin Test := TTest.Create(False); Handles[i] := Test.Handle; end; WaitForMultipleObjects( 11, @Handles, True, INFINITE ); Form1.mmo1.Lines.Add( '123' );end;procedure TF
阅读全文
摘要:用TThread以数组的方式做了个线程池,但在TThread中需要累加一个数值,如果未使用互斥量的话,那个数值可能一直累加不上去。分别参考了http://www.cnblogs.com/railgunman/archive/2010/11/06/1870867.html和http://www.cnblogs.com/del/archive/2009/02/13/1390295.html,可以通过Win32函数CreateMutex和使用Delphi的TMutex来实现。一、CreateMutex实现方法1. 首先在主窗体中创建一个全局变量hMutex:THandle;2. 接着分别在主窗体的C
阅读全文
摘要:09年我在这个问题上折腾了大半年,还因此写了篇博文[这下该不会阻塞了吧],最初的是想实现多线程下载网页源码,但经过对HTTP协议的学习,发现只有支持断点继传的网站才用得上多线程下载,因此又把需求放在批量快速下载网页源码上,比如我同时需要访问100个网页,如果用IdHttp就头大了,Idhttp就连访问302页面也会出现异常,调试起来很麻烦。而用自己写的TWinHttp类,recv函数阻塞的问题是能解决了,但如果短时间频繁的获取网页源码,50%以上的访问都会出现connect失败和recv超时,以前很难解决的问题,这次却让我想到了一个较好的解决办法。首先,对于connect,如果连接失败就进入死
阅读全文
摘要:var IP:TCnIp; i:Integer; CurIP:string;begin IP := TCnIp.Create(nil); IP.IPAddress := '192.168.0.1'; CurIP := IP.IPAddress; while CurIP <> '192.168.255.255' do begin mmo1.Lines.Add( CurIP ); CurIP := IP.NextIP( CurIP ); end; IP.Free;end;经测试,cnvcl的CnIP类占用资源严重。测试的方法为创建一个线程池,每个线程执行
阅读全文
摘要:以前在VC中使用过MySQL,当时是找的一个现成的C++ MySQL类。最近在Delphi中又需要操作Mysql,最初找了个封闭过的类,但已经是七八年以前的程序了,我机器上装的是MySQl5.1,使用了5.1中的libmySQL.dll(2.25MB)。连接正常、查询一个字段正常,但查询两个字段就只能获取第一个字段的值,读第二个字段的值就程序异常。没办法,又重新找了个接口,不过没有封闭,只有自己慢慢学着调用了。http://www.audio-data.de/mysql.htmlDelphi Versions: (3), (4), 5, 6, 2007, 2009, 2010.LibMySql
阅读全文
摘要://声明:IsIconic( hWnd: HWND {窗口句柄}): BOOL;IsZoomed( hWnd: HWND {窗口句柄}): BOOL;
阅读全文
摘要:DrawText( Canvas.Handle, PChar( s ), Length( s ), rect, DT_WORDBREAK );
阅读全文
摘要:时间很完了,但问题总算解决了。在一个程序中需要判断WebBrowser打开的页面是否加载完成,通常的做完是使用Busy属性,代码如下:while WebBrowser1.Busy do Application.ProcessMessages;这个访问对于访问纯Html的页面时是一点儿问题都没有的,但有些页面在设计时为了不影响打开速度,是让html代码优先显示,然后再运行js代码或框架代码,由于我要访问的页面中没有调用框架页面,所以没作测试。经过一夜的摸索,最终找到了解决办法:procedure TForm1.wb1ProgressChange(Sender: TObject; Progress
阅读全文
摘要://CMD 要执行的文件路径//Visiable 是否显示窗口Function WinExecExW(CMD:Pchar; Visiable:integer):DWORD;var StartupInfo : TStartupInfo; ProcessInfo : TProcessInformation;begin FillChar( StartUpInfo, SizeOf(StartUpInfo), $00 ); StartUpInfo.dwFlags := STARTF_USESHOWWINDOW; StartUpInfo.wShowWindow := SW_HIDE; if CreateP
阅读全文
摘要:function TRATServer.GetDefaultBrowser:string;//获取默认浏览器varreg: TRegistry;beginreg := TRegistry.Create;tryreg.RootKey := HKEY_CLASSES_ROOT;reg.OpenKey(‘HTTP\shell\open\ddeexec\Application’,false);result:=reg.ReadString(”);reg.CloseKey;finallyreg.Free;end;end;
阅读全文
摘要:在主窗体的OnCreat事件中加入下列代码:varC: HCURSOR;beginC := LoadCursor(0, IDC_HAND);if C <> 0 then Screen.Cursors[crHandPoint] := C;end;
阅读全文
摘要:控件事件顺序:先执行DragOver事件,后执行DragDrop事件var ListItem:TListItem; procedure TForm1.ListView1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin Accept := true; ListItem:=ListView1.Selected; end; procedure TForm1.ListView1DragDrop(Sender, Source: TObject; X, Y: Int
阅读全文
摘要:PerlRegex一直用得很顺手,但今天晚上却老是出现堆栈溢出的问题,调整了Delphi 的Max stack size后,仍然解决不了。后来发现是正则表达式的问题,具体细节问题还不太清楚我一般使用“((.|\n)+?)”来匹配多行文本,而出现堆栈溢出的地方就是因为我使用了这个正则表达式,后将“((.|\n)+?)”改为“(.+?)”,并设置PerlRegex的Option为[preMuiLine]后问题解决。
阅读全文
摘要:正 文:今天在编译Delphi程序时,执行一个内存记忆体的时候,提示:Project.exeraisedexceptionclassEStackOverflowwithmessage:Stackoverflow.这是堆栈溢出错误。 原因就是字符串所存储的内容超过DELPHI系统堆栈默认的大小16*100000。我们可以改大这个默认值。 那么如何给我们的应用程序分配更大的内存空间以避免堆栈溢出呢?其实,在每个Delphi项目中都有一个设置应用程序内存大小的地方。 解决方法: 点击Project菜单中->Options->Linker->Memorysizes->按照需要,
阅读全文
摘要:TNND,看上了Delphi方便的界面设计以及丰富的第三方控件,才用上了Delphi。用了几个月后才发现,这些第三方控件都是浮云。其实早就听人说,慎用Delphi的第三方控件,使用第三方控件可能会出现些莫名其妙的问题,所以对第三方控件也比较警惕。到目前为止,用得最多的是ICS这个组件包,而且经常用到的也只是其中的HttpCli控件。但这几天发现程序里有内存泄漏,自己一直不知道是什么原因,查了半天才发现是HttpCli的问题。连这个开发了多年的第三方控件都有这样的问题,对其它第三方控件就不报什么希望了。到头来还不如用VC。
阅读全文
摘要:由于要为ListView控件添加一些功能,所以就新建了一个类来扩展ListView的功能。在自己创建的这个类里,添加的第一个事件是MouseMove,这个事件我在类中的声明为:procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;随后添加实现函数:procedure TMyListView.MouseMove(Shift: TShiftState; X, Y: Integer);begin inherited MouseMove(Shift, X, Y);end;经过测试,自定义的类可以响应MouseMove消息,但随
阅读全文
摘要:unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TURLLabel = class(TLabel) procedure WndProc(var Message : TMessage); override; end; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } p
阅读全文
摘要:我不明白为何 Borland 的 Delphi 控制不支持 mouse leave 事件.下面是一个简易的例子,它不仅示范了怎样让 TIamge 控制实现 MouseLeave 事件,而且也示范了怎么样建立一个简单的 Delphi 构件.{Delphi 编程新手注意的问题:本例是一个 Pascal 单元,请用 MyImg.pas 保存此单元.例子中的方法可应用于其它控制,所以你可以用 TLabel 或 TButton 等其它类来代替 TImage.}unit MyImg; interface uses Windows, Messages, SysUtils, Classes, Graphics
阅读全文
摘要:一个很简单的问题,但我凭我学习C++/VC一年多,接触Delphi的时间也不短了,但仍然写不出来。本来以为,不就是将Form1.Show和Form1.Hide么,但却就是达到不到自己想要的结果这个问题倒不用作深入研究了,到是让我发现,Delphi也不是信手摘来,什么都是那么容易的,以为自己有点儿VC的底子,就小看了Delphi。最近一段时间一直在用Delphi,但却没什么长进,看来是没有经过系统的学习。下面是Delphi显示和隐藏窗体的代码:隐藏: Application.Minimize(); ShowWindow(application.Handle,SW_HIDE); 显示: ShowW
阅读全文

浙公网安备 33010602011771号