阿杰 发表于 2009-7-26 14:52:14

【分享】Delphi编程技巧集锦(二)

<p><strong>◇截获WM_QUERYENDSESSION关机消息</strong> <br/>type <br/>TForm1 = class(TForm) <br/>procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION; <br/>procedure CMEraseBkgnd(var Message:TWMEraseBkgnd);Message WM_ERASEBKGND; <br/>private <br/>{ Private declarations } <br/>public <br/>{ Public declarations } <br/>end; <br/>procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession); <br/>begin <br/>Showmessage('computer is about to shut down'); <br/>end;</p>
<p><strong>◇得到硬盘序列号</strong> <br/>var SerialNum : pdword; a, b : dword; Buffer : array of char; <br/>begin <br/>if GetVolumeInformation('c:\', Buffer, SizeOf(Buffer), SerialNum, a, b, nil, 0) then Label1.Caption := IntToStr(SerialNum^); <br/>end;</p>
<p><strong>◇MEMO的自动翻页 <br/></strong>Procedure ScrollMemo(Memo : TMemo; Direction : char); <br/>begin <br/>case direction of <br/>'d': begin <br/>SendMessage(Memo.Handle, { HWND of the Memo Control } <br/>WM_VSCROLL, { Windows Message } <br/>SB_PAGEDOWN, { Scroll Command } <br/>0) { Not Used } <br/>end; <br/>'u' : begin <br/>SendMessage(Memo.Handle, { HWND of the Memo Control } <br/>WM_VSCROLL, { Windows Message } <br/>SB_PAGEUP, { Scroll Command } <br/>0); { Not Used } <br/>end; <br/>end; <br/>end; <br/>procedure TForm1.Button1Click(Sender: TObject); <br/>begin <br/>ScrollMemo(Memo1,'d'); //上翻页 <br/>end; <br/>procedure TForm1.Button1Click(Sender: TObject); <br/>begin <br/>ScrollMemo(Memo1,'u'); //下翻页 <br/>end;</p>
<p><strong>◇DBGrid中回车到下个位置(Tab键) <br/></strong>procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char); <br/>begin <br/>if Key = #13 then <br/>if DBGrid1.Columns.Grid.SelectedIndex &lt; DBGrid1.Columns.Count - 1 then <br/>DBGrid1.Columns.Field.FocusControl <br/>else <br/>begin <br/>Table1.next; <br/>DBGrid1.Columns.field.FocusControl; <br/>end; <br/>end;</p>
<p><strong>◇如何安装控件</strong> <br/>安装方法: <br/>1.对于单个控件,Component--&gt;install component..--&gt;PAS或DCU文件--&gt;install <br/>2.对于带*.dpk文件的控件包,File--&gt;open(下拉列表框中选*.dpk)--&gt;install即可. <br/>3.对于带*.dpl文件的控件包,Install Packages--&gt;Add--&gt;dpl文件名即可。 <br/>4.如果以上Install按钮为失效的话,试试Compile按钮。 <br/>5.是run time lib则在option下的packages下的runtimepackes加之. <br/>如果编译时提示文件找不到的话,一般是控件的安装目录不在delphi的Lib目录中,有两种方法可以解决: <br/>1.把安装的原文件拷入到delphi的Lib目录下。 <br/>2.或者Tools--&gt;Environment Options中把控件原代码路径加入到Delphi的Lib目录中即可。</p>
<p><strong>◇目录完全删除(deltree)</strong> <br/>procedure TForm1.DeleteDirectory(strDir:String); <br/>var <br/>sr: TSearchRec; <br/>FileAttrs: Integer; <br/>strfilename:string; <br/>strPth:string; <br/>begin <br/>strpth:=Getcurrentdir(); <br/>FileAttrs := faAnyFile; <br/>if FindFirst(strpth+'\'+strdir+'\*.*', FileAttrs, sr) = 0 then <br/>begin <br/>if (sr.Attr and FileAttrs) = sr.Attr then <br/>begin <br/>strfilename:=sr.Name; <br/>if fileexists(strpth+'\'+strdir+'\'+strfilename) then <br/>deletefile(strpth+'\'+strdir+'\'+strfilename); <br/>end; <br/>while FindNext(sr) = 0 do <br/>begin <br/>if (sr.Attr and FileAttrs) = sr.Attr then <br/>begin <br/>strfilename:=sr.name; <br/>if fileexists(strpth+'\'+strdir+'\'+strfilename) then <br/>deletefile(strpth+'\'+strdir+'\'+strfilename); <br/>end; <br/>end; <br/>FindClose(sr); <br/>removedir(strpth+'\'+strdir); <br/>end; <br/>end;</p>
<p><strong>◇取得TMemo 控件当前光标的行和列信息到Tpoint中</strong> <br/>1.function ReadCursorPos(SourceMemo: TMemo): TPoint; <br/>var Point: TPoint; <br/>begin <br/> point.y := SendMessage(SourceMemo.Handle,EM_LINEFROMCHAR,SourceMemo.SelStart,0); <br/> point.x := SourceMemo.SelStart-SendMessage(SourceMemo.Handle,EM_LINEINDEX,point.y,0); <br/> Result := Point; <br/>end; <br/>2.LineLength:=SendMessage(memol.handle,EM-LINELENGTH,Cpos,0);//行长</p>
<p><strong>◇读硬盘序列号</strong> <br/>function GetDiskSerial(DiskChar: Char): string; <br/>var <br/>SerialNum : pdword; <br/>a, b : dword; <br/>Buffer : array of char; <br/>begin <br/>result := ""; <br/>if GetVolumeInformation(PChar(diskchar+":\"), Buffer, SizeOf(Buffer), SerialNum, <br/>a, b, nil, 0) then <br/> Result := IntToStr(SerialNum^); <br/>end;</p>
<p><strong>◇CSS常用综合技巧 <br/></strong>1。P:first-letter { font-size: 300%; float: left }//首字会比普通字体加大三倍。 <br/>2。//连接一个外部样式表 <br/>3。嵌入一个样式表 <br/>4。 //内联样式 <br/>Arial//SPAN接受STYLE、CLASS和ID属性</p>
<p>DIV可以包含段落、标题、表格甚至其它部分</p>
<p>5。CLASS属性 <br/>//定义见3。 <br/>6。ID属性 <br/>//定义见3。 <br/>7。属性列表 <br/>字体风格:font-style: ; <br/>字体大小:font-size: <br/>文本修饰:text-decoration:[ underline || overline || line-through || blink ] <br/>文本转换:text-transform: <br/>背景颜色:background-color:[&lt;颜色&gt; | transparent] <br/>背景图象:background-image:[ | none] <br/>行高:line-height: <br/>边框样式:border-style: [ none | dotted | dashed | solid | double | groove | ridge | inset | outset ] <br/>漂浮:float: <br/>8。长度单位 <br/>相对单位: <br/>em (em,元素的字体的高度) <br/>ex (x-height,字母 "x" 的高度) <br/>px (像素,相对于屏幕的分辨率) <br/>绝对长度: <br/>in (英寸,1英寸=2.54厘米) <br/>cm (厘米,1厘米=10毫米) <br/>mm (米) <br/>pt (点,1点=1/72英寸) <br/>pc (帕,1帕=12点)</p>
<p><strong>◇VCL制作简要步骤</strong> <br/>1.创建部件属性方法事件 <br/>(建立库单元,继承为新的类型,添加属性、方法、事件,注册部件,建立包文件) <br/>2.消息处理 <br/>3.异常处理 <br/>4.部件可视</p>
<p><strong>◇动态连接库的装载 <br/></strong>静态装载:procedure name;external 'lib.dll'; <br/>动态装载:var handle:Thandle; <br/>handle:=loadlibrary('lib.dll'); <br/>if handle&lt;&gt;0 then <br/>begin <br/>{dosomething} <br/>freelibrary(handle); <br/>end;</p>
<p><strong>◇指针变量和地址</strong> <br/>var x,y:integer;p:^integer;//指向INTEGER变量的指针 <br/>x:=10;//变量赋值 <br/>p:=@x;//变量x的地址 <br/>y:=p^;//为Y赋值指针P <br/>@@procedure//返回过程变量的内存地址</p>
<p><strong>◇判断字符是汉字的一个字符</strong> <br/>ByteType('你好haha吗',1) = mbLeadByte//是第一个字符 <br/>ByteType('你好haha吗',2) = mbTrailByte//是第二个字符 <br/>ByteType('你好haha吗',5) = mbSingleByte//不是中文字符</p>
<p><strong>◇memo的定位操作</strong> <br/>memo1.lines.delete(0)//删除第1行 <br/>memo1.selstart:=10//定位10字节处</p>
<p><strong>◇获得双字节字符内码</strong> <br/>function getit(s: string): integer; <br/>begin <br/>Result := byte(s) * 0 + byte(s); <br/>end; <br/>使用:getit('计')//$bcc6 即十进制 48326</p>
<p><strong>◇调用ADD数据存储过程</strong> <br/>存储过程如下: <br/>create procedure addrecord( <br/>record1 varchar(10) <br/>record2 varchar(20) <br/>) <br/>as <br/>begin <br/>insert into tablename (field1,field2) values(:record1,:record2) <br/>end <br/>执行存储过程: <br/>EXECUTE procedure addrecord("urrecord1","urrecord2")</p>
<p><strong>◇将文件存到blob字段中</strong> <br/>function blobcontenttostring(const filename: string):string; <br/>begin <br/>with tfilestream.create(filename,fmopenread) do <br/>try <br/>setlength(Result,size); <br/>read(Pointer(Result)^,size); <br/>finally <br/>free; <br/>end; <br/>end; <br/>//保存字段 <br/>begin <br/>if (opendialog1.execute) then <br/>begin <br/>sFileName:=OpenDialog1.FileName; <br/>adotable1.edit; <br/>adotable1.fieldbyname('visio').asstring:=Blobcontenttostring(FileName); <br/>adotable1.post; <br/>end;</p>
<p><strong>◇把文件全部复制到剪贴板 <br/></strong>uses shlobj,activex,clipbrd; <br/>procedure Tform1.copytoclipbrd(var FileName:string); <br/>var <br/>FE:TFormatEtc; <br/>Medium: TStgMedium; <br/>dropfiles:PDropFiles; <br/>pFile:PChar; <br/>begin <br/>FE.cfFormat := CF_HDROP; <br/>FE.dwAspect := DVASPECT_CONTENT; <br/>FE.tymed := TYMED_HGLOBAL; <br/>Medium.hGlobal := GlobalAlloc(GMEM_SHARE or GMEM_ZEROINIT, SizeOf(TDropFiles)+length(FileName)+1); <br/>if Medium.hGlobal&lt;&gt;0 then begin <br/>Medium.tymed := TYMED_HGLOBAL; <br/>dropfiles := GlobalLock(Medium.hGlobal); <br/>try <br/>dropfiles^.pfiles := SizeOf(TDropFiles); <br/>dropfiles^.fwide := False; <br/>longint(pFile) := longint(dropfiles)+SizeOf(TDropFiles); <br/>StrPCopy(pFile,FileName); <br/>Inc(pFile, Length(FileName)+1); <br/>pFile^ := #0; <br/>finally <br/>GlobalUnlock(Medium.hGlobal); <br/>end; <br/>Clipboard.SetAsHandle(CF_HDROP,Medium.hGlobal); <br/>end; <br/>end;</p>
<p><strong>◇列举当前系统运行进程</strong> <br/>uses TLHelp32; <br/>procedure TForm1.Button1Click(Sender: TObject); <br/>var lppe: TProcessEntry32; <br/>found : boolean; <br/>Hand : THandle; <br/>begin <br/>Hand := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0); <br/>found := Process32First(Hand,lppe); <br/>while found do <br/>begin <br/>ListBox1.Items.Add(StrPas(lppe.szExeFile)); <br/>found := Process32Next(Hand,lppe); <br/>end; <br/>end;</p>
<p><strong>◇根据BDETable1建立新表Table2 <br/></strong>Table2:=TTable.Create(nil); <br/>try <br/>Table2.DatabaseName:=Table1.DatabaseName; <br/>Table2.FieldDefs.Assign(Table1.FieldDefs); <br/>Table2.IndexDefs.Assign(Table1.IndexDefs); <br/>Table2.TableName:='new_table'; <br/>Table2.CreateTable(); <br/>finally <br/>Table2.Free(); <br/>end;</p>
<p><strong>◇最菜理解DLL建立和引用</strong> <br/>//先看DLL source(FILE--&gt;NEW--&gt;DLL) <br/>library project1; <br/>uses <br/>SysUtils, Classes; <br/>function addit(f:integer;s:integer):integer;export; <br/>begin <br/>makeasum:=f+s; <br/>end; <br/>exports <br/>addit; <br/>end. <br/>//调用(IN ur PROJECT) <br/>implementation <br/>function addit(f:integer;s:integer):integer;far;external 'project1';//申明 <br/>{调用就是addit(2,4);结果显示6}</p>
<p><strong>◇动态读取程序自身大小</strong> <br/>function GesSelfSize: integer; <br/>var <br/>f: file of byte; <br/>begin <br/>filemode := 0; <br/>assignfile(f, application.exename); <br/>reset(f); <br/>Result := filesize(f);//单位是字节 <br/>closefile(f); <br/>end;</p>
<p><strong>◇读取BIOS信息</strong> <br/>with Memo1.Lines do <br/>begin <br/>Add('MainBoardBiosName:'+^I+string(Pchar(Ptr($FE061)))); <br/>Add('MainBoardBiosCopyRight:'+^I+string(Pchar(Ptr($FE091)))); <br/>Add('MainBoardBiosDate:'+^I+string(Pchar(Ptr($FFFF5)))); <br/>Add('MainBoardBiosSerialNo:'+^I+string(Pchar(Ptr($FEC71)))); <br/>end;</p>
<p><strong>◇动态建立MSSQL别名</strong> <br/>procedure TForm1.Button1Click(Sender: TObject); <br/>var MyList: TStringList; <br/>begin <br/>MyList := TStringList.Create; <br/>try <br/>with MyList do <br/>begin <br/>Add('SERVER NAME=210.242.86.2'); <br/>Add('DATABASE NAME=db'); <br/>Add('USER NAME=sa'); <br/>end; <br/>Session1.AddAlias('TESTSQL', 'MSSQL', MyList); // ミMSSQL <br/>Session1.SaveConfigFile; <br/>finally <br/>MyList.Free; <br/>Session1.Active:=True; <br/>Database1.DatabaseName:='DB'; <br/>Database1.AliasName:='TESTSQL'; <br/>Database1.LoginPrompt:=False; <br/>Database1.Params.Add('USER NAME=sa'); <br/>Database1.Params.Add('PASSWORD='); <br/>Database1.Connected:=True; <br/>end; <br/>end; <br/>procedure TForm1.Button2Click(Sender: TObject); <br/>begin <br/>Database1.Connected:=False; <br/>Session1.DeleteAlias('TESTSQL'); <br/>end;</p>
<p><strong>◇播放背景音乐</strong> <br/>uses mmsystem <br/>//播放音乐 <br/>MCISendString('OPEN e:.MID TYPE SEQUENCER ALIAS NN', '', 0, 0); <br/>MCISendString('PLAY NN FROM 0', '', 0, 0); <br/>MCISendString('CLOSE ANIMATION', '', 0, 0); <br/>end; <br/>//停止播放 <br/>MCISendString('OPEN e:.MID TYPE SEQUENCER ALIAS NN', '', 0, 0); <br/>MCISendString('STOP NN', '', 0, 0); <br/>MCISendString('CLOSE ANIMATION', '', 0, 0);</p>
<p><strong>◇接口和类的一个范例代码 <br/></strong>Type{接口和类申明:区别在于不能在接口中申明数据成员、任何非公有的方法、公共方法不使用PUBLIC关键字} <br/>Isample=interface//定义Isample接口 <br/>function getstring:string; <br/>end; <br/>Tsample=class(TInterfacedObject,Isample) <br/>public <br/>function getstring:string; <br/>end; <br/>//function定义 <br/>function Tsample.getstring:string; <br/>begin <br/>result:='what show is '; <br/>end; <br/>//调用类对象 <br/>var sample:Tsample; <br/>begin <br/>sample:=Tsample.create; <br/>showmessage(sample.getstring+'class object!'); <br/>sample.free; <br/>end; <br/>//调用接口 <br/>var sampleinterface:Isample; <br/>sample:Tsample; <br/>begin <br/>sample:=Tsample.create; <br/>sampleInterface:=sample;//Interface的实现必须使用class <br/>{以上两行也可表达成sampleInterface:=Tsample.create;} <br/>showmessage(sampleInterface.getstring+'Interface!'); <br/>//sample.free;{和局部类不同,Interface中的类自动释放} <br/>sampleInterface:=nil;{释放接口对象} <br/>end;</p>
<p><strong>◇任务条就看不当程序</strong> <br/>var <br/>ExtendedStyle : Integer; <br/>begin <br/>Application.Initialize; <br/>ExtendedStyle := GetWindowLong (Application.Handle, GWL_EXSTYLE); <br/>SetWindowLong(Application.Handle, GWL_EXSTYLE, ExtendedStyle OR WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW); <br/>Application.CreateForm(TForm1, Form1); <br/>Application.Run; <br/>end.</p>
<p><strong>◇ALT+CTRL+DEL看不到程序</strong> <br/>在implementation后添加声明: <br/>function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall; external 'KERNEL32.DLL'; <br/>RegisterServiceProcess(GetCurrentProcessID, 1);//隐藏 <br/>RegisterServiceProcess(GetCurrentProcessID, 0);//显示</p>
<p><strong>◇检测光驱符号 <br/></strong>var drive:char; <br/>cdromID:integer; <br/>begin <br/>for drive:='d' to 'z' do <br/>begin <br/>cdromID:=GetDriveType(pchar(drive+':\')); <br/>if cdromID=5 then showmessage('你的光驱为:'+drive+'盘!'); <br/>end; <br/>end;</p>
<p><strong>◇检测声卡</strong> <br/>if auxGetNumDevs()&lt;=0 then showmessage('No soundcard found!') else showmessage('Any soundcard found!');</p>
<p><strong>◇在字符串网格中画图</strong> <br/>StringGrid.OnDrawCell事件 <br/>with StringGrid1.Canvas do <br/>Draw(Rect.Left, Rect.Top, Image1.Picture.Graphic);</p>
<p><strong>◇SQL中代替Like语句的另一种写法</strong> <br/>比如查找用户名包含有"c"的所有用户, 可以用 <br/>use mydatabase <br/>select * from table1 where username like'%c%" <br/>下面是完成上面功能的另一种写法: <br/>use mydatabase <br/>select * from table1 where charindex('c',username)&gt;0 <br/>这种方法理论上比上一种方法多了一个判断语句,即&gt;0, 但这个判断过程是最快的, 我想信80%以上的运算都是花在查找字 <br/>符串及其它的运算上, 所以运用charindex函数也没什么大不了. 用这种方法也有好处, 那就是对%,|等在不能直接用like <br/>查找到的字符中可以直接在这charindex中运用, 如下: <br/>use mydatabase <br/>select * from table1 where charindex('%',username)&gt;0 <br/>也可以写成: <br/>use mydatabase <br/>select * from table1 where charindex(char(37),username)&gt;0 <br/>ASCII的字符即为%</p>
<p><strong>◇SQL显示多数据库/表</strong> <br/>SELECT DISTINCT A.bianhao,a.xingming, b.gongzi FROM "jianjie.dbf" a, "gongzi.DBF" b <br/>WHERE A.bianhao=b.bianhao</p>
<p><strong>◇RFC(Request For Comment)相关</strong> <br/>IETF(Internet Engineering Task Force)维护RFC文档<a href="http://www.ietf.cnri.reston.va.us/">http://www.ietf.cnri.reston.va.us</a> <br/>RFC882:报文头标结构 <br/>RFC1521:MIME第一部分,传输报文方法 <br/>RFC1945:多媒体文档传输文档</p>
<p><strong>◇TNMUUProcessor的使用</strong> <br/>var inStream,outStream:TFileStream; <br/>begin <br/>inStream:=TFileStream.create(infile.txt,fmOpenRead); <br/>outStream:=TFileStream(outfile.txt,fmCreate); <br/>NMUUE.Method:=uuCode;{UUEncode/Decode} <br/>//NMUUE.Method:=uuMIME;{MIME} <br/>NMUUE.InputStream:=InStream; <br/>NMUUE.OutputStream:=OutStream; <br/>NMUUE.Encode;{编码处理} <br/>//NMUUE.Decode;{解码处理} <br/>inStream.free; <br/>outStream.free; <br/>end;</p>
<p><strong>◇TFileStream的操作</strong> <br/>//从文件流当前位置读count字节到缓冲区BUFFER <br/>function read(var buffer;count:longint):longint;override; <br/>//将缓冲区BUFFER读到文件流中 <br/>function write(const buffer;count:longint):longint;override; <br/>//设置文件流当前读写指针为OFFSET <br/>function seek(offset:longint;origin:word):longint;override; <br/>origin={soFromBeginning,soFromCurrent,soFromEnd} <br/>//从另一文件流中当前位置复制COUNT到当前文件流当前位置 <br/>function copyfrom(source:TStream;count:longint):longint; <br/>//读指定文件到文件流 <br/>var myFStream:TFileStream; <br/>begin <br/>myFStream:=TFileStream.create(OpenDialog1.filename,fmOpenRead); <br/>end; <br/>检测是否安装IE插件Shockwave&amp;Quicktime <br/>var myPlugin = navigator.plugins["Shockwave"]; <br/>if (myPlugin) <br/>document.writeln("你已经安装了 Shockwave!") <br/>else <br/>document.writeln("你尚未安装 Shockwave!")</p>
<p>var myPlugin = navigator.plugins["Quicktime"]; <br/>if (myPlugin) <br/>document.writeln("你已经安装了Quicktime!") <br/>else <br/>document.writeln("你尚未安装 Quicktime!")</p>

eye0eye 发表于 2009-7-29 14:03:06

<p>好东西。学习中!</p>

upring 发表于 2015-6-6 13:10:45

支持阿杰整理分享
页: [1]
查看完整版本: 【分享】Delphi编程技巧集锦(二)