<p>//获取任务栏尺寸 <br />procedure TForm1.Button1Click(Sender: TObject); <br />var <br />TaskList: HWnd; <br />Bordered: TRect; <br />begin <br />TaskList := FindWindow(’Shell_TrayWnd’, nil); <br />GetWindowRect(TaskList, Bordered); <br />Label1.Caption := ’Left: ’ + IntToStr(Bordered.Left); <br />Label2.Caption := ’Right: ’ + IntToStr(Bordered.Right); <br />Label3.Caption := ’Top: ’ + IntToStr(Bordered.Top); <br />Label4.Caption := ’Bottom: ’ + IntToStr(Bordered.Bottom); <br />end; <br /><br /><br />//修改指定路径下的文件只读属性 <br />function PathSetAttr(sFilePath: string): Boolean; <br />var <br />SearchRec: TSearchRec; <br />begin <br />Result := False; <br />if Copy(sFilePath, Length(sFilePath) - 1, Length(sFilePath)) <> ’\’ then <br /> sFilePath := sFilePath + ’\’; <br />if DirectoryExists(sFilePath) then <br />begin <br /> if FindFirst(sFilePath+’*.*’, faAnyFile, SearchRec) = 0 then <br /> begin <br /> FileSetAttr(SearchRec.Name, 32); <br /> while FindNext(SearchRec) = 0 do <br /> FileSetAttr(SearchRec.Name, 32); <br /> end; <br /> Result := True; <br />end; <br />end; <br /><br /><br />//为控件加边框 <br />procedure WMNCPaint(var Msg: TWMNCPaint); message WM_NCPAINT; <br /><br />procedure TForm1.WMNCPaint(var Msg: TWMNCPaint); <br />var <br />dc: hDC; <br />Pen: hPen; <br />OldPen: hPen; <br />OldBrush: hBrush; <br />begin <br />inherited; <br />dc := GetWindowDC(Handle); <br />msg.Result := 1; <br />Pen := CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); <br />OldPen := SelectObject(dc, Pen); <br />OldBrush := SelectObject(dc, GetStockObject(NULL_BRUSH)); <br />Rectangle(dc, 0, 0, Self.Width, Self.Height); <br />SelectObject(dc, OldBrush); <br />SelectObject(dc, OldPen); <br />DeleteObject(Pen); <br />ReleaseDC(Handle, Canvas.Handle); <br />end; <br /><br /><br />//制作透明窗体 <br />procedure CreateParams(var Params: TCreateParams); override; //重载 CreateParams 过程的实现 <br /><br />procedure TForm1.CreateParams(var Params: TCreateParams); <br />begin <br />//先继承原来的 CreateParams 过程 <br />inherited; <br />//然后修改 Param.ExStyle 的值,使窗体具有透明效果 <br />Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT; <br />end; <br /><br />procedure TForm1.FormCreate(Sender: TObject); <br />begin <br />inherited; <br />//将画布的笔刷样式改成 bsClear 以及时清除窗体原来的内容,这样窗体就有透明效果 <br />Canvas.Brush.Style := bsClear; <br />end; <br /><br /><br />//Memo 组件的光标定位 <br />procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton; <br />Shift: TShiftState; X, Y: Integer); <br />var <br />Lpos, Cpos, Linelength: integer; <br />begin <br />Lpos := SendMessage(Memo1.Handle, EM_LineFromChar, Memo1.SelStart, 0); <br />Cpos := SendMessage(Memo1.Handle, EM_LineIndex, Lpos, 0); <br />LineLength := SendMessage(Memo1.Handle, EM_LineLength, Cpos, 0); <br />Cpos := Memo1.SelStart - Cpos; <br />Label1.Caption := IntToStr(Lpos); <br />Label2.Caption := IntToStr(Cpos); <br />Label3.Caption := IntToStr(LineLength); <br />end; <br /><br />//点击客户区也能拖动窗口 <br />procedure WmNCHitTest(var Msg: TWMNCHitTest); message WM_NCHitTest; <br /><br />procedure TForm1.WmNCHitTest(var Msg: TWMNCHitTest); <br />begin <br />DefaultHandler(Msg); <br />if Msg.Result = HTClient then <br /> Msg.Result := HTCaption; <br />end; <br /><br /><br />//自定义Memo控件的边界 <br />procedure TForm1.Button1Click(Sender: TObject); <br />var <br />Rect: TRect; <br />begin <br />SendMessage(Memo1.Handle, EM_GETRECT, 0, LongInt(@Rect)); <br />Rect.Left := 20; <br />Rect.Top := 20; <br />Rect.Right := Rect.Right - 19; <br />Rect.Bottom := Rect.Bottom - 19; <br />SendMessage(Memo1.Handle, EM_SETRECT, 0, LongInt(@Rect)); <br />Memo1.Refresh; <br />end; <br /><br /><br />//在系统菜单上添加自定义菜单项 <br />procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND; <br /><br />const <br />idMyFunc = $f200; <br /><br />procedure TForm1.FormCreate(Sender: TObject); <br />begin <br />AppendMenu(GetSystemMenu(Handle, False), MF_STRING, idMyFunc, ’我的系统菜单项’); <br />end; <br /><br />procedure TForm1.WMSysCommand(var Msg: TWMSysCommand); <br />begin <br />inherited; <br />if Msg.CmdType and $FFF0 = idMyFunc then <br /> ShowMessage(’我的系统菜单项’); <br />end; <br /></p><p> </p><p>COOLBAR内嵌TOOLBAR,但是TOOLBAR的按钮偏上的解决办法:把COOLBAR的COOLBAND的BORDERSTYLE设为SINGLE。 <br />另外,如果想把主菜单弄到TOOLBAR里面,只要把TOOLBAR的MENU设为主菜单名,并把主菜单的AUTOMERGE设为TRUE即可。 <br />------------------------------------ <br /><br />listbox从文件中读取列表的操作 <br />ListBox1.Items.LoadFromFile(ExtractFilePath(Application.ExeName)+’aaa.txt’); <br />ListBox1.Items.Add(Edit1.Text); //添加了一个项目 <br />ListBox1.Items.SaveToFile(ExtractFilePath(Application.ExeName)+’aaa.txt’); <br /><br />删除项目ListBox1.Items.Delete(listbox1.itemindex); <br /><br />------------------------------------ <br /><br />判断窗体是否已经打开 <br />if frmPriceInput <> nil then .... <br />注意:有时窗体虽然已经关闭,但没完全释放,最好在该窗体关闭的CLOSE事件里加入 frmPrintInput = nil; <br />------------------------------------ <br />关闭MDI子窗口的方法 <br />在子窗口的OnClose事件处理过程中加入如下代码 <br />Action := caFree; <br /><br />Delphi为一个Form的关闭行为指定了四种方式,分别是: <br /><br />caNone -- 禁止Form被关闭 <br />caHide -- Form不被关闭,但是被隐藏。被隐藏的Form仍然可以被程序访问。 <br />caFree -- Form被关闭,并且释放其占用的资源。 <br />caMinimize -- Form被最小化而不是被关闭,这是MDI子窗口的默认关闭行为。 <br />------------------------------------ <br />系统配置文件 *.INI 的操作 <br />头部要引用IniFiles <br />1、声明变量 <br />Inifile:TiniFile; <br />2、指明路径 <br />IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+’option.ini’); <br />3、读取变量,注意变量有类型之分readstring,readinteger...等 <br />titleBMPfile:=IniFile.ReadString(’TitleImage’,’FileName’,’’); //IniFile.ReadString(’组名’,’变量’,’默认值’) <br />IniFile.ReadInteger <br />IniFile.ReadBool <br />4、写入或修改变量 <br />IniFile.WriteString(’标题’,’变量1’,’值’); <br /><br />5、用完后释放 <br />IniFile.Free; <br /><br />------------------------------------ <br />动态读取图象 <br />Image1.Picture.LoadFromFile(titleBMPFile); <br />------------------------------------ <br />fastreport自定义函数的用法 <br />1、先在普通工程窗体上定义好函数 <br />2、在frreport控件的userfunction中写入 <br /> if ansicomparetext( ’My_StrToRMB’ , Name ) = 0 then <br /> val:=My_StrToRMB(frparser.Calc(p1)); <br />//MY_STRTORMB是函数名 <br />//如果定义多个函数,就多来几个IF即可。 <br />在报表设计视图中就可以调用这个函数了。 <br /><br />------------------------------------ <br />数组是这样定义的 <br />sbh:array [0..9999999,0..1] of string; <br />------------------------------------ <br />treeview的用法 <br />//先定义项目序数和节点 <br />n: Integer; <br />Node: TTreeNode; <br /><br />Node := Tree1.Selected; <br />if (Node = nil) or (Node.StateIndex = -1) then Exit;//一般可以把不作反应的列的stateindex定为-1 <br />n := Node.StateIndex; <br />------------------------------------ <br />Fields[] 通过索引返回字段,要自己選擇返回的類型! <br />FieldByName() 通过名字返回字段,要自己選擇返回的類型! <br />Fieldvalues[] 通过名字返回字段的值,自動化類型! <br />------------------------------------ <br />调用外部程序方法 <br />用ShellExecute,在USES段加入SHELLAPI,使用时如: <br /> ShellExecute(handle,’open’,’c:\myapp\myapp.exe’,’-s’,’’,SW_SHOWNORMAL); <br /> 第一个参数为父窗口句柄; <br /> 第二个参数为打开方式(OPEN,PRINT两种); <br /> 第三个参数为执行文件全路径; <br /> 第四个参数为执行文件参数; <br /> 第五个参数为执行文件开始运行时的初始目录; <br /> 第六个参数为为执行文件运行方式(SW_HIDE,SW_MAXIMIZE,SW_MINIMIZE, <br />SW_RESTORE,SW_SHOW,SW_SHOWDEFAULT,SW_SHOWMAXIMIZED,SW_SHOWMINIMIZED, <br />SW_SHOWMINNOACTIVE,SW_SHOWNA,SW_SHOWNOACTIVATE,SW_SHOWNORMAL); <br />------------------------------------ <br />判断文件是否存在 <br />if not fileexists(’db2.mdb.bak’) then ... <br />------------------------------------ <br />判断按键 <br />if Key=#13 then //如果回车则。。。 <br />------------------------------------ <br />退出 <br /><br />关闭窗口 close; <br />关闭程序:Application.Terminate; <br />退出事件 exit; <br />------------------------------------ <br />检测软件是否已在运行 <br />if GetLastError = ERROR_ALREADY_EXISTS then... <br />------------------------------------ <br />定义函数是这样写的 <br />function IsReadOnly(b: Boolean; colors: Tcolor): Boolean; <br />------------------------------------ <br />fastreport直接打印 <br />FrReport1.PrepareReport; //初始化 <br />FrReport1.PrintPreparedReport(’1’,1,True,frAll); //打印 <br /><br />预览FrReport1.showreport; <br />------------------------------------ <br />找开浏览器,进入某站点。(或调用WINDOWS程序) <br /><br />进入站点ShellExecute(Handle, PChar(’OPEN’), PChar(’http://www.devexpress.com/downloads/index.asp’), nil, nil, SW_SHOWMAXIMIZED); <br />发送邮件ShellExecute(Handle, ’open’, PChar(’mailto:’ + edtemail.Text + ’?subject=’), nil, nil, SW_SHOW); <br /><br />------------------------------------ <br />打开文件对话框 <br />if OpenPictureDialog.Execute then <br /><br /><br />------------------------------------ <br />调用帮助文件 <br />Application.HelpFile := ’..\..\Help\eBars.hlp’; <br /><br /><br />------------------------------------ <br />打开窗口 <br />TForm1.Create(self).ShowModal; <br /><br /><br />------------------------------------ <br />取得当前执行程序的路径 <br />FPath := ExtractFilePath(Application.ExeName); <br />或 <br />FileName := ExtractFilePath(ParamStr(0)) + ’\MDB\电子通讯录.mdb’; <br /><br />------------------------------------ <br />当前路径 <br />getcurrentdir <br /><br /><br />------------------------------------ <br />判断当前鼠标处于某个位置(TAG) <br /> case TComponent(Sender).Tag of <br /> 0: begin <br /> ... <br /> lbBarBackgroud.Caption := sCustomImage; <br /> end; <br /> 1: begin <br /> ... <br /> lbBarBackgroud.Caption := sCustomImage; <br /> end; <br /> 2: begin <br /> ... <br /> lbBarBackgroud.Caption := sCustomImage; <br /> end; <br />------------------------------------ <br />数据库连接 <br /><br />1、建立一个adoconnection控件,命名为conn <br />2、建立一个adodataset控件,命名为ds <br /><br />然后就可以用以下语句连接并执行SQL查询(本例是access的数据库,带密码)。 <br /><br />conn.ConnectionString:=’Provider=Microsoft.Jet.OLEDB.4.0;Data Source=’+getcurrentdir+’\data\pn.mdb;Persist Security Info=False;jet oledb:database password=80513’; <br />conn.Connected:=true; <br />ds.Active:=false; <br />ds.CommandText:=’select 拜访日期,拜访时间,拜访客户,拜访地点,谈话内容 from khbf order by 拜访日期 desc’; <br />ds.Active:=true; <br />------------------------------------ <br />ADODataSet1.State的用法 <br />if ADODataSet1.State in [dsEdit,dsInsert] then <br /> ADODataSet1.Post ; <br />------------------------------------ <br />ADOQuery.open和ADOQuery.execSQL的区别 <br />用于存贮时如insert 只能用execSQL <br />------------------------------------ <br />------------------------------------ <br />------------------------------------ <br />------------------------------------ <br />回车光标移到另一个输入框 <br /><br />if key=#13 then <br />cmb_name.SetFocus; <br /><br />------------------------------------ <br />播放声音 <br />playsound(’c:\windows\media\start.wav’,0,SND_ASYNC); <br />------------------------------------ <br />列表框listbox增加项目 <br /><br />cmb_name.Items.Add(adotable1.Fieldvalues[’帐号’]); <br /><br /><br />------------------------------------ <br />listview用法 <br /><br />ListView.Selected := ListView.Items[0]; <br />ListView.Selected.Focused := True; <br />ListView.Selected.MakeVisible(False); <br />ListView.Selected.Index <br />ListView.Items.Count <br />ListView.Items.Delete(3) //删除第3个项目 <br />ListView.Items.Add.Caption:=’dddddddd’; //增加一个项目 <br /><br />ListView.Items.BeginUpdate; <br />ListView.Items.EndUpdate <br />ListView.Canvas.Font.Color := clGrayText; <br />if ListView.Selected <> nil then。。。。。 <br /><br />//往listview添加项目 <br />先定义 <br />var itm: TListItem; <br />然后 <br />listview.Items.Clear; <br />itm := listview.Items.Add; <br />itm.ImageIndex := 5; <br />itm.Caption := Msg.Subject; <br />itm.SubItems.Add(’aaaaa’); <br />itm.SubItems.Add(’ffffff’); <br />itm.SubItems.Add(’ffdfdfdf’); <br />itm.SubItems.Add(’oooo’); <br />------------------------------------ <br />静态调用DLL的方法 <br /><br />有参数 <br />procedure CreateSms(Text: Pchar);stdcall;External ’SmsLib.dll’; <br />无参数 <br />procedure CreateSms;stdcall;External ’SmsLib.dll’; <br />------------------------------------ <br />确定、取消对话框作用 <br /><br />if application.MessageBox(’真的退出?’,’提示’,mb_okcancel)=idok then <br />application.Terminate; //Terminate是终止程序 <br /><br />showmessage(’请先选中要修改的班级’); //这个是简单的显示提示框 <br />messagebox(self.Handle ,’价格输入不合法!’,’提示’,MB_OK or MB_ICONASTERISK); <br />------------------------------------ <br />调用窗体的步骤 <br /><br />先引用该窗体的单元,然后建立窗体,最后显示出来。 <br />例1: <br />use uxsgl; <br />Application.CreateForm(TFmXsgl, FmXsgl); <br />fmxsgl.ShowModal; <br /><br />例2: <br />Frm_LendDetail:=TFrm_LendDetail.Create(self); <br />Try <br /> Frm_LendDetail.ShowModal; <br />Finally <br /> Frm_LendDetail.Free; <br />End; <br />------------------------------------ <br />数据库查询 <br /><br />先建立数据源,然后添加一个TADOQUERY <br />adoquery1.SQL.Clear ; <br />adoquery1.Close; <br />adoquery1.SQL.Add(’select * from tkcb order by ckcb_kh’); <br />adoquery1.Open; <br /><br />aaa=adoquery1.Fieldvalues[’ckcb_kc’]; //取出当前记录某字段的值 <br />adoquery1.Next; //下一记录 <br />adoquery1.Close; //关闭查询 <br /><br />------------------------------------ <br />判断键盘输入字符-chr(13)是回车 <br /><br />if key=chr(13) then <br /> bitbtn1.SetFocus; <br />------------------------------------ <br />时间格式 <br /><br />lblTime.Caption := FormatDateTime(’yyyymmdd hh:nn:ss’,Now); <br /><br />------------------------------------ <br />表数据的添加添加 <br /><br />dmd是数据模块 tbl_zgdb是表名 <br />with dmd.tbl_zgdb do begin <br /> Append; <br /> Fieldvalues[’HYZH’] := Edt_HYZH.text; <br /> Fieldvalues[’XM’] := Edt_xm.text; <br /> Fieldvalues[’XB’] := Edt_xb.text; <br /> Fieldvalues[’dw’] := Edt_dw.text; <br /> Fieldvalues[’ZZMM’] := zzmm; <br /> Fieldvalues[’CSNY’] := trim(Edt_csny.text); <br /> Fieldvalues[’GZSJ’] := Edt_gzsj.text; <br /> Fieldvalues[’DBLB’] := dblb; <br /> Fieldvalues[’ZCLB’] := zclb; <br /> Fieldvalues[’XL’] := xl; <br /> Fieldvalues[’BZ’] := Edt_bz.text; <br /> Post; <br /> close; <br />end; <br />------------------------------------ <br />列表框的选项值 <br /><br />Edit1.Text:=listbox1.Items.Strings[listbox1.itemindex]; <br />------------------------------------ <br />Delphi键盘按键伪码 <br />用法:if key = chr(VK_RETURN) then... <br /><br />常数名称 十六进制值 十进制值 对应按键 <br />VK_LBUTTON 01 1 鼠标的左键 <br />VK_RBUTTON 02 2 鼠标的右键 <br />VK-CANCEL 03 3 Contol-break 执行 <br />VK_MBUTTON 04 4 鼠标的中键(三按键鼠标) <br />VK_BACK 08 8 Backspace键 <br />VK_TAB 09 9 Tab键 <br />VK_CLEAR 0C 12 Clear键 <br />VK_RETURN 0D 13 Enter键 <br />VK_SHIFT 10 16 Shift键 <br />VK_CONTROL 11 17 Ctrl键 <br />VK_MENU 12 18 Alt键 <br />VK_PAUSE 13 19 Pause键 <br />VK_CAPITAL 14 20 Caps Lock键 <br />VK_ESCAPE 1B 27 Ese键 <br />VK_SPACE 20 32 Spacebar键 <br />VK_PRIOR 21 33 Page Up键 <br />VK_NEXT 22 34 Page Domw键 <br />VK_END 23 35 End键 <br />VK_HOME 24 36 Home键 <br />VK_LEFT 25 37 LEFT ARROW 键(←) <br />VK_UP 26 38 UP ARROW键(↑) <br />VK_RIGHT 27 39 RIGHT ARROW键(→) <br />VK_DOWN 28 40 DOWN ARROW键(↓) <br />VK_SELECT 29 41 SELECT键 <br />VK_EXECUTE 2B 43 EXECUTE键 <br />VK_SNAPSHOT 2C 44 Print Screen键 <br />VK_INSERT 2D 45 Ins键 <br />VK_DELETE 2E 46 Del键 <br />VK_HELP 2F 47 Help键 <br />VK_0 30 48 0键 <br />VK_1 31 49 1键 <br />VK_2 32 50 2键 <br />VK_3 33 51 3键 <br />VK_4 34 52 4键 <br />VK_5 35 53 5键 <br />VK_6 36 54 6键 <br />VK_7 37 55 7键 <br />VK_8 38 56 8键 <br />VK_9 39 57 9键 <br />VK_A 41 65 A键 <br />VK_B 42 66 B键 <br />VK_C 43 67 C键 <br />VK_D 44 68 D键 <br />VK_E 45 69 E键 <br />VK_F 46 70 F键 <br />VK_G 47 71 G键 <br />VK_H 48 72 H键 <br />VK_I 49 73 I键 <br />VK_J 4A 74 J键 <br />VK_K 4B 75 K键 <br />VK_L 4C 76 L键 <br />VK_M 4D 77 M键 <br />VK_N 4E 78 N键 <br />VK_O 4F 79 O键 <br />VK_P 50 80 P键 <br />VK_Q 51 81 Q键 <br />VK_R 52 82 R键 <br />VK_S 53 83 S键 <br />VK_T 54 84 T键 <br />VK_U 55 85 U键 <br />VK_V 56 86 V键 <br />VK_W 57 87 W键 <br />VK_X 58 88 X键 <br />VK_Y 59 89 Y键 <br />VK_BZ 5A 90 Z键 <br />VK_NUMPAD0 60 96 数字键0键 <br />VK_NUMPAD1 61 97 数字键1键 <br />VK_NUMPAD2 62 98 数字键2键 <br />VK_NUMPAD3 63 99 数字键3键 <br />VK_NUMPAD4 64 100 数字键4键 <br />VK_NUMPAD5 65 101 数字键5键 <br />VK_NUMPAD6 66 102 数字键6键 <br />VK_NUMPAD7 67 103 数字键7键 <br />VK_NUMPAD8 68 104 数字键8键 <br />VK_NUMPAD9 69 105 数字键9键 <br />VK_MULTIPLY 6A 106 *键 <br />VK_ADD 6B 107 +键 <br />VK_SEPARATOR 6C 108 Separator键 <br />VK_SUBTRACT 6D 109 -键 <br />VK_DECIMAL 6E 110 .键 <br />VK_DIVIDE 6F 111 键 <br />VK_F1 70 112 F1键 <br />VK_F2 71 113 F2键 <br />VK_F3 72 114 F3键 <br />VK_F4 73 115 F4键 <br />VK_F5 74 116 F5键 <br />VK_F6 75 117 F6键 <br />VK_F7 76 118 F7键 <br />VK_F8 77 119 F8键 <br />VK_F9 78 120 F9键 <br />VK_F10 79 121 F10键 <br />VK_F11 7A 122 F11键 <br />VK_F12 7B 123 F12键 <br />VK_NUMLOCK 90 144 Num Lock 键 <br />VK_SCROLL 91 145 Scroll Lock键 <br /></p><p>1、判断机器是否网络状态 <br />答: <br />uses WinInet; <br />procedure TForm1.Button1Click(Sender: TObject); <br />function GetOnlineStatus : Boolean; <br />var ConTypes : Integer; <br />begin <br />ConTypes := INTERNET_CONNECTION_MODEM + INTERNET_CONNECTION_LAN + INTERNET_CONNECTION_PROXY; <br />if (InternetGetConnectedState(@ConTypes, 0) = False) <br />then Result := False <br />else Result := True; <br />end; <br />begin <br />if not GetOnlineStatus then ShowMessage(’Not Connected’); <br />end; <br /><br />========================================= <br /><br />2、[DELPHI]窗体渐渐出现 <br />答: <br />AnimateWindow(Handle,1000,AW_CENTER); <br />//在窗体创建事件中 <br /><br />========================================= <br /><br />3、如何取得一台机器的CPU占用率 ? <br />答: <br />使用下面的方法 <br />interface <br /><br />uses <br />Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, <br />Dialogs, StdCtrls; <br /><br />const <br />SystemBasicInformation = 0; <br />SystemPerformanceInformation = 2; <br />SystemTimeInformation = 3; <br /><br />type <br />TPDWord = ^DWORD; <br /><br />TSystem_Basic_Information = packed record <br />dwUnknown1: DWORD; <br />uKeMaximumIncrement: ULONG; <br />uPageSize: ULONG; <br />uMmNumberOfPhysicalPages: ULONG; <br />uMmLowestPhysicalPage: ULONG; <br />uMmHighestPhysicalPage: ULONG; <br />uAllocationGranularity: ULONG; <br />pLowestUserAddress: Pointer; <br />pMmHighestUserAddress: Pointer; <br />uKeActiveProcessors: ULONG; <br />bKeNumberProcessors: byte; <br />bUnknown2: byte; <br />wUnknown3: word; <br />end; <br /><br />type <br />TSystem_Performance_Information = packed record <br />liIdleTime: LARGE_INTEGER; {LARGE_INTEGER} <br />dwSpare: array[0..75] of DWORD; <br />end; <br /><br />type <br />TSystem_Time_Information = packed record <br />liKeBootTime: LARGE_INTEGER; <br />liKeSystemTime: LARGE_INTEGER; <br />liExpTimeZoneBias: LARGE_INTEGER; <br />uCurrentTimeZoneId: ULONG; <br />dwReserved: DWORD; <br />end; <br /><br />var <br />NtQuerySystemInformation: function(infoClass: DWORD; <br />buffer: Pointer; <br />bufSize: DWORD; <br />returnSize: TPDword): DWORD; stdcall = nil; <br /><br /><br />liOldIdleTime: LARGE_INTEGER = (); <br />liOldSystemTime: LARGE_INTEGER = (); <br />SysBaseInfo: TSystem_Basic_Information; <br />SysPerfInfo: TSystem_Performance_Information; <br />SysTimeInfo: TSystem_Time_Information; <br />status: Longint; {long} <br />dbSystemTime: Double; <br />dbIdleTime: Double; <br />function GetCPUUsage:Double; <br />implementation <br />function Li2Double(x: LARGE_INTEGER): Double; <br />begin <br />Result := x.HighPart * 4.294967296E9 + x.LowPart <br />end; <br /><br />function GetCPUUsage:Double; <br />var <br />bLoopAborted : boolean; <br />begin <br />if @NtQuerySystemInformation = nil then <br />NtQuerySystemInformation := GetProcAddress(GetModuleHandle(‘ntdll.dll‘), <br />‘NtQuerySystemInformation‘); <br />// get number of processors in the system <br />status := NtQuerySystemInformation(SystemBasicInformation, @SysBaseInfo, SizeOf(SysBaseInfo), nil); <br />if status <> 0 then Exit; <br />// Show some information <br />{with SysBaseInfo do <br />begin <br />ShowMessage( <br />Format(‘uKeMaximumIncrement: %d‘#13‘uPageSize: %d‘#13+ <br />‘uMmNumberOfPhysicalPages: %d‘+#13+‘uMmLowestPhysicalPage: %d‘+#13+ <br />‘uMmHighestPhysicalPage: %d‘+#13+‘uAllocationGranularity: %d‘#13+ <br />‘uKeActiveProcessors: %d‘#13‘bKeNumberProcessors: %d‘, <br />[uKeMaximumIncrement, uPageSize, uMmNumberOfPhysicalPages, <br />uMmLowestPhysicalPage, uMmHighestPhysicalPage, uAllocationGranularity, <br />uKeActiveProcessors, bKeNumberProcessors])); <br />end; <br />} <br />bLoopAborted := False; <br />while not bLoopAborted do <br />begin <br />// get new system time <br />status := NtQuerySystemInformation(SystemTimeInformation, @SysTimeInfo, SizeOf(SysTimeInfo), 0); <br />if status <> 0 then Exit; <br />// get new CPU‘s idle time <br />status := NtQuerySystemInformation(SystemPerformanceInformation, @SysPerfInfo, SizeOf(SysPerfInfo), nil); <br />if status <> 0 then Exit; <br />// if it‘s a first call - skip it <br />if (liOldIdleTime.QuadPart <> 0) then <br />begin <br />// Currentvalue = Newvalue - Oldvalue <br />dbIdleTime := Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime); <br />dbSystemTime := Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime); <br />// CurrentCpuIdle = IdleTime / SystemTime <br />dbIdleTime := dbIdleTime / dbSystemTime; <br />// CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors <br />dbIdleTime := 100.0 - dbIdleTime * 100.0 / SysBaseInfo.bKeNumberProcessors + 0.5; <br />// Show Percentage <br />//Form1.Label1.Caption := FormatFloat(‘CPU Usage: 0.0 %‘,dbIdleTime); <br />//Application.ProcessMessages; <br />// Abort if user pressed ESC or Application is terminated <br />Result:=dbIdleTime; <br />bLoopAborted:=True; <br />//bLoopAborted := (GetKeyState(VK_ESCAPE) and 128 = 128) or Application.Terminated; <br />end; <br />// store new CPU‘s idle and <br /> <br /><br />========================================= <br /><br />4、动态生成控件? <br />答: <br />var <br />TeSpeedButtonX:TTeSpeedButton; <br />begin <br />TeSpeedButtonX:=TTeSpeedButton.Create(nil); <br />TeSpeedButtonX.Caption:=’标题’; <br />TeSpeedButtonX.Name:=’按钮’+inttostr(X); <br />TeSpeedButtonX.Parent:=Tetoolbar2; <br />X:=X+1; <br />end; <br /><br />========================================= <br /><br />5、我动态创建了多个button,使用时,我怎么判断出用户点击的是哪个button呢?button的各项属性都边成最后创建的那个button的了,怎么办哦? <br />答1: <br />教你一招,先设置每个button的tag属性.然后在onclick事件中用(sender as button).tag来判断,相信我,没错的! <br /><br />答2: <br />如果你生成的控件不是很多的话,最简单的方法就是,假如你生成控件的父控件是FORM1,利用循环判断控件是否等于FORM1.ACTIVECONTROL,我就是这么用的。ACTIVECONTROL就是记录当前被点击的控件,你也可以直接用它,不过直接只能用到CONTROL的一般属性和方法,循环判断的话就可以用到你生成控件的相关属性。 <br /><br />========================================= <br /><br />6、窗体释放问题 <br />答: <br />在Form2.OnClose事件中 <br />Action:=caFree;</p><p>1、怎么样在delphi中调动其它*.exe文件? <br />例如:winexec(’d:\郑洽\Project1.exe’,sw_show); <br /><br />================================ <br /><br />2、如何让工程运行时主窗体就是最大化的? <br />答:设置主窗体的WindowsState属性为wsMaximized就可以了! <br />wsNormal 窗体以普通状态显示 <br />wsMinimized 窗体以最小化状态显示。 <br />wsMaximized 窗体以最大化状态显示。 <br /><br />================================ <br /><br />3、我想先->闪现窗体->主窗体->登录窗体,工程源文件怎么设置? <br />答: <br />⒈开始一个新工程。给表格起名为MainForm,MainForm的单元起名为Main, 工程文 件起名为Test。 <br />⒉在MainForm中插入一个Button部件,将其Caption属性设为“关闭”,为该部件 的onClick事件创建一个过程,并在过程的begin和end之间插入Close语句。 <br />⒊在应用程序添加一个表格,将这个表格起名为MoveForm,MoveForm 的单元起名 为Move。 <br />⒋为便于演示,在MoveForm中插入一个Label部件,设置其Caption 属性为“欢迎 进入本系统”。 <br />5.下一步修改工程的源代码。选择View/Project Source,修改begin和end之间的 语句如下: <br />程序清单Test.Dpr <br />program Test <br />uses <br />forms, <br />Main in ’MAIN.PAS’{MainForm}, <br />Move in ’Move.PAS’{MoveForm} <br /><br />{$R *.RES} <br /><br />begin <br />MoveForm:=TMoveForm.Create(Application);{Create创建闪现窗口对象} <br />MoveForm.Show; <br />MoveForm.Update; <br />Application.CreateForm(TMainForm,MainForm); <br />MoveForm.Hide; <br />MoveForm.Free;{Free从内存中释放对象} <br />Application.Run; <br />end. <br /> 第一条语句创建了对象,该对象存在内存中,但还不能看见, 为了让它出现并更 新它的内容,调用对象的Show和Update成员函数:Show和Update。 当闪现窗口使 用完后,用Hide函数将它隐藏起来,然后用Free函数释放它所占据的内存。 <br />6.如果此刻你编译和运行程序,MoveForm窗口一闪而过, 你可能未来得及看 清。为使MoveForm窗口显示几秒种,我们可为MainForm的OnCreate 事件创建一个 处理程序,延迟MoveForm窗口的显现时间。 <br />program TMainForm.FormCreate(sender:Tobject); <br />var <br />currentTime:LongInt; <br />begin <br />currentTime:=GetTickCount div 1000; <br />while ((GetTickCount div 1000)<(currentTime+3) do <br />{不做任何事); <br />end; <br />end. <br /> GetTickCount函数返回窗口启动后过去的毫秒数,这个值除以1000 转化为秒数。 此时你编译运行程序,就能得到一个延迟3秒多的闪现窗口。 <br />为闪现窗口添加上Image部件,再对字体及窗口进行修饰,我们就能为应用程 序,创建一个精美的封面或在程序启动时显示重要提示。 <br /><br />制作登录窗体一个很方便的方法就是主窗体作为主窗体,登录成功Hide掉就行了。 <br />如果登录窗体不可以作为主窗体,那么和闪现窗体一样的方法创建登录窗体,加在Application.Run;之前,MoveForm.Free;之后, <br />用showmodal显示登录窗体 <br /><br />================================ <br /><br />4、button上面的文字怎么样换行? <br />答: <br />button控件不行 <br />bitbtn控件可以。 <br />bitbtn1.caption:=’aaaa’#13’bbbbb’ <br /><br />================================ <br /><br />5、怎么样判别焦点是否在某个控件上? <br />答: <br />if Tobject.focused then <br />//焦点在某某控件上 <br />else <br /><br />================================ <br /><br />6、怎么样在程序中使一个节点的子节点展开及收闭? <br />答: <br />treeview1.selected.Expanded; //判断节点的子节点是否展开True展开,否则闭拢 <br />treeview1.selected.Expand(True);//子节点展开 <br />treeview1.selected.collapse(True)://子节点闭拢 <br /><br />树节点全部展开: <br />procedure TForm1.Button1Click(Sender: TObject); <br />var node:TTreeNode; <br />begin <br />if treeview1.Items[0]<>nil then <br />begin <br /> node:=treeview1.Items[0]; <br /> node.Expand(true); <br /> while node.getNextSibling<>nil do <br /> begin <br /> node:=node.getNextSibling; <br /> node.Expand(true); <br /> end; <br />end; <br />end; <br /><br /><br />树节点全部收缩: <br />procedure TForm1.Button2Click(Sender: TObject); <br />var node:TTreeNode; <br />begin <br />if treeview1.Items[0]<>nil then <br />begin <br /> node:=treeview1.Items[0]; <br /> node.Collapse(true); <br /> while node.getNextSibling<>nil do <br /> begin <br /> node:=node.getNextSibling; <br /> node.Collapse(true); <br /> end; <br />end; <br />end; <br /><br />================================ <br /><br />7、如何用delphi编程实现给access数据库加密码? <br />答:1,新建Project。 <br /> 2,在FORM中放入ADOConnection控件。 <br /> 3,双击ADOConnection控件,然后点击Build...按钮,在“提供者”页中选择“Microsoft Jet 4.0 OLE DB Provider”,然后点击“下一步”按钮,在“连接”页中选择要连接的Access数据库的路径和数据库的文件名,这时如果点“测试连接”按钮时,出现“初始化提供者时发生错误,测试连接失败,密码无效”的错误提示。 <br /> 4,这时点“所有”页,然后双击“Jet OLEDB:Database Password”,出现对话框,添入密码后,选择“连接”页中的“测试连接”按钮,出现“测试连接成功”的对话框。把ADOConnection控件的LoginPromtp设为false. <br /> 5,设置连接完成。 <br /><br />================================ <br /><br />8、如何判断Treeview中我选中的节点是否有子节点?如果没有给出提示啊? <br />答: <br />if Treeview.Selected.HasChildren then <br />//有 <br />else <br />//无 <br /><br />var <br />Node :TTreeNode; <br />begin <br />Node :=TreeView1.Selected; <br />if Node.HasChildren then <br />.... <br />对复杂的程序最好用Node过渡 <br /><br />================================ <br /><br />9、能否解释一下try...except...end及try...finally...end;? <br />1.(1)是用于扑捉异常,(2)是用于保证代码执行的完整性 <br />2.(1)中finally处的代码不管什么情况都会被执行,(2)中except处的代码仅在发生异常时才会执行 <br />3.try finally之间的代码虽可保证finally 和 end之间的程序能执行,但不能保证程序不崩溃, <br />而try except就不会使程序崩溃 <br /><br />================================ <br /><br />10、怎么样在主程序控制器中加入音乐? <br />在implementation下加入 mmsystem單元(windows多媒體函數動態聯結庫)。然後在的onShow,onCreate事件中編寫代碼:sndplaysound(’sound.wav’,snd_async) <br /><br />================================ <br /><br />11、我在form1上有四个edit,输完后我想用下上箭头键进行上移下移?怎么办? <br />答: <br />procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; <br />Shift: TShiftState); <br />begin <br />if key=vk_down then perform(WM_NEXTDLGCTL,0,0) else <br />if key=vk_up then perform(WM_NEXTDLGCTL,1,0); <br />end; <br /><br />================================ <br /><br />12、如何用delphi5实现读文本文件指定的一行,并得到文本文件的总行数?谢谢! <br />答: <br />Delphi读文件文件一般使用Readln过程,如要读第3行可以这样: <br /> var <br /> i : Integer; <br /> F: TextFile; <br /> S: string; <br /> begin <br /> if OpenDialog1.Execute then { Display Open dialog box } <br /> begin <br /> AssignFile(F, OpenDialog1.FileName); { File selected in dialog } <br /> Reset(F); <br /> For i = 1 To 3 Do <br /> Readln(F, S); <br /> Edit1.Text := S; { Put string in a TEdit control } <br /> CloseFile(F); <br /> . <br /> end; <br /> 要统计总行数,只能从头逐行读,直到文件尾(Eof函数为True),每读一行计数器加1。 <br /> 不过由于文本文件的每行长度不相等,它不能象数据库文件那样想读那行就读哪行,只能顺序读。 <br /> 上面的方法容易理解,也容易实现。如果希望提高速度,编程上要麻烦一些,可以以二进制方式打开文件,将所有内容读入一个内存变量,然后使用Pos函数查找其中的回车(#13)个数,这样可以快速地统计总行数并能快速地找到指定行。 <br /><br />================================ <br /><br />13、制作主窗口显示前的版权窗口 <br />答: <br />在工程文件中选File->New Form新建一个窗口,设计好窗口的外观。给窗口起名为AboutBox,选Project->Options,将新建的窗口从自动建立中去掉。 选View->Project Source,打开工程文件的源文件,在下面加入红色的句子。 <br />Uses AboutBox <br />Var <br />lTime :TDateTime; <br />Begin <br />Application.Initialize(); <br />AboutBox=TAboutBox.Create(AboutBox); <br />AboutBox.Show; <br />AboutBox.Update; <br />lTime=GetTickCount; <br />Application.CreateForm(TMainForm,MainForm); <br />while((GetTickCount-lTime) / 1000 <3) do; <br />AboutBox.Hide; <br />AboutBox.Free; <br />Application.Run; <br />end; <br /><br />================================ <br /><br />14、Delphi中RichEdit的奥妙 <br /> 一、如何得知当前行号 <br /> 用RichEdit(或者memo)控件制作文本编辑器时,通过访问lines?count属性可以得到总行数,但是若想知道光标当前所在行的行号就麻烦了,因为delphi没有提供这个属性。要实现这个编辑器必备功能,就须调用em_ LineFromChar。 <br /><br /> 请试试下面的程序。 <br /> 先在窗口中布置一个RichEdit或者memo(命名为editor),以及一个button。在button的onclick事件中写入下列代码。 <br /> var <br /> CurrentLine:Integer; <br /> begin <br /> CurrentLine:=Editor.Perform(em_ LineFromChar,SFFFF,0); <br /> Application.MessageBox(PChar(′当前行号是′+IntToStr(CurrentLine)),′消息′,mb_ iconinformation); <br /> end; <br /> 需要注意的是,第一行的行号为零。 <br /><br /> 二、如何撤消操作(undo) <br /> 对于memo来说,实现undo是不需编程的,只要让popupmenu属性为空,运行时就能用鼠标右键激活一个常用操作菜单,其中包括撤消、剪切、复制、粘贴、删除和全选六项。 但可惜的是,这一招对于功能强大的RichEdit控件居然行不通,害得我们还要自己设计一个popupmemu。当你用CutToClipBoard等语句轻松而顺利地完成了“剪切”等功能,接着便会无奈地发现,竟找不到undo或cancel之类的语句来执行“撤消”。 这时你需要这样处理: <br /> RichEdit1?Perform(EM_UNDO,0,0); <br /> 另外还应检查是否允许撤消,从而开启或关闭弹出菜单中的“撤消”项: <br /> Undo1?Enabled:=RichEdit? <br /> Perform(EM_CANUNDO,0,0)<>0; <br />以上程序在Delphi3中调试通过。 <br /><br /><br />================================ <br /><br />15、在主窗口中打开另一个独立的窗口,而这个被打开的窗口固定显示在..? <br />答: <br />procedure TForm2.FormCreate(Sender: TObject); <br />begin <br />form2.Hide; <br />self.Parent:=form1.Panel1; <br />end; <br /><br />================================ <br /><br />16、SaveDialog1确认文件存不存在的办法? <br />答: <br />procedure TForm1.SaveDialog1CanClose(Sender: TObject; <br />var CanClose: Boolean); <br />begin <br />if FileExists(SaveDialog1.FileName) then //如果文件已经存在 <br />if MessageDlg(’文件已经存在,保存吗?’, mtConfirmation, [mbYes, mbNo], 0) <> mrYes then <br />Button2.Click ; //如果选择了覆盖,则退出,否则,重新让用户选择文件 <br />end; <br /><br />================================ <br /><br />17、正确关闭一个MDI子窗口? <br />答: <br />Delphi中MDI子窗口的关闭方式默认为缩小而不是关闭,所以当你单击子窗口右上角的关闭按钮时会发觉该子窗口只是最小化,而不是你预期的那样被关闭。解决办法是在子窗口的OnClose事件处理过程中加入如下代码,示例: <br /><br />procedure ChildForm.OnClose(Sender: TObject; var Action: TCloseAction); <br />begin <br />Action := caFree; <br />end; <br /><br /> Delphi为一个Form的关闭行为指定了四种方式,分别是: <br /><br />caNone 禁止Form被关闭 <br />caHide Form不被关闭,但是被隐藏。被隐藏的Form仍然可以被程序访问。 <br />caFree Form被关闭,并且释放其占用的资源。 <br />caMinimize Form被最小化而不是被关闭,这是MDI子窗口的默认关闭行为。 <br /><br /><br />================================ <br /><br />18、怎样记MDI子窗口不在母体运行时就被打开? <br />答: <br /> 在project下的options中forms里面除了form1外,其余的移到右边的框里,然后在调用显示的按钮下编写语句,以form2调用为例: <br /> form2:=Tform2.create(self); <br /> form2.show; <br /><br />================================ <br /><br />19、限制FORM的大小 <br />答: <br />在FORM私有声明部分加上如下一行: <br /><br />procedure WMGetMinMaxInfo( var Message:TWMGetMinMaxInfo );message WM_GETMINMAXINFO; <br />在声明部分加上如下几行: <br />procedure TForm1.WMGetMinMaxInfo( var Message :TWMGetMinMaxInfo ); <br />begin <br />with Message.MinMaxInfo^ do <br />begin <br />ptMaxSize.X := 200; {最大化时宽度} <br />ptMaxSize.Y := 200; {最大化时高度} <br />ptMaxPosition.X := 99; {最大化时左上角横坐标} <br />ptMaxPosition.Y := 99; {最大化时左上角纵坐标} <br />end; <br />Message.Result := 0; {告诉Windows你改变了 minmaxinfo} <br />inherited; <br />end; <br /><br />================================ <br /><br />20、随机数生成法 <br />答: <br />Randomize; <br />rn:=inttostr(random(9999)); <br />rn1:=inttostr(random(9999)); <br />..... <br /><br />================================ <br /><br />21、怎样把程序隐藏起来,在WINDOWS界面上没有显示?? <br />答: <br />在application.run之前加入application.showmain:=false! <br /><br />================================ <br /><br />22、怎样将一个form1.free的form1窗体重新显示? <br />答: <br />form2:=TForm2.Create(application); <br />form2.Show; <br /><br />如果你要创建的Form2窗体能嵌入一个Panel中,指定Parent: <br />form2:=TForm2.Create(application); <br />form2.Parent:=panel1; <br />form2.Show; <br /><br />================================ <br /><br />23、我想在bitbtn上设快捷按钮Esc,怎么办? <br />答: <br />procedure TForm1.BitBtn1KeyDown(Sender: TObject; var Key: Word; <br />Shift: TShiftState); <br />begin <br />if key=27 then <br />application.Terminate; <br />end; <br /><br />设它的cancel属性为true就行了~~ <br /><br />================================ <br /><br />24、什么叫做托盘区? <br />答: <br />托盘区就是在windows的状态栏下方显示时钟、输入法状态的地方, <br /><br />要把你的程序显示在托盘区: <br />下面是一个托盘类,只要把下面粘贴到文本文件中,改成TrayIcon.pas,使用时uses TrayIcon就可以了。 <br /><br />先声明一个全局变量: <br />var tray:TTrayNotifyIcon; <br /><br />然后在窗体的OnCreate事件中: <br />tray:=TTrayNotifyIcon.Create(self);//将窗体创建为托盘 <br />tray.Icon:=application.Icon;//定义托盘的显示图标 <br />tray.IconVisible:=true;//托盘可见 <br />tray.PopupMenu:=popmenu;//给托盘定义一个右击时的弹出菜单 <br />tray.OnDblClick:=trayDblClick;//给托盘定义一个双击事件(当然要自己写了,不过多数情况只有一行,就是Form1.show); <br /><br /><br />unit TrayIcon; <br /><br />interface <br /><br />uses Windows, SysUtils, Messages, ShellAPI, Classes, Graphics, Forms, Menus, <br />StdCtrls, ExtCtrls; <br /><br />type <br />ENotifyIconError = class(Exception); <br /><br />TTrayNotifyIcon = class(TComponent) <br />private <br /> FDefaultIcon: THandle; <br /> FIcon: TIcon; <br /> FHideTask: Boolean; <br /> FHint: string; <br /> FIconVisible: Boolean; <br /> FPopupMenu: TPopupMenu; <br /> FonClick: TNotifyEvent; <br /> FOnDblClick: TNotifyEvent; <br /> FNoShowClick: Boolean; <br /> FTimer: TTimer; <br /> Tnd: TNotifyIconData; <br /> procedure SetIcon(value: TIcon); <br /> procedure SetHideTask(value: Boolean); <br /> procedure SetHint(value: string); <br /> procedure SetIconVisible(value: Boolean); <br /> procedure SetPopupMenu(value: TPopupMenu); <br /> procedure SendTrayMessage(Msg: DWORD; Flags: UINT); <br /> function ActiveIconHandle: THandle; <br /> procedure OnButtonTimer(Sender: TObject); <br />protected <br /> procedure Loaded; override; <br /> procedure LoadDefaultIcon; virtual; <br /> procedure Notification(AComponent: TComponent; <br /> Operation: TOperation); override; <br />public <br /> constructor Create(AOwner: TComponent); override; <br /> destructor Destroy; override; <br />published <br /> property Icon: TIcon read FIcon write SetIcon; <br /> property HideTask: Boolean read FHideTask write SetHideTask default False; <br /> property Hint: String read FHint write SetHint; <br /> property IconVisible: Boolean read FIconVisible write SetIconVisible default False; <br /> property PopupMenu: TPopupMenu read FPopupMenu write SetPopupMenu; <br /> property onClick: TNotifyEvent read FonClick write FonClick; <br /> property OnDblClick: TNotifyEvent read FOnDblClick write FOnDblClick; <br />end; <br /><br />implementation <br /><br />{ TIconManager } <br />{ This class creates a hidden window which handles and routes } <br />{ tray icon messages } <br />type <br />TIconManager = class <br />private <br /> FHWindow: HWnd; <br /> procedure TrayWndProc(var Message: TMessage); <br />public <br /> constructor Create; <br /> destructor Destroy; override; <br /> property HWindow: HWnd read FHWindow write FHWindow; <br />end; <br /><br />var <br />IconMgr: TIconManager; <br />DDGM_TRAYICON: Cardinal; <br /><br />constructor TIconManager.Create; <br />begin <br />FHWindow := AllocateHWnd(TrayWndProc); <br />end; <br /><br />destructor TIconManager.Destroy; <br />begin <br />if FHWindow <> 0 then DeallocateHWnd(FHWindow); <br />inherited Destroy; <br />end; <br /><br />procedure TIconManager.TrayWndProc(var Message: TMessage); <br />{ This allows us to handle all tray callback messages } <br />{ from within the context of the component. } <br />var <br />Pt: TPoint; <br />TheIcon: TTrayNotifyIcon; <br />begin <br />with Message do <br />begin <br /> { if it’s the tray callback message } <br /> if (Msg = DDGM_TRAYICON) then <br /> begin <br /> TheIcon := TTrayNotifyIcon(WParam); <br /> case lParam of <br /> { enable timer on first mouse down. } <br /> { onClick will be fired by OnTimer method, provided } <br /> { double click has not occurred. } <br /> WM_LBUTTONDOWN: TheIcon.FTimer.Enabled := True; <br /> { Set no click flag on double click. This will supress } <br /> { the single click. } <br /> WM_LBUTTONDBLCLK: <br /> begin <br /> TheIcon.FNoShowClick := True; <br /> if Assigned(TheIcon.FOnDblClick) then TheIcon.FOnDblClick(Self); <br /> end; <br /> WM_RBUTTONDOWN: <br /> begin <br /> if Assigned(TheIcon.FPopupMenu) then <br /> begin <br /> { Call to SetForegroundWindow is required by API } <br /> SetForegroundWindow(IconMgr.HWindow); <br /> { Popup local menu at the cursor position. } <br /> GetCursorPos(Pt); <br /> TheIcon.FPopupMenu.Popup(Pt.X, Pt.Y); <br /> { Message post required by API to force task switch } <br /> PostMessage(IconMgr.HWindow, WM_USER, 0, 0); <br /> end; <br /> end; <br /> end; <br /> end <br /> else <br /> { If it isn’t a tray callback message, then call DefWindowProc } <br /> Result := DefWindowProc(FHWindow, Msg, wParam, lParam); <br />end; <br />end; <br /><br />{ TTrayNotifyIcon } <br /><br />constructor TTrayNotifyIcon.Create(AOwner: TComponent); <br />begin <br />inherited Create(AOwner); <br />FIcon := TIcon.Create; <br />FTimer := TTimer.Create(Self); <br />with FTimer do <br />begin <br /> Enabled := False; <br /> Interval := GetDoubleClickTime; <br /> OnTimer := OnButtonTimer; <br />end; <br />{ Keep default windows icon handy... } <br />LoadDefaultIcon; <br />end; <br /><br />destructor TTrayNotifyIcon.Destroy; <br />begin <br />if FIconVisible then SetIconVisible(False); // destroy icon <br />FIcon.Free; // free stuff <br />FTimer.Free; <br />inherited Destroy; <br />end; <br /><br />function TTrayNotifyIcon.ActiveIconHandle: THandle; <br />{ Returns handle of active icon } <br />begin <br />{ If no icon is loaded, then return default icon } <br />if (FIcon.Handle <> 0) then <br /> Result := FIcon.Handle <br />else <br /> Result := FDefaultIcon; <br />end; <br /><br />procedure TTrayNotifyIcon.LoadDefaultIcon; <br />{ Loads default window icon to keep it handy. } <br />{ This will allow the component to use the windows logo } <br />{ icon as the default when no icon is selected in the } <br />{ Icon property. } <br />begin <br />FDefaultIcon := LoadIcon(0, IDI_WINLOGO); <br />end; <br /><br />procedure TTrayNotifyIcon.Loaded; <br />{ Called after component is loaded from stream } <br />begin <br />inherited Loaded; <br />{ if icon is supposed to be visible, create it. } <br />if FIconVisible then <br /> SendTrayMessage(NIM_ADD, NIF_MESSAGE or NIF_ICON or NIF_TIP); <br />end; <br /><br />procedure TTrayNotifyIcon.Notification(AComponent: TComponent; <br />Operation: TOperation); <br />begin <br />inherited Notification(AComponent, Operation); <br />if (Operation = opRemove) and (AComponent = PopupMenu) then <br /> PopupMenu := nil; <br />end; <br /><br />procedure TTrayNotifyIcon.OnButtonTimer(Sender: TObject); <br />{ Timer used to keep track of time between two clicks of a } <br />{ double click. This delays the first click long enough to } <br />{ ensure that a double click hasn’t occurred. The whole } <br />{ point of these gymnastics is to allow the component to } <br />{ receive onClicks and OnDblClicks independently. } <br />begin <br />{ Disable timer because we only want it to fire once. } <br />FTimer.Enabled := False; <br />{ if double click has not occurred, then fire single click. } <br />if (not FNoShowClick) and Assigned(FonClick) then <br /> FonClick(Self); <br />FNoShowClick := False; // reset flag <br />end; <br /><br />procedure TTrayNotifyIcon.SendTrayMessage(Msg: DWORD; Flags: UINT); <br />{ This method wraps up the call to the API’s Shell_NotifyIcon } <br />begin <br />{ Fill up record with appropriate values } <br />with Tnd do <br />begin <br /> cbSize := SizeOf(Tnd); <br /> StrPLCopy(szTip, PChar(FHint), SizeOf(szTip)); <br /> uFlags := Flags; <br /> uID := UINT(Self); <br /> Wnd := IconMgr.HWindow; <br /> uCallbackMessage := DDGM_TRAYICON; <br /> hIcon := ActiveIconHandle; <br />end; <br />Shell_NotifyIcon(Msg, @Tnd); <br />end; <br /><br />procedure TTrayNotifyIcon.SetHideTask(value: Boolean); <br />{ Write method for HideTask property } <br />const <br />{ Flags to show application normally or hide it } <br />ShowArray: array[Boolean] of integer = (sw_ShowNormal, sw_Hide); <br />begin <br />if FHideTask <> value then <br />begin <br /> FHideTask := value; <br /> { Don’t do anything in design mode } <br /> if not (csDesigning in ComponentState) then <br /> ShowWindow(Application.Handle, ShowArray[FHideTask]); <br />end; <br />end; <br /><br />procedure TTrayNotifyIcon.SetHint(value: string); <br />{ Set method for Hint property } <br />begin <br />if FHint <> value then <br />begin <br /> FHint := value; <br /> if FIconVisible then <br /> { Change hint on icon on tray notification area } <br /> SendTrayMessage(NIM_MODIFY, NIF_TIP); <br />end; <br />end; <br /><br />procedure TTrayNotifyIcon.SetIcon(value: TIcon); <br />{ Write method for Icon property. } <br />begin <br />FIcon.Assign(value); // set new icon <br />{ Change icon on notification tray } <br />if FIconVisible then SendTrayMessage(NIM_MODIFY, NIF_ICON); <br />end; <br /><br />procedure TTrayNotifyIcon.SetIconVisible(value: Boolean); <br />{ Write method for IconVisible property } <br />const <br />{ Flags to add or delete a tray notification icon } <br />MsgArray: array[Boolean] of DWORD = (NIM_DELETE, NIM_ADD); <br />begin <br />if FIconVisible <> value then <br />begin <br /> FIconVisible := value; <br /> { Set icon as appropriate } <br /> SendTrayMessage(MsgArray[value], NIF_MESSAGE or NIF_ICON or NIF_TIP); <br />end; <br />end; <br /><br />procedure TTrayNotifyIcon.SetPopupMenu(value: TPopupMenu); <br />{ Write method for PopupMenu property } <br />begin <br />FPopupMenu := value; <br />if value <> nil then value.FreeNotification(Self); <br />end; <br /><br />const <br />{ String to identify registered window message } <br />TrayMsgStr = ’DDG.TrayNotifyIconMsg’; <br /><br />initialization <br />{ Get a unique windows message ID for tray callback } <br />DDGM_TRAYICON := RegisterWindowMessage(TrayMsgStr); <br />IconMgr := TIconManager.Create; <br />finalization <br />IconMgr.Free; <br />end. <br /><br />================================ <br /><br />25、关于窗体释放的问题(formX.free)? <br />答: <br />这个我知道,模式窗口用:form2 := TForm2.Create(Application); <br />try <br />if form2.showModal = mrOK then <br /> {do Something} <br />finally <br />form2.free; <br />form2 := nil; <br />end; 非模式窗口用:if not Assigned(form2) then <br />form2 := Tfrom2.Create(Application); <br />form2.show; <br /><br />//然后在form2的Close事件中加入以下句 <br />Action := caFree; <br /><br />//在from2的Destory事件中加入以下句 <br />form2 := nil; 搞定!!! <br /><br />================================ <br /><br />26、关于MDI窗体的问题? <br />答: <br />我不知道是如何实现,但我知道一个方法可以实现同样的功能,在打开子窗体前加一句 <br />button1.SendToBack; <br /><br />================================ <br /><br />27、小数点’.’的键号是什么?回车是#13,’.’是什么? <br />答: <br />你可以用此得出所有键的值procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; <br />Shift: TShiftState); <br />begin <br />label1.caption:=IntToStr(key); <br />end; <br /></p><p> </p> Loading... <p>//获取任务栏尺寸 <br />procedure TForm1.Button1Click(Sender: TObject); <br />var <br />TaskList: HWnd; <br />Bordered: TRect; <br />begin <br />TaskList := FindWindow(’Shell_TrayWnd’, nil); <br />GetWindowRect(TaskList, Bordered); <br />Label1.Caption := ’Left: ’ + IntToStr(Bordered.Left); <br />Label2.Caption := ’Right: ’ + IntToStr(Bordered.Right); <br />Label3.Caption := ’Top: ’ + IntToStr(Bordered.Top); <br />Label4.Caption := ’Bottom: ’ + IntToStr(Bordered.Bottom); <br />end; <br /><br /><br />//修改指定路径下的文件只读属性 <br />function PathSetAttr(sFilePath: string): Boolean; <br />var <br />SearchRec: TSearchRec; <br />begin <br />Result := False; <br />if Copy(sFilePath, Length(sFilePath) - 1, Length(sFilePath)) <> ’\’ then <br /> sFilePath := sFilePath + ’\’; <br />if DirectoryExists(sFilePath) then <br />begin <br /> if FindFirst(sFilePath+’*.*’, faAnyFile, SearchRec) = 0 then <br /> begin <br /> FileSetAttr(SearchRec.Name, 32); <br /> while FindNext(SearchRec) = 0 do <br /> FileSetAttr(SearchRec.Name, 32); <br /> end; <br /> Result := True; <br />end; <br />end; <br /><br /><br />//为控件加边框 <br />procedure WMNCPaint(var Msg: TWMNCPaint); message WM_NCPAINT; <br /><br />procedure TForm1.WMNCPaint(var Msg: TWMNCPaint); <br />var <br />dc: hDC; <br />Pen: hPen; <br />OldPen: hPen; <br />OldBrush: hBrush; <br />begin <br />inherited; <br />dc := GetWindowDC(Handle); <br />msg.Result := 1; <br />Pen := CreatePen(PS_SOLID, 1, RGB(255, 0, 0)); <br />OldPen := SelectObject(dc, Pen); <br />OldBrush := SelectObject(dc, GetStockObject(NULL_BRUSH)); <br />Rectangle(dc, 0, 0, Self.Width, Self.Height); <br />SelectObject(dc, OldBrush); <br />SelectObject(dc, OldPen); <br />DeleteObject(Pen); <br />ReleaseDC(Handle, Canvas.Handle); <br />end; <br /><br /><br />//制作透明窗体 <br />procedure CreateParams(var Params: TCreateParams); override; //重载 CreateParams 过程的实现 <br /><br />procedure TForm1.CreateParams(var Params: TCreateParams); <br />begin <br />//先继承原来的 CreateParams 过程 <br />inherited; <br />//然后修改 Param.ExStyle 的值,使窗体具有透明效果 <br />Params.ExStyle := Params.ExStyle or WS_EX_TRANSPARENT; <br />end; <br /><br />procedure TForm1.FormCreate(Sender: TObject); <br />begin <br />inherited; <br />//将画布的笔刷样式改成 bsClear 以及时清除窗体原来的内容,这样窗体就有透明效果 <br />Canvas.Brush.Style := bsClear; <br />end; <br /><br /><br />//Memo 组件的光标定位 <br />procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton; <br />Shift: TShiftState; X, Y: Integer); <br />var <br />Lpos, Cpos, Linelength: integer; <br />begin <br />Lpos := SendMessage(Memo1.Handle, EM_LineFromChar, Memo1.SelStart, 0); <br />Cpos := SendMessage(Memo1.Handle, EM_LineIndex, Lpos, 0); <br />LineLength := SendMessage(Memo1.Handle, EM_LineLength, Cpos, 0); <br />Cpos := Memo1.SelStart - Cpos; <br />Label1.Caption := IntToStr(Lpos); <br />Label2.Caption := IntToStr(Cpos); <br />Label3.Caption := IntToStr(LineLength); <br />end; <br /><br />//点击客户区也能拖动窗口 <br />procedure WmNCHitTest(var Msg: TWMNCHitTest); message WM_NCHitTest; <br /><br />procedure TForm1.WmNCHitTest(var Msg: TWMNCHitTest); <br />begin <br />DefaultHandler(Msg); <br />if Msg.Result = HTClient then <br /> Msg.Result := HTCaption; <br />end; <br /><br /><br />//自定义Memo控件的边界 <br />procedure TForm1.Button1Click(Sender: TObject); <br />var <br />Rect: TRect; <br />begin <br />SendMessage(Memo1.Handle, EM_GETRECT, 0, LongInt(@Rect)); <br />Rect.Left := 20; <br />Rect.Top := 20; <br />Rect.Right := Rect.Right - 19; <br />Rect.Bottom := Rect.Bottom - 19; <br />SendMessage(Memo1.Handle, EM_SETRECT, 0, LongInt(@Rect)); <br />Memo1.Refresh; <br />end; <br /><br /><br />//在系统菜单上添加自定义菜单项 <br />procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND; <br /><br />const <br />idMyFunc = $f200; <br /><br />procedure TForm1.FormCreate(Sender: TObject); <br />begin <br />AppendMenu(GetSystemMenu(Handle, False), MF_STRING, idMyFunc, ’我的系统菜单项’); <br />end; <br /><br />procedure TForm1.WMSysCommand(var Msg: TWMSysCommand); <br />begin <br />inherited; <br />if Msg.CmdType and $FFF0 = idMyFunc then <br /> ShowMessage(’我的系统菜单项’); <br />end; <br /></p><p> </p><p>COOLBAR内嵌TOOLBAR,但是TOOLBAR的按钮偏上的解决办法:把COOLBAR的COOLBAND的BORDERSTYLE设为SINGLE。 <br />另外,如果想把主菜单弄到TOOLBAR里面,只要把TOOLBAR的MENU设为主菜单名,并把主菜单的AUTOMERGE设为TRUE即可。 <br />------------------------------------ <br /><br />listbox从文件中读取列表的操作 <br />ListBox1.Items.LoadFromFile(ExtractFilePath(Application.ExeName)+’aaa.txt’); <br />ListBox1.Items.Add(Edit1.Text); //添加了一个项目 <br />ListBox1.Items.SaveToFile(ExtractFilePath(Application.ExeName)+’aaa.txt’); <br /><br />删除项目ListBox1.Items.Delete(listbox1.itemindex); <br /><br />------------------------------------ <br /><br />判断窗体是否已经打开 <br />if frmPriceInput <> nil then .... <br />注意:有时窗体虽然已经关闭,但没完全释放,最好在该窗体关闭的CLOSE事件里加入 frmPrintInput = nil; <br />------------------------------------ <br />关闭MDI子窗口的方法 <br />在子窗口的OnClose事件处理过程中加入如下代码 <br />Action := caFree; <br /><br />Delphi为一个Form的关闭行为指定了四种方式,分别是: <br /><br />caNone -- 禁止Form被关闭 <br />caHide -- Form不被关闭,但是被隐藏。被隐藏的Form仍然可以被程序访问。 <br />caFree -- Form被关闭,并且释放其占用的资源。 <br />caMinimize -- Form被最小化而不是被关闭,这是MDI子窗口的默认关闭行为。 <br />------------------------------------ <br />系统配置文件 *.INI 的操作 <br />头部要引用IniFiles <br />1、声明变量 <br />Inifile:TiniFile; <br />2、指明路径 <br />IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+’option.ini’); <br />3、读取变量,注意变量有类型之分readstring,readinteger...等 <br />titleBMPfile:=IniFile.ReadString(’TitleImage’,’FileName’,’’); //IniFile.ReadString(’组名’,’变量’,’默认值’) <br />IniFile.ReadInteger <br />IniFile.ReadBool <br />4、写入或修改变量 <br />IniFile.WriteString(’标题’,’变量1’,’值’); <br /><br />5、用完后释放 <br />IniFile.Free; <br /><br />------------------------------------ <br />动态读取图象 <br />Image1.Picture.LoadFromFile(titleBMPFile); <br />------------------------------------ <br />fastreport自定义函数的用法 <br />1、先在普通工程窗体上定义好函数 <br />2、在frreport控件的userfunction中写入 <br /> if ansicomparetext( ’My_StrToRMB’ , Name ) = 0 then <br /> val:=My_StrToRMB(frparser.Calc(p1)); <br />//MY_STRTORMB是函数名 <br />//如果定义多个函数,就多来几个IF即可。 <br />在报表设计视图中就可以调用这个函数了。 <br /><br />------------------------------------ <br />数组是这样定义的 <br />sbh:array [0..9999999,0..1] of string; <br />------------------------------------ <br />treeview的用法 <br />//先定义项目序数和节点 <br />n: Integer; <br />Node: TTreeNode; <br /><br />Node := Tree1.Selected; <br />if (Node = nil) or (Node.StateIndex = -1) then Exit;//一般可以把不作反应的列的stateindex定为-1 <br />n := Node.StateIndex; <br />------------------------------------ <br />Fields[] 通过索引返回字段,要自己選擇返回的類型! <br />FieldByName() 通过名字返回字段,要自己選擇返回的類型! <br />Fieldvalues[] 通过名字返回字段的值,自動化類型! <br />------------------------------------ <br />调用外部程序方法 <br />用ShellExecute,在USES段加入SHELLAPI,使用时如: <br /> ShellExecute(handle,’open’,’c:\myapp\myapp.exe’,’-s’,’’,SW_SHOWNORMAL); <br /> 第一个参数为父窗口句柄; <br /> 第二个参数为打开方式(OPEN,PRINT两种); <br /> 第三个参数为执行文件全路径; <br /> 第四个参数为执行文件参数; <br /> 第五个参数为执行文件开始运行时的初始目录; <br /> 第六个参数为为执行文件运行方式(SW_HIDE,SW_MAXIMIZE,SW_MINIMIZE, <br />SW_RESTORE,SW_SHOW,SW_SHOWDEFAULT,SW_SHOWMAXIMIZED,SW_SHOWMINIMIZED, <br />SW_SHOWMINNOACTIVE,SW_SHOWNA,SW_SHOWNOACTIVATE,SW_SHOWNORMAL); <br />------------------------------------ <br />判断文件是否存在 <br />if not fileexists(’db2.mdb.bak’) then ... <br />------------------------------------ <br />判断按键 <br />if Key=#13 then //如果回车则。。。 <br />------------------------------------ <br />退出 <br /><br />关闭窗口 close; <br />关闭程序:Application.Terminate; <br />退出事件 exit; <br />------------------------------------ <br />检测软件是否已在运行 <br />if GetLastError = ERROR_ALREADY_EXISTS then... <br />------------------------------------ <br />定义函数是这样写的 <br />function IsReadOnly(b: Boolean; colors: Tcolor): Boolean; <br />------------------------------------ <br />fastreport直接打印 <br />FrReport1.PrepareReport; //初始化 <br />FrReport1.PrintPreparedReport(’1’,1,True,frAll); //打印 <br /><br />预览FrReport1.showreport; <br />------------------------------------ <br />找开浏览器,进入某站点。(或调用WINDOWS程序) <br /><br />进入站点ShellExecute(Handle, PChar(’OPEN’), PChar(’http://www.devexpress.com/downloads/index.asp’), nil, nil, SW_SHOWMAXIMIZED); <br />发送邮件ShellExecute(Handle, ’open’, PChar(’mailto:’ + edtemail.Text + ’?subject=’), nil, nil, SW_SHOW); <br /><br />------------------------------------ <br />打开文件对话框 <br />if OpenPictureDialog.Execute then <br /><br /><br />------------------------------------ <br />调用帮助文件 <br />Application.HelpFile := ’..\..\Help\eBars.hlp’; <br /><br /><br />------------------------------------ <br />打开窗口 <br />TForm1.Create(self).ShowModal; <br /><br /><br />------------------------------------ <br />取得当前执行程序的路径 <br />FPath := ExtractFilePath(Application.ExeName); <br />或 <br />FileName := ExtractFilePath(ParamStr(0)) + ’\MDB\电子通讯录.mdb’; <br /><br />------------------------------------ <br />当前路径 <br />getcurrentdir <br /><br /><br />------------------------------------ <br />判断当前鼠标处于某个位置(TAG) <br /> case TComponent(Sender).Tag of <br /> 0: begin <br /> ... <br /> lbBarBackgroud.Caption := sCustomImage; <br /> end; <br /> 1: begin <br /> ... <br /> lbBarBackgroud.Caption := sCustomImage; <br /> end; <br /> 2: begin <br /> ... <br /> lbBarBackgroud.Caption := sCustomImage; <br /> end; <br />------------------------------------ <br />数据库连接 <br /><br />1、建立一个adoconnection控件,命名为conn <br />2、建立一个adodataset控件,命名为ds <br /><br />然后就可以用以下语句连接并执行SQL查询(本例是access的数据库,带密码)。 <br /><br />conn.ConnectionString:=’Provider=Microsoft.Jet.OLEDB.4.0;Data Source=’+getcurrentdir+’\data\pn.mdb;Persist Security Info=False;jet oledb:database password=80513’; <br />conn.Connected:=true; <br />ds.Active:=false; <br />ds.CommandText:=’select 拜访日期,拜访时间,拜访客户,拜访地点,谈话内容 from khbf order by 拜访日期 desc’; <br />ds.Active:=true; <br />------------------------------------ <br />ADODataSet1.State的用法 <br />if ADODataSet1.State in [dsEdit,dsInsert] then <br /> ADODataSet1.Post ; <br />------------------------------------ <br />ADOQuery.open和ADOQuery.execSQL的区别 <br />用于存贮时如insert 只能用execSQL <br />------------------------------------ <br />------------------------------------ <br />------------------------------------ <br />------------------------------------ <br />回车光标移到另一个输入框 <br /><br />if key=#13 then <br />cmb_name.SetFocus; <br /><br />------------------------------------ <br />播放声音 <br />playsound(’c:\windows\media\start.wav’,0,SND_ASYNC); <br />------------------------------------ <br />列表框listbox增加项目 <br /><br />cmb_name.Items.Add(adotable1.Fieldvalues[’帐号’]); <br /><br /><br />------------------------------------ <br />listview用法 <br /><br />ListView.Selected := ListView.Items[0]; <br />ListView.Selected.Focused := True; <br />ListView.Selected.MakeVisible(False); <br />ListView.Selected.Index <br />ListView.Items.Count <br />ListView.Items.Delete(3) //删除第3个项目 <br />ListView.Items.Add.Caption:=’dddddddd’; //增加一个项目 <br /><br />ListView.Items.BeginUpdate; <br />ListView.Items.EndUpdate <br />ListView.Canvas.Font.Color := clGrayText; <br />if ListView.Selected <> nil then。。。。。 <br /><br />//往listview添加项目 <br />先定义 <br />var itm: TListItem; <br />然后 <br />listview.Items.Clear; <br />itm := listview.Items.Add; <br />itm.ImageIndex := 5; <br />itm.Caption := Msg.Subject; <br />itm.SubItems.Add(’aaaaa’); <br />itm.SubItems.Add(’ffffff’); <br />itm.SubItems.Add(’ffdfdfdf’); <br />itm.SubItems.Add(’oooo’); <br />------------------------------------ <br />静态调用DLL的方法 <br /><br />有参数 <br />procedure CreateSms(Text: Pchar);stdcall;External ’SmsLib.dll’; <br />无参数 <br />procedure CreateSms;stdcall;External ’SmsLib.dll’; <br />------------------------------------ <br />确定、取消对话框作用 <br /><br />if application.MessageBox(’真的退出?’,’提示’,mb_okcancel)=idok then <br />application.Terminate; //Terminate是终止程序 <br /><br />showmessage(’请先选中要修改的班级’); //这个是简单的显示提示框 <br />messagebox(self.Handle ,’价格输入不合法!’,’提示’,MB_OK or MB_ICONASTERISK); <br />------------------------------------ <br />调用窗体的步骤 <br /><br />先引用该窗体的单元,然后建立窗体,最后显示出来。 <br />例1: <br />use uxsgl; <br />Application.CreateForm(TFmXsgl, FmXsgl); <br />fmxsgl.ShowModal; <br /><br />例2: <br />Frm_LendDetail:=TFrm_LendDetail.Create(self); <br />Try <br /> Frm_LendDetail.ShowModal; <br />Finally <br /> Frm_LendDetail.Free; <br />End; <br />------------------------------------ <br />数据库查询 <br /><br />先建立数据源,然后添加一个TADOQUERY <br />adoquery1.SQL.Clear ; <br />adoquery1.Close; <br />adoquery1.SQL.Add(’select * from tkcb order by ckcb_kh’); <br />adoquery1.Open; <br /><br />aaa=adoquery1.Fieldvalues[’ckcb_kc’]; //取出当前记录某字段的值 <br />adoquery1.Next; //下一记录 <br />adoquery1.Close; //关闭查询 <br /><br />------------------------------------ <br />判断键盘输入字符-chr(13)是回车 <br /><br />if key=chr(13) then <br /> bitbtn1.SetFocus; <br />------------------------------------ <br />时间格式 <br /><br />lblTime.Caption := FormatDateTime(’yyyymmdd hh:nn:ss’,Now); <br /><br />------------------------------------ <br />表数据的添加添加 <br /><br />dmd是数据模块 tbl_zgdb是表名 <br />with dmd.tbl_zgdb do begin <br /> Append; <br /> Fieldvalues[’HYZH’] := Edt_HYZH.text; <br /> Fieldvalues[’XM’] := Edt_xm.text; <br /> Fieldvalues[’XB’] := Edt_xb.text; <br /> Fieldvalues[’dw’] := Edt_dw.text; <br /> Fieldvalues[’ZZMM’] := zzmm; <br /> Fieldvalues[’CSNY’] := trim(Edt_csny.text); <br /> Fieldvalues[’GZSJ’] := Edt_gzsj.text; <br /> Fieldvalues[’DBLB’] := dblb; <br /> Fieldvalues[’ZCLB’] := zclb; <br /> Fieldvalues[’XL’] := xl; <br /> Fieldvalues[’BZ’] := Edt_bz.text; <br /> Post; <br /> close; <br />end; <br />------------------------------------ <br />列表框的选项值 <br /><br />Edit1.Text:=listbox1.Items.Strings[listbox1.itemindex]; <br />------------------------------------ <br />Delphi键盘按键伪码 <br />用法:if key = chr(VK_RETURN) then... <br /><br />常数名称 十六进制值 十进制值 对应按键 <br />VK_LBUTTON 01 1 鼠标的左键 <br />VK_RBUTTON 02 2 鼠标的右键 <br />VK-CANCEL 03 3 Contol-break 执行 <br />VK_MBUTTON 04 4 鼠标的中键(三按键鼠标) <br />VK_BACK 08 8 Backspace键 <br />VK_TAB 09 9 Tab键 <br />VK_CLEAR 0C 12 Clear键 <br />VK_RETURN 0D 13 Enter键 <br />VK_SHIFT 10 16 Shift键 <br />VK_CONTROL 11 17 Ctrl键 <br />VK_MENU 12 18 Alt键 <br />VK_PAUSE 13 19 Pause键 <br />VK_CAPITAL 14 20 Caps Lock键 <br />VK_ESCAPE 1B 27 Ese键 <br />VK_SPACE 20 32 Spacebar键 <br />VK_PRIOR 21 33 Page Up键 <br />VK_NEXT 22 34 Page Domw键 <br />VK_END 23 35 End键 <br />VK_HOME 24 36 Home键 <br />VK_LEFT 25 37 LEFT ARROW 键(←) <br />VK_UP 26 38 UP ARROW键(↑) <br />VK_RIGHT 27 39 RIGHT ARROW键(→) <br />VK_DOWN 28 40 DOWN ARROW键(↓) <br />VK_SELECT 29 41 SELECT键 <br />VK_EXECUTE 2B 43 EXECUTE键 <br />VK_SNAPSHOT 2C 44 Print Screen键 <br />VK_INSERT 2D 45 Ins键 <br />VK_DELETE 2E 46 Del键 <br />VK_HELP 2F 47 Help键 <br />VK_0 30 48 0键 <br />VK_1 31 49 1键 <br />VK_2 32 50 2键 <br />VK_3 33 51 3键 <br />VK_4 34 52 4键 <br />VK_5 35 53 5键 <br />VK_6 36 54 6键 <br />VK_7 37 55 7键 <br />VK_8 38 56 8键 <br />VK_9 39 57 9键 <br />VK_A 41 65 A键 <br />VK_B 42 66 B键 <br />VK_C 43 67 C键 <br />VK_D 44 68 D键 <br />VK_E 45 69 E键 <br />VK_F 46 70 F键 <br />VK_G 47 71 G键 <br />VK_H 48 72 H键 <br />VK_I 49 73 I键 <br />VK_J 4A 74 J键 <br />VK_K 4B 75 K键 <br />VK_L 4C 76 L键 <br />VK_M 4D 77 M键 <br />VK_N 4E 78 N键 <br />VK_O 4F 79 O键 <br />VK_P 50 80 P键 <br />VK_Q 51 81 Q键 <br />VK_R 52 82 R键 <br />VK_S 53 83 S键 <br />VK_T 54 84 T键 <br />VK_U 55 85 U键 <br />VK_V 56 86 V键 <br />VK_W 57 87 W键 <br />VK_X 58 88 X键 <br />VK_Y 59 89 Y键 <br />VK_BZ 5A 90 Z键 <br />VK_NUMPAD0 60 96 数字键0键 <br />VK_NUMPAD1 61 97 数字键1键 <br />VK_NUMPAD2 62 98 数字键2键 <br />VK_NUMPAD3 63 99 数字键3键 <br />VK_NUMPAD4 64 100 数字键4键 <br />VK_NUMPAD5 65 101 数字键5键 <br />VK_NUMPAD6 66 102 数字键6键 <br />VK_NUMPAD7 67 103 数字键7键 <br />VK_NUMPAD8 68 104 数字键8键 <br />VK_NUMPAD9 69 105 数字键9键 <br />VK_MULTIPLY 6A 106 *键 <br />VK_ADD 6B 107 +键 <br />VK_SEPARATOR 6C 108 Separator键 <br />VK_SUBTRACT 6D 109 -键 <br />VK_DECIMAL 6E 110 .键 <br />VK_DIVIDE 6F 111 键 <br />VK_F1 70 112 F1键 <br />VK_F2 71 113 F2键 <br />VK_F3 72 114 F3键 <br />VK_F4 73 115 F4键 <br />VK_F5 74 116 F5键 <br />VK_F6 75 117 F6键 <br />VK_F7 76 118 F7键 <br />VK_F8 77 119 F8键 <br />VK_F9 78 120 F9键 <br />VK_F10 79 121 F10键 <br />VK_F11 7A 122 F11键 <br />VK_F12 7B 123 F12键 <br />VK_NUMLOCK 90 144 Num Lock 键 <br />VK_SCROLL 91 145 Scroll Lock键 <br /></p><p>1、判断机器是否网络状态 <br />答: <br />uses WinInet; <br />procedure TForm1.Button1Click(Sender: TObject); <br />function GetOnlineStatus : Boolean; <br />var ConTypes : Integer; <br />begin <br />ConTypes := INTERNET_CONNECTION_MODEM + INTERNET_CONNECTION_LAN + INTERNET_CONNECTION_PROXY; <br />if (InternetGetConnectedState(@ConTypes, 0) = False) <br />then Result := False <br />else Result := True; <br />end; <br />begin <br />if not GetOnlineStatus then ShowMessage(’Not Connected’); <br />end; <br /><br />========================================= <br /><br />2、[DELPHI]窗体渐渐出现 <br />答: <br />AnimateWindow(Handle,1000,AW_CENTER); <br />//在窗体创建事件中 <br /><br />========================================= <br /><br />3、如何取得一台机器的CPU占用率 ? <br />答: <br />使用下面的方法 <br />interface <br /><br />uses <br />Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, <br />Dialogs, StdCtrls; <br /><br />const <br />SystemBasicInformation = 0; <br />SystemPerformanceInformation = 2; <br />SystemTimeInformation = 3; <br /><br />type <br />TPDWord = ^DWORD; <br /><br />TSystem_Basic_Information = packed record <br />dwUnknown1: DWORD; <br />uKeMaximumIncrement: ULONG; <br />uPageSize: ULONG; <br />uMmNumberOfPhysicalPages: ULONG; <br />uMmLowestPhysicalPage: ULONG; <br />uMmHighestPhysicalPage: ULONG; <br />uAllocationGranularity: ULONG; <br />pLowestUserAddress: Pointer; <br />pMmHighestUserAddress: Pointer; <br />uKeActiveProcessors: ULONG; <br />bKeNumberProcessors: byte; <br />bUnknown2: byte; <br />wUnknown3: word; <br />end; <br /><br />type <br />TSystem_Performance_Information = packed record <br />liIdleTime: LARGE_INTEGER; {LARGE_INTEGER} <br />dwSpare: array[0..75] of DWORD; <br />end; <br /><br />type <br />TSystem_Time_Information = packed record <br />liKeBootTime: LARGE_INTEGER; <br />liKeSystemTime: LARGE_INTEGER; <br />liExpTimeZoneBias: LARGE_INTEGER; <br />uCurrentTimeZoneId: ULONG; <br />dwReserved: DWORD; <br />end; <br /><br />var <br />NtQuerySystemInformation: function(infoClass: DWORD; <br />buffer: Pointer; <br />bufSize: DWORD; <br />returnSize: TPDword): DWORD; stdcall = nil; <br /><br /><br />liOldIdleTime: LARGE_INTEGER = (); <br />liOldSystemTime: LARGE_INTEGER = (); <br />SysBaseInfo: TSystem_Basic_Information; <br />SysPerfInfo: TSystem_Performance_Information; <br />SysTimeInfo: TSystem_Time_Information; <br />status: Longint; {long} <br />dbSystemTime: Double; <br />dbIdleTime: Double; <br />function GetCPUUsage:Double; <br />implementation <br />function Li2Double(x: LARGE_INTEGER): Double; <br />begin <br />Result := x.HighPart * 4.294967296E9 + x.LowPart <br />end; <br /><br />function GetCPUUsage:Double; <br />var <br />bLoopAborted : boolean; <br />begin <br />if @NtQuerySystemInformation = nil then <br />NtQuerySystemInformation := GetProcAddress(GetModuleHandle(‘ntdll.dll‘), <br />‘NtQuerySystemInformation‘); <br />// get number of processors in the system <br />status := NtQuerySystemInformation(SystemBasicInformation, @SysBaseInfo, SizeOf(SysBaseInfo), nil); <br />if status <> 0 then Exit; <br />// Show some information <br />{with SysBaseInfo do <br />begin <br />ShowMessage( <br />Format(‘uKeMaximumIncrement: %d‘#13‘uPageSize: %d‘#13+ <br />‘uMmNumberOfPhysicalPages: %d‘+#13+‘uMmLowestPhysicalPage: %d‘+#13+ <br />‘uMmHighestPhysicalPage: %d‘+#13+‘uAllocationGranularity: %d‘#13+ <br />‘uKeActiveProcessors: %d‘#13‘bKeNumberProcessors: %d‘, <br />[uKeMaximumIncrement, uPageSize, uMmNumberOfPhysicalPages, <br />uMmLowestPhysicalPage, uMmHighestPhysicalPage, uAllocationGranularity, <br />uKeActiveProcessors, bKeNumberProcessors])); <br />end; <br />} <br />bLoopAborted := False; <br />while not bLoopAborted do <br />begin <br />// get new system time <br />status := NtQuerySystemInformation(SystemTimeInformation, @SysTimeInfo, SizeOf(SysTimeInfo), 0); <br />if status <> 0 then Exit; <br />// get new CPU‘s idle time <br />status := NtQuerySystemInformation(SystemPerformanceInformation, @SysPerfInfo, SizeOf(SysPerfInfo), nil); <br />if status <> 0 then Exit; <br />// if it‘s a first call - skip it <br />if (liOldIdleTime.QuadPart <> 0) then <br />begin <br />// Currentvalue = Newvalue - Oldvalue <br />dbIdleTime := Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime); <br />dbSystemTime := Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime); <br />// CurrentCpuIdle = IdleTime / SystemTime <br />dbIdleTime := dbIdleTime / dbSystemTime; <br />// CurrentCpuUsage% = 100 - (CurrentCpuIdle * 100) / NumberOfProcessors <br />dbIdleTime := 100.0 - dbIdleTime * 100.0 / SysBaseInfo.bKeNumberProcessors + 0.5; <br />// Show Percentage <br />//Form1.Label1.Caption := FormatFloat(‘CPU Usage: 0.0 %‘,dbIdleTime); <br />//Application.ProcessMessages; <br />// Abort if user pressed ESC or Application is terminated <br />Result:=dbIdleTime; <br />bLoopAborted:=True; <br />//bLoopAborted := (GetKeyState(VK_ESCAPE) and 128 = 128) or Application.Terminated; <br />end; <br />// store new CPU‘s idle and <br /> <br /><br />========================================= <br /><br />4、动态生成控件? <br />答: <br />var <br />TeSpeedButtonX:TTeSpeedButton; <br />begin <br />TeSpeedButtonX:=TTeSpeedButton.Create(nil); <br />TeSpeedButtonX.Caption:=’标题’; <br />TeSpeedButtonX.Name:=’按钮’+inttostr(X); <br />TeSpeedButtonX.Parent:=Tetoolbar2; <br />X:=X+1; <br />end; <br /><br />========================================= <br /><br />5、我动态创建了多个button,使用时,我怎么判断出用户点击的是哪个button呢?button的各项属性都边成最后创建的那个button的了,怎么办哦? <br />答1: <br />教你一招,先设置每个button的tag属性.然后在onclick事件中用(sender as button).tag来判断,相信我,没错的! <br /><br />答2: <br />如果你生成的控件不是很多的话,最简单的方法就是,假如你生成控件的父控件是FORM1,利用循环判断控件是否等于FORM1.ACTIVECONTROL,我就是这么用的。ACTIVECONTROL就是记录当前被点击的控件,你也可以直接用它,不过直接只能用到CONTROL的一般属性和方法,循环判断的话就可以用到你生成控件的相关属性。 <br /><br />========================================= <br /><br />6、窗体释放问题 <br />答: <br />在Form2.OnClose事件中 <br />Action:=caFree;</p><p>1、怎么样在delphi中调动其它*.exe文件? <br />例如:winexec(’d:\郑洽\Project1.exe’,sw_show); <br /><br />================================ <br /><br />2、如何让工程运行时主窗体就是最大化的? <br />答:设置主窗体的WindowsState属性为wsMaximized就可以了! <br />wsNormal 窗体以普通状态显示 <br />wsMinimized 窗体以最小化状态显示。 <br />wsMaximized 窗体以最大化状态显示。 <br /><br />================================ <br /><br />3、我想先->闪现窗体->主窗体->登录窗体,工程源文件怎么设置? <br />答: <br />⒈开始一个新工程。给表格起名为MainForm,MainForm的单元起名为Main, 工程文 件起名为Test。 <br />⒉在MainForm中插入一个Button部件,将其Caption属性设为“关闭”,为该部件 的onClick事件创建一个过程,并在过程的begin和end之间插入Close语句。 <br />⒊在应用程序添加一个表格,将这个表格起名为MoveForm,MoveForm 的单元起名 为Move。 <br />⒋为便于演示,在MoveForm中插入一个Label部件,设置其Caption 属性为“欢迎 进入本系统”。 <br />5.下一步修改工程的源代码。选择View/Project Source,修改begin和end之间的 语句如下: <br />程序清单Test.Dpr <br />program Test <br />uses <br />forms, <br />Main in ’MAIN.PAS’{MainForm}, <br />Move in ’Move.PAS’{MoveForm} <br /><br />{$R *.RES} <br /><br />begin <br />MoveForm:=TMoveForm.Create(Application);{Create创建闪现窗口对象} <br />MoveForm.Show; <br />MoveForm.Update; <br />Application.CreateForm(TMainForm,MainForm); <br />MoveForm.Hide; <br />MoveForm.Free;{Free从内存中释放对象} <br />Application.Run; <br />end. <br /> 第一条语句创建了对象,该对象存在内存中,但还不能看见, 为了让它出现并更 新它的内容,调用对象的Show和Update成员函数:Show和Update。 当闪现窗口使 用完后,用Hide函数将它隐藏起来,然后用Free函数释放它所占据的内存。 <br />6.如果此刻你编译和运行程序,MoveForm窗口一闪而过, 你可能未来得及看 清。为使MoveForm窗口显示几秒种,我们可为MainForm的OnCreate 事件创建一个 处理程序,延迟MoveForm窗口的显现时间。 <br />program TMainForm.FormCreate(sender:Tobject); <br />var <br />currentTime:LongInt; <br />begin <br />currentTime:=GetTickCount div 1000; <br />while ((GetTickCount div 1000)<(currentTime+3) do <br />{不做任何事); <br />end; <br />end. <br /> GetTickCount函数返回窗口启动后过去的毫秒数,这个值除以1000 转化为秒数。 此时你编译运行程序,就能得到一个延迟3秒多的闪现窗口。 <br />为闪现窗口添加上Image部件,再对字体及窗口进行修饰,我们就能为应用程 序,创建一个精美的封面或在程序启动时显示重要提示。 <br /><br />制作登录窗体一个很方便的方法就是主窗体作为主窗体,登录成功Hide掉就行了。 <br />如果登录窗体不可以作为主窗体,那么和闪现窗体一样的方法创建登录窗体,加在Application.Run;之前,MoveForm.Free;之后, <br />用showmodal显示登录窗体 <br /><br />================================ <br /><br />4、button上面的文字怎么样换行? <br />答: <br />button控件不行 <br />bitbtn控件可以。 <br />bitbtn1.caption:=’aaaa’#13’bbbbb’ <br /><br />================================ <br /><br />5、怎么样判别焦点是否在某个控件上? <br />答: <br />if Tobject.focused then <br />//焦点在某某控件上 <br />else <br /><br />================================ <br /><br />6、怎么样在程序中使一个节点的子节点展开及收闭? <br />答: <br />treeview1.selected.Expanded; //判断节点的子节点是否展开True展开,否则闭拢 <br />treeview1.selected.Expand(True);//子节点展开 <br />treeview1.selected.collapse(True)://子节点闭拢 <br /><br />树节点全部展开: <br />procedure TForm1.Button1Click(Sender: TObject); <br />var node:TTreeNode; <br />begin <br />if treeview1.Items[0]<>nil then <br />begin <br /> node:=treeview1.Items[0]; <br /> node.Expand(true); <br /> while node.getNextSibling<>nil do <br /> begin <br /> node:=node.getNextSibling; <br /> node.Expand(true); <br /> end; <br />end; <br />end; <br /><br /><br />树节点全部收缩: <br />procedure TForm1.Button2Click(Sender: TObject); <br />var node:TTreeNode; <br />begin <br />if treeview1.Items[0]<>nil then <br />begin <br /> node:=treeview1.Items[0]; <br /> node.Collapse(true); <br /> while node.getNextSibling<>nil do <br /> begin <br /> node:=node.getNextSibling; <br /> node.Collapse(true); <br /> end; <br />end; <br />end; <br /><br />================================ <br /><br />7、如何用delphi编程实现给access数据库加密码? <br />答:1,新建Project。 <br /> 2,在FORM中放入ADOConnection控件。 <br /> 3,双击ADOConnection控件,然后点击Build...按钮,在“提供者”页中选择“Microsoft Jet 4.0 OLE DB Provider”,然后点击“下一步”按钮,在“连接”页中选择要连接的Access数据库的路径和数据库的文件名,这时如果点“测试连接”按钮时,出现“初始化提供者时发生错误,测试连接失败,密码无效”的错误提示。 <br /> 4,这时点“所有”页,然后双击“Jet OLEDB:Database Password”,出现对话框,添入密码后,选择“连接”页中的“测试连接”按钮,出现“测试连接成功”的对话框。把ADOConnection控件的LoginPromtp设为false. <br /> 5,设置连接完成。 <br /><br />================================ <br /><br />8、如何判断Treeview中我选中的节点是否有子节点?如果没有给出提示啊? <br />答: <br />if Treeview.Selected.HasChildren then <br />//有 <br />else <br />//无 <br /><br />var <br />Node :TTreeNode; <br />begin <br />Node :=TreeView1.Selected; <br />if Node.HasChildren then <br />.... <br />对复杂的程序最好用Node过渡 <br /><br />================================ <br /><br />9、能否解释一下try...except...end及try...finally...end;? <br />1.(1)是用于扑捉异常,(2)是用于保证代码执行的完整性 <br />2.(1)中finally处的代码不管什么情况都会被执行,(2)中except处的代码仅在发生异常时才会执行 <br />3.try finally之间的代码虽可保证finally 和 end之间的程序能执行,但不能保证程序不崩溃, <br />而try except就不会使程序崩溃 <br /><br />================================ <br /><br />10、怎么样在主程序控制器中加入音乐? <br />在implementation下加入 mmsystem單元(windows多媒體函數動態聯結庫)。然後在的onShow,onCreate事件中編寫代碼:sndplaysound(’sound.wav’,snd_async) <br /><br />================================ <br /><br />11、我在form1上有四个edit,输完后我想用下上箭头键进行上移下移?怎么办? <br />答: <br />procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; <br />Shift: TShiftState); <br />begin <br />if key=vk_down then perform(WM_NEXTDLGCTL,0,0) else <br />if key=vk_up then perform(WM_NEXTDLGCTL,1,0); <br />end; <br /><br />================================ <br /><br />12、如何用delphi5实现读文本文件指定的一行,并得到文本文件的总行数?谢谢! <br />答: <br />Delphi读文件文件一般使用Readln过程,如要读第3行可以这样: <br /> var <br /> i : Integer; <br /> F: TextFile; <br /> S: string; <br /> begin <br /> if OpenDialog1.Execute then { Display Open dialog box } <br /> begin <br /> AssignFile(F, OpenDialog1.FileName); { File selected in dialog } <br /> Reset(F); <br /> For i = 1 To 3 Do <br /> Readln(F, S); <br /> Edit1.Text := S; { Put string in a TEdit control } <br /> CloseFile(F); <br /> . <br /> end; <br /> 要统计总行数,只能从头逐行读,直到文件尾(Eof函数为True),每读一行计数器加1。 <br /> 不过由于文本文件的每行长度不相等,它不能象数据库文件那样想读那行就读哪行,只能顺序读。 <br /> 上面的方法容易理解,也容易实现。如果希望提高速度,编程上要麻烦一些,可以以二进制方式打开文件,将所有内容读入一个内存变量,然后使用Pos函数查找其中的回车(#13)个数,这样可以快速地统计总行数并能快速地找到指定行。 <br /><br />================================ <br /><br />13、制作主窗口显示前的版权窗口 <br />答: <br />在工程文件中选File->New Form新建一个窗口,设计好窗口的外观。给窗口起名为AboutBox,选Project->Options,将新建的窗口从自动建立中去掉。 选View->Project Source,打开工程文件的源文件,在下面加入红色的句子。 <br />Uses AboutBox <br />Var <br />lTime :TDateTime; <br />Begin <br />Application.Initialize(); <br />AboutBox=TAboutBox.Create(AboutBox); <br />AboutBox.Show; <br />AboutBox.Update; <br />lTime=GetTickCount; <br />Application.CreateForm(TMainForm,MainForm); <br />while((GetTickCount-lTime) / 1000 <3) do; <br />AboutBox.Hide; <br />AboutBox.Free; <br />Application.Run; <br />end; <br /><br />================================ <br /><br />14、Delphi中RichEdit的奥妙 <br /> 一、如何得知当前行号 <br /> 用RichEdit(或者memo)控件制作文本编辑器时,通过访问lines?count属性可以得到总行数,但是若想知道光标当前所在行的行号就麻烦了,因为delphi没有提供这个属性。要实现这个编辑器必备功能,就须调用em_ LineFromChar。 <br /><br /> 请试试下面的程序。 <br /> 先在窗口中布置一个RichEdit或者memo(命名为editor),以及一个button。在button的onclick事件中写入下列代码。 <br /> var <br /> CurrentLine:Integer; <br /> begin <br /> CurrentLine:=Editor.Perform(em_ LineFromChar,SFFFF,0); <br /> Application.MessageBox(PChar(′当前行号是′+IntToStr(CurrentLine)),′消息′,mb_ iconinformation); <br /> end; <br /> 需要注意的是,第一行的行号为零。 <br /><br /> 二、如何撤消操作(undo) <br /> 对于memo来说,实现undo是不需编程的,只要让popupmenu属性为空,运行时就能用鼠标右键激活一个常用操作菜单,其中包括撤消、剪切、复制、粘贴、删除和全选六项。 但可惜的是,这一招对于功能强大的RichEdit控件居然行不通,害得我们还要自己设计一个popupmemu。当你用CutToClipBoard等语句轻松而顺利地完成了“剪切”等功能,接着便会无奈地发现,竟找不到undo或cancel之类的语句来执行“撤消”。 这时你需要这样处理: <br /> RichEdit1?Perform(EM_UNDO,0,0); <br /> 另外还应检查是否允许撤消,从而开启或关闭弹出菜单中的“撤消”项: <br /> Undo1?Enabled:=RichEdit? <br /> Perform(EM_CANUNDO,0,0)<>0; <br />以上程序在Delphi3中调试通过。 <br /><br /><br />================================ <br /><br />15、在主窗口中打开另一个独立的窗口,而这个被打开的窗口固定显示在..? <br />答: <br />procedure TForm2.FormCreate(Sender: TObject); <br />begin <br />form2.Hide; <br />self.Parent:=form1.Panel1; <br />end; <br /><br />================================ <br /><br />16、SaveDialog1确认文件存不存在的办法? <br />答: <br />procedure TForm1.SaveDialog1CanClose(Sender: TObject; <br />var CanClose: Boolean); <br />begin <br />if FileExists(SaveDialog1.FileName) then //如果文件已经存在 <br />if MessageDlg(’文件已经存在,保存吗?’, mtConfirmation, [mbYes, mbNo], 0) <> mrYes then <br />Button2.Click ; //如果选择了覆盖,则退出,否则,重新让用户选择文件 <br />end; <br /><br />================================ <br /><br />17、正确关闭一个MDI子窗口? <br />答: <br />Delphi中MDI子窗口的关闭方式默认为缩小而不是关闭,所以当你单击子窗口右上角的关闭按钮时会发觉该子窗口只是最小化,而不是你预期的那样被关闭。解决办法是在子窗口的OnClose事件处理过程中加入如下代码,示例: <br /><br />procedure ChildForm.OnClose(Sender: TObject; var Action: TCloseAction); <br />begin <br />Action := caFree; <br />end; <br /><br /> Delphi为一个Form的关闭行为指定了四种方式,分别是: <br /><br />caNone 禁止Form被关闭 <br />caHide Form不被关闭,但是被隐藏。被隐藏的Form仍然可以被程序访问。 <br />caFree Form被关闭,并且释放其占用的资源。 <br />caMinimize Form被最小化而不是被关闭,这是MDI子窗口的默认关闭行为。 <br /><br /><br />================================ <br /><br />18、怎样记MDI子窗口不在母体运行时就被打开? <br />答: <br /> 在project下的options中forms里面除了form1外,其余的移到右边的框里,然后在调用显示的按钮下编写语句,以form2调用为例: <br /> form2:=Tform2.create(self); <br /> form2.show; <br /><br />================================ <br /><br />19、限制FORM的大小 <br />答: <br />在FORM私有声明部分加上如下一行: <br /><br />procedure WMGetMinMaxInfo( var Message:TWMGetMinMaxInfo );message WM_GETMINMAXINFO; <br />在声明部分加上如下几行: <br />procedure TForm1.WMGetMinMaxInfo( var Message :TWMGetMinMaxInfo ); <br />begin <br />with Message.MinMaxInfo^ do <br />begin <br />ptMaxSize.X := 200; {最大化时宽度} <br />ptMaxSize.Y := 200; {最大化时高度} <br />ptMaxPosition.X := 99; {最大化时左上角横坐标} <br />ptMaxPosition.Y := 99; {最大化时左上角纵坐标} <br />end; <br />Message.Result := 0; {告诉Windows你改变了 minmaxinfo} <br />inherited; <br />end; <br /><br />================================ <br /><br />20、随机数生成法 <br />答: <br />Randomize; <br />rn:=inttostr(random(9999)); <br />rn1:=inttostr(random(9999)); <br />..... <br /><br />================================ <br /><br />21、怎样把程序隐藏起来,在WINDOWS界面上没有显示?? <br />答: <br />在application.run之前加入application.showmain:=false! <br /><br />================================ <br /><br />22、怎样将一个form1.free的form1窗体重新显示? <br />答: <br />form2:=TForm2.Create(application); <br />form2.Show; <br /><br />如果你要创建的Form2窗体能嵌入一个Panel中,指定Parent: <br />form2:=TForm2.Create(application); <br />form2.Parent:=panel1; <br />form2.Show; <br /><br />================================ <br /><br />23、我想在bitbtn上设快捷按钮Esc,怎么办? <br />答: <br />procedure TForm1.BitBtn1KeyDown(Sender: TObject; var Key: Word; <br />Shift: TShiftState); <br />begin <br />if key=27 then <br />application.Terminate; <br />end; <br /><br />设它的cancel属性为true就行了~~ <br /><br />================================ <br /><br />24、什么叫做托盘区? <br />答: <br />托盘区就是在windows的状态栏下方显示时钟、输入法状态的地方, <br /><br />要把你的程序显示在托盘区: <br />下面是一个托盘类,只要把下面粘贴到文本文件中,改成TrayIcon.pas,使用时uses TrayIcon就可以了。 <br /><br />先声明一个全局变量: <br />var tray:TTrayNotifyIcon; <br /><br />然后在窗体的OnCreate事件中: <br />tray:=TTrayNotifyIcon.Create(self);//将窗体创建为托盘 <br />tray.Icon:=application.Icon;//定义托盘的显示图标 <br />tray.IconVisible:=true;//托盘可见 <br />tray.PopupMenu:=popmenu;//给托盘定义一个右击时的弹出菜单 <br />tray.OnDblClick:=trayDblClick;//给托盘定义一个双击事件(当然要自己写了,不过多数情况只有一行,就是Form1.show); <br /><br /><br />unit TrayIcon; <br /><br />interface <br /><br />uses Windows, SysUtils, Messages, ShellAPI, Classes, Graphics, Forms, Menus, <br />StdCtrls, ExtCtrls; <br /><br />type <br />ENotifyIconError = class(Exception); <br /><br />TTrayNotifyIcon = class(TComponent) <br />private <br /> FDefaultIcon: THandle; <br /> FIcon: TIcon; <br /> FHideTask: Boolean; <br /> FHint: string; <br /> FIconVisible: Boolean; <br /> FPopupMenu: TPopupMenu; <br /> FonClick: TNotifyEvent; <br /> FOnDblClick: TNotifyEvent; <br /> FNoShowClick: Boolean; <br /> FTimer: TTimer; <br /> Tnd: TNotifyIconData; <br /> procedure SetIcon(value: TIcon); <br /> procedure SetHideTask(value: Boolean); <br /> procedure SetHint(value: string); <br /> procedure SetIconVisible(value: Boolean); <br /> procedure SetPopupMenu(value: TPopupMenu); <br /> procedure SendTrayMessage(Msg: DWORD; Flags: UINT); <br /> function ActiveIconHandle: THandle; <br /> procedure OnButtonTimer(Sender: TObject); <br />protected <br /> procedure Loaded; override; <br /> procedure LoadDefaultIcon; virtual; <br /> procedure Notification(AComponent: TComponent; <br /> Operation: TOperation); override; <br />public <br /> constructor Create(AOwner: TComponent); override; <br /> destructor Destroy; override; <br />published <br /> property Icon: TIcon read FIcon write SetIcon; <br /> property HideTask: Boolean read FHideTask write SetHideTask default False; <br /> property Hint: String read FHint write SetHint; <br /> property IconVisible: Boolean read FIconVisible write SetIconVisible default False; <br /> property PopupMenu: TPopupMenu read FPopupMenu write SetPopupMenu; <br /> property onClick: TNotifyEvent read FonClick write FonClick; <br /> property OnDblClick: TNotifyEvent read FOnDblClick write FOnDblClick; <br />end; <br /><br />implementation <br /><br />{ TIconManager } <br />{ This class creates a hidden window which handles and routes } <br />{ tray icon messages } <br />type <br />TIconManager = class <br />private <br /> FHWindow: HWnd; <br /> procedure TrayWndProc(var Message: TMessage); <br />public <br /> constructor Create; <br /> destructor Destroy; override; <br /> property HWindow: HWnd read FHWindow write FHWindow; <br />end; <br /><br />var <br />IconMgr: TIconManager; <br />DDGM_TRAYICON: Cardinal; <br /><br />constructor TIconManager.Create; <br />begin <br />FHWindow := AllocateHWnd(TrayWndProc); <br />end; <br /><br />destructor TIconManager.Destroy; <br />begin <br />if FHWindow <> 0 then DeallocateHWnd(FHWindow); <br />inherited Destroy; <br />end; <br /><br />procedure TIconManager.TrayWndProc(var Message: TMessage); <br />{ This allows us to handle all tray callback messages } <br />{ from within the context of the component. } <br />var <br />Pt: TPoint; <br />TheIcon: TTrayNotifyIcon; <br />begin <br />with Message do <br />begin <br /> { if it’s the tray callback message } <br /> if (Msg = DDGM_TRAYICON) then <br /> begin <br /> TheIcon := TTrayNotifyIcon(WParam); <br /> case lParam of <br /> { enable timer on first mouse down. } <br /> { onClick will be fired by OnTimer method, provided } <br /> { double click has not occurred. } <br /> WM_LBUTTONDOWN: TheIcon.FTimer.Enabled := True; <br /> { Set no click flag on double click. This will supress } <br /> { the single click. } <br /> WM_LBUTTONDBLCLK: <br /> begin <br /> TheIcon.FNoShowClick := True; <br /> if Assigned(TheIcon.FOnDblClick) then TheIcon.FOnDblClick(Self); <br /> end; <br /> WM_RBUTTONDOWN: <br /> begin <br /> if Assigned(TheIcon.FPopupMenu) then <br /> begin <br /> { Call to SetForegroundWindow is required by API } <br /> SetForegroundWindow(IconMgr.HWindow); <br /> { Popup local menu at the cursor position. } <br /> GetCursorPos(Pt); <br /> TheIcon.FPopupMenu.Popup(Pt.X, Pt.Y); <br /> { Message post required by API to force task switch } <br /> PostMessage(IconMgr.HWindow, WM_USER, 0, 0); <br /> end; <br /> end; <br /> end; <br /> end <br /> else <br /> { If it isn’t a tray callback message, then call DefWindowProc } <br /> Result := DefWindowProc(FHWindow, Msg, wParam, lParam); <br />end; <br />end; <br /><br />{ TTrayNotifyIcon } <br /><br />constructor TTrayNotifyIcon.Create(AOwner: TComponent); <br />begin <br />inherited Create(AOwner); <br />FIcon := TIcon.Create; <br />FTimer := TTimer.Create(Self); <br />with FTimer do <br />begin <br /> Enabled := False; <br /> Interval := GetDoubleClickTime; <br /> OnTimer := OnButtonTimer; <br />end; <br />{ Keep default windows icon handy... } <br />LoadDefaultIcon; <br />end; <br /><br />destructor TTrayNotifyIcon.Destroy; <br />begin <br />if FIconVisible then SetIconVisible(False); // destroy icon <br />FIcon.Free; // free stuff <br />FTimer.Free; <br />inherited Destroy; <br />end; <br /><br />function TTrayNotifyIcon.ActiveIconHandle: THandle; <br />{ Returns handle of active icon } <br />begin <br />{ If no icon is loaded, then return default icon } <br />if (FIcon.Handle <> 0) then <br /> Result := FIcon.Handle <br />else <br /> Result := FDefaultIcon; <br />end; <br /><br />procedure TTrayNotifyIcon.LoadDefaultIcon; <br />{ Loads default window icon to keep it handy. } <br />{ This will allow the component to use the windows logo } <br />{ icon as the default when no icon is selected in the } <br />{ Icon property. } <br />begin <br />FDefaultIcon := LoadIcon(0, IDI_WINLOGO); <br />end; <br /><br />procedure TTrayNotifyIcon.Loaded; <br />{ Called after component is loaded from stream } <br />begin <br />inherited Loaded; <br />{ if icon is supposed to be visible, create it. } <br />if FIconVisible then <br /> SendTrayMessage(NIM_ADD, NIF_MESSAGE or NIF_ICON or NIF_TIP); <br />end; <br /><br />procedure TTrayNotifyIcon.Notification(AComponent: TComponent; <br />Operation: TOperation); <br />begin <br />inherited Notification(AComponent, Operation); <br />if (Operation = opRemove) and (AComponent = PopupMenu) then <br /> PopupMenu := nil; <br />end; <br /><br />procedure TTrayNotifyIcon.OnButtonTimer(Sender: TObject); <br />{ Timer used to keep track of time between two clicks of a } <br />{ double click. This delays the first click long enough to } <br />{ ensure that a double click hasn’t occurred. The whole } <br />{ point of these gymnastics is to allow the component to } <br />{ receive onClicks and OnDblClicks independently. } <br />begin <br />{ Disable timer because we only want it to fire once. } <br />FTimer.Enabled := False; <br />{ if double click has not occurred, then fire single click. } <br />if (not FNoShowClick) and Assigned(FonClick) then <br /> FonClick(Self); <br />FNoShowClick := False; // reset flag <br />end; <br /><br />procedure TTrayNotifyIcon.SendTrayMessage(Msg: DWORD; Flags: UINT); <br />{ This method wraps up the call to the API’s Shell_NotifyIcon } <br />begin <br />{ Fill up record with appropriate values } <br />with Tnd do <br />begin <br /> cbSize := SizeOf(Tnd); <br /> StrPLCopy(szTip, PChar(FHint), SizeOf(szTip)); <br /> uFlags := Flags; <br /> uID := UINT(Self); <br /> Wnd := IconMgr.HWindow; <br /> uCallbackMessage := DDGM_TRAYICON; <br /> hIcon := ActiveIconHandle; <br />end; <br />Shell_NotifyIcon(Msg, @Tnd); <br />end; <br /><br />procedure TTrayNotifyIcon.SetHideTask(value: Boolean); <br />{ Write method for HideTask property } <br />const <br />{ Flags to show application normally or hide it } <br />ShowArray: array[Boolean] of integer = (sw_ShowNormal, sw_Hide); <br />begin <br />if FHideTask <> value then <br />begin <br /> FHideTask := value; <br /> { Don’t do anything in design mode } <br /> if not (csDesigning in ComponentState) then <br /> ShowWindow(Application.Handle, ShowArray[FHideTask]); <br />end; <br />end; <br /><br />procedure TTrayNotifyIcon.SetHint(value: string); <br />{ Set method for Hint property } <br />begin <br />if FHint <> value then <br />begin <br /> FHint := value; <br /> if FIconVisible then <br /> { Change hint on icon on tray notification area } <br /> SendTrayMessage(NIM_MODIFY, NIF_TIP); <br />end; <br />end; <br /><br />procedure TTrayNotifyIcon.SetIcon(value: TIcon); <br />{ Write method for Icon property. } <br />begin <br />FIcon.Assign(value); // set new icon <br />{ Change icon on notification tray } <br />if FIconVisible then SendTrayMessage(NIM_MODIFY, NIF_ICON); <br />end; <br /><br />procedure TTrayNotifyIcon.SetIconVisible(value: Boolean); <br />{ Write method for IconVisible property } <br />const <br />{ Flags to add or delete a tray notification icon } <br />MsgArray: array[Boolean] of DWORD = (NIM_DELETE, NIM_ADD); <br />begin <br />if FIconVisible <> value then <br />begin <br /> FIconVisible := value; <br /> { Set icon as appropriate } <br /> SendTrayMessage(MsgArray[value], NIF_MESSAGE or NIF_ICON or NIF_TIP); <br />end; <br />end; <br /><br />procedure TTrayNotifyIcon.SetPopupMenu(value: TPopupMenu); <br />{ Write method for PopupMenu property } <br />begin <br />FPopupMenu := value; <br />if value <> nil then value.FreeNotification(Self); <br />end; <br /><br />const <br />{ String to identify registered window message } <br />TrayMsgStr = ’DDG.TrayNotifyIconMsg’; <br /><br />initialization <br />{ Get a unique windows message ID for tray callback } <br />DDGM_TRAYICON := RegisterWindowMessage(TrayMsgStr); <br />IconMgr := TIconManager.Create; <br />finalization <br />IconMgr.Free; <br />end. <br /><br />================================ <br /><br />25、关于窗体释放的问题(formX.free)? <br />答: <br />这个我知道,模式窗口用:form2 := TForm2.Create(Application); <br />try <br />if form2.showModal = mrOK then <br /> {do Something} <br />finally <br />form2.free; <br />form2 := nil; <br />end; 非模式窗口用:if not Assigned(form2) then <br />form2 := Tfrom2.Create(Application); <br />form2.show; <br /><br />//然后在form2的Close事件中加入以下句 <br />Action := caFree; <br /><br />//在from2的Destory事件中加入以下句 <br />form2 := nil; 搞定!!! <br /><br />================================ <br /><br />26、关于MDI窗体的问题? <br />答: <br />我不知道是如何实现,但我知道一个方法可以实现同样的功能,在打开子窗体前加一句 <br />button1.SendToBack; <br /><br />================================ <br /><br />27、小数点’.’的键号是什么?回车是#13,’.’是什么? <br />答: <br />你可以用此得出所有键的值procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; <br />Shift: TShiftState); <br />begin <br />label1.caption:=IntToStr(key); <br />end; <br /></p><p> </p> 最后修改:2009 年 08 月 16 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 支持就是力量
1 条评论
虽然注释很多,偶看了半天还是没懂,习惯C和PB了,哈哈!