|
摘要:ss[1]//var ss:String;和Pointer(ss)^是不是一个意思呢? 答:不是。ss[1]表示第一个字符。如:ss:='abc'则表示'a'。ss[0]=Length(ss);Pointer(ss)^ 和 @s 也不一样。就连 cc:PCharPointer(cc)^ 和 @cc 也不一样。 应用:一、发送字符串 或者 Record procedure SendStr(ss:String);var cds:TCopyDataStruct;hh:HWND;begin hh:=FindWindow('TfrmFYErpMsg',ni
阅读全文
摘要:一、override 重载type TFigure = class procedure Draw; virtual;//(我的理解是)父类中可以使用父类的,子类中使用子类的。与“四”是有区别的。 end; TRectangle = class(TFigure) procedure Draw; override;//a1 end; TEllipse = class(TFigure) procedure Draw; override;//a2 end;使用var Figure: TFigure;begin Figure := TRectangle.Create;...
阅读全文
摘要:今天用到压缩文件的问题,找了一些网上的资料,后来发现了delphi自身所带的zlib单元,根据例子稍微改变了一些,使它能够符合所有的格式。使用时,需要Zlib.pas和 Zlibconst.pas两个单元文件,这两个文件保存在 Delphi 5.0安装光盘上 InfoExtrasZlib目录下,此外,在 InfoExtrasZlibObj目录中还保存了 Zlib.pas单元引用的 Obj文件,把这个目录拷贝到delphi的lib下,即可。原来提供的例子是抓计算机屏幕,现在改成文件流,适应所有情况。也可以适当的改动比如增加目录压缩和分文件压缩,其实就是在文件流前面增加一部分描述结构就是,不多说。
阅读全文
摘要:TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的。TStringList 常用方法与属性:var List: TStringList; i: Integer;begin List := TStringList.Create; List.Add('Strings1'); {添加} List.Add('Strings2'); List.Exchange(0,1); {置换} List.Insert(0,'Strings3'); {插入} i := List.IndexOf('Strings1'); {...
阅读全文
摘要:操作方法:在RAD Studio XE5快捷方式上鼠标右击选择属性,在弹出的快捷方式标签页中将目标(T):"C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\bin\bds.exe"后面加参数-np,即启动时候不显示Welcomepage标签页。修改后的RAD Studio XE5快捷方式"C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\bin\bds.exe" -np修改后的Delphi XE5快捷方式"C:\Program Files
阅读全文
摘要:type TMenuHintWindow = class(THintWindow) private FTimerShow: TTimer; FTimerHide: TTimer; procedure TimerShowTimer(Sender: TObject); procedure TimerHideTimer(Sender: TObject); procedure ApplicationHint(Sender: TObject); public constructor Create(AOwner: TComponent); override; ...
阅读全文
摘要:(*//标题:无限进制处理说明:使用于数学领域进制之间相互转换和计算设计:Zswang日期:2005-01-15支持:wjhu111@21cn.com//*) uses Math; const cScaleChar: array[0..35] of Char = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; function StringToCharSet( //字符串集合 mString: string //源字符串): TSysCharSet; //返回字符串中包含的集合var I: Integer;begin Result := [];
阅读全文
摘要:今天有人问我:“用shell打开文件(显示桌面.scf)的方式还是用模拟键盘(Win+D)显示桌面”这应该有更好的方法,就搜了搜,关键字定位“ToggleDesktop”因为显示桌面.scf的内容是:[Shell]Command=2IconFile=explorer.exe,3[Taskbar]Command=ToggleDesktop找到了MSDNhttp://msdn.microsoft.com/en-us/library/bb774124(VS.85).aspx给出的是VB脚本和Javascript脚本,这个容易翻译:JavaScriptusesComObj;procedureTForm
阅读全文
摘要:unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, Grids; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; procedure Button1Click(Sender: TObject); private protected { Private declarations...
阅读全文
摘要://-------Delphi-------usesCommCtrl;procedureTForm1.Button1Click(Sender:TObject);varvHandle:THandle;vCount:Integer;I:Integer;vProcessID:THandle;vProcess:THandle;vNumberOfBytesRead:DWORD;vPointer:Pointer;vBuffer:array[0..255]ofChar;beginvHandle:=FindWindow('Shell_TrayWnd',nil);vHandle:=FindWin
阅读全文
摘要:主窗体unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,LongWaitTrd;type TForm1 = class(TForm) btnSetTask: TButton; btnExitThd: TButton; btnCreateTrd: TButton; procedure btnSetTaskClick(Sender: TObject); procedure btn...
阅读全文
摘要:在消息队列部分,我们已经知道消息泵是以线程为单位进行分离的!换句话说,有N个程序,都产生了相关事件,在系统消息队列中会根据线程来区分,当线程的消息泵从系统消息队列抽取消息时,会挑属于自己线程的消息。当我们创建一个工程时,IDE环境已经为我们生成了主线程的代码以及消息泵,而当我们自己创建一个Worker线程时,默认是没有消息泵的,如果想要在线程内接收消息,需要添加消息泵!消息泵的结构:whileGetMessage(Msg,0,0,0)dobegin TranslateMessage(Msg); DispatchMessage(Msg)end;另:要想在线程内响应消息,没有窗口是不行的所以要在线
阅读全文
摘要:在这里把网友常常搞不清楚的属性作用列出来:一、FreeOnTerminate用于表明线程执行完毕后是自动释放还是保留,默认为False二、Terminate该过程只是简单地设置线程类的Terminated标志,并不是真正的释放,这一点要格外注意!三、Synchronize该函数是同步方法,如果线程中有操作UI的语句时,需要把UI操作写成过程(无参数过程),放到该方法中!//这段代码是要用线程打印1-99,输出至Memo1中TThread1 = class(TThread) private FNum: Integer; procedure AddLines; protected ...
阅读全文
摘要:还是本着上篇文章的原则,只不过在Delphi中string有点特殊!先了解一下Delphi中的string1.string = AnsiString = 长字符串,理论上长度不受限制,但其实受限于最大寻址范围2的32次方=4G字节,变量Str名字是一个指针,指向位于堆内存的字符序列,字符序列起始于@Str[1],@Str[1]偏移负16个字节的空间存储着字串长度、引用计数等信息。字符序列以NULL结束。2.string[n] = ShortString = 短字符串,最多容纳255个字符,实际长度是字符长度+1,是Delphi的简单类型,Str[0]存储着字符的个数,第一个字符从Str[1]开
阅读全文
摘要:delphi编写指定时间不动鼠标将系统锁定/以及在不动的情况下隐藏鼠标3秒种不动鼠标键盘看看效果。GetLastInputInfo:获取闲置时间;ShowCursor:设置鼠标状态unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;type TForm1 = class(TForm) Timer1: TTimer; procedure Timer1Timer(Sender: TObject); ...
阅读全文
摘要:首先强调一点:任何数据在内存中都是线性存储的,归根结底都是由一个字节数组表示的!如:Integer占4个存储单元,32bit,在内存中他就是由一个长度为4的字节数组来表示!只不过在读取该类型时,系统帮我们根据不同的数据类型对数据进行捆绑读取(如果上学时学过汇编就可以想出,如果自己取的话需要把高地址的内容乘以某值后再加上低址的值)。值得注意的是:对于Delphi中的多维动态数组,不要用类似于内存复制的函数进行复制,如CopyMemory,Move等。因为多维动态数组的内存是不连续的!只要把握住这一原则,我想类型转换我就不多讲了//Word与ByteArr的互转一、从ByteArr转为Word(I
阅读全文
摘要:问题1:一般来说,要让你的线程能够尽快终止,必须在Execute方法中在较短的时间内不断地检查Terminated标志,以便能及时地退出。这是设计线程代码的一个很重要的原则!在这种情况下使用上述思路一般不会出什么问题!type TThread1 = class(TThread) private procedure Test(); protected procedure Execute; override; end;procedure TThread1.Execute;var i:Integer;begin FreeOnTerminate := True;//线程正常结束...
阅读全文
摘要:前一篇文章讲到非队列消息会直接把消息Dispatch到窗口函数上,窗口函数长什么样?//就是一个大case分支//要想拦截消息,override窗口函数是一个办法!procedure TCustomForm.WndProc(var Message: TMessage);var FocusHandle: HWND; SaveIndex: Integer; MenuItem: TMenuItem; Canvas: TCanvas; DC: HDC;begin with Message do case Msg of WM_ACTIVATE, WM_SETFOCUS, WM...
阅读全文
摘要:前一篇文章介绍了为何要共用内存管理器,有人要问可不可以在编写dll时更通用一些,可以兼顾其它编译器(如果是其它编译器的话,Delphi写的dll不能与其它语言共用内存管理器),采用一定的策略来避免在dll内创建RTL自动管理的数据类型做参数或返回值,这样其它非Delphi的开发语言也可以用了!完全可以!一般的策略如下:1.在主调函数中申请一块空间2.把这个空间的地址传送给dll3.dll内部进行逻辑运算,得到结果后把值添到主调函数传递过来的空间上4.主调函数获取值,根据业务规则对空间进行处理(释放等操作)在整个工作周期中,申请的内存一直掌握在主调函数的手中,没有给dll任何管理对象的机会!看一
阅读全文
摘要:看了MSDN后,以下是我个人的理解!消息能够被分为「队列化消息」和「非队列化消息」。队列化消息是指当程序发生某事件时,由Windows主动捕获并把消息放入系统消息队列中,而程序在运行时会初始化一个消息泵,该消息泵用于抽取系统消息队列中的与之相关的消息,并把之分发到相应窗口函数上!非队列化消息不走消息泵,而是直接分发到相应的窗口函数上!队列化消息基本上是使用者输入的结果,以击键(如WM_KEYDOWN和WM_KEYUP消息)、击键产生的字符(WM_CHAR)、鼠标移动(WM_MOUSEMOVE)和鼠标按钮(WM_LBUTTONDOWN)的形式给出。队列化消息还包含时钟消息(WM_TIMER)、更
阅读全文
|