资源预览内容
第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
第9页 / 共10页
第10页 / 共10页
亲,该文档总共10页全部预览完了,如果喜欢就下载吧!
资源描述
DELPHI编程技巧集锦(编程技巧集锦(5)董占山(中国农科院棉花研究所,河南安阳,455112)L 使用非使用非 VCL 类类在 Delphi 中重用代码是十分容易的,但是写一个存取常用 代码的 VCL 是十分复杂的,为什么不写一个类单元呢? 在一个大型项目中,维护和调试一个类是比较容易的,因 为每个类是自包含的,没有全局变量的干扰。下面是一个 类的框架: unit cls_mine; interface Uses WinTypes,Winprocs,Messages, SysUtils, Classes; TypeTMYCLASS = class(TObject)private Private Variables and Hidden Functions fstarted:Boolean fflag:Boolean; Procedure SetFlag(truefalse:Boolean); Function GetFlag:Boolean;public Public Methods and Properties Function Init:Boolean; Function GetExeDirectory:String Property Started Read fstarted Write fstarted; Property MyFlag Read GetFlag Write SetFlag;end; implementation Function TMYCLASS.Init:boolean; beginfstarted:=True;. initialise stuff . end; etc.etc. 当使用类时,在 Uses 子句中加上 cls_mine,声明一个 TMYCLASS 类型的变量 MYCLASS,然后调用MYCLASS.Create 建立类(记住在不使用类时调用 MYCLASS.Free 注销类) ,你能够使用其方法和属性,如 EXEDIR:=MYCLASS.GetEXEDirectory 或 MYCLASS.MyFlag:=True,就象使用 VCL 类一样,不需 要每次重新编译这个单元。M 获得获得 TMEMO 组件中光标所在组件中光标所在的行数的行数如果 TMEMO 能够告诉你光标在哪一行不是很好吗?但是, 当你单击 TMEMO 组件时,它设置 SelStart 属性为当前光 标的字符位置,这是 TMEMO 中所有文本的一个位置索引 值,你需要计算行长并测试 SelStart,将其翻译为行数, 使用 Windows API 函数可以很容易地获得 TMEMO 组件 中光标所在的行数: LineNumber:=SendMessage(Memo1.Handle,EM_LINEFRO MCHAR,memo1.Selstart,0); LineNumber 是一个 LongInt 型变量,可以将它转换为一个 Integer 型变量。N 让用户选择所有的项目让用户选择所有的项目为了允许用户在记忆组件和编辑组件中可以按 来选择所有的文本,设置窗体的 KeyPreview 属性为真, 并为窗体的 OnKeyPress 事件编写如下的处理程序:procedure TMyForm.FormKeyPress(Sender: TObject; var Key: Char); beginif (ActiveControl is TCustomEdit) and (Key=#1) thenbegin (ActiveControl as TCustomEdit).SelectAll; Key:=#0; endend; Key:=#0 语句使在非文本输入时强迫程序发嘟嘟声。O 怎样在怎样在 RichEdit 组件中获组件中获得一段文本得一段文本在使用 RichEdit 组件时,希望仅仅获得其中的一部分文本, 但是不想设置选择区间和使用 SelText 属性,可以使用如 下代码实现: overrides wrong TTextRange definition in RichEdit.pasTTextRange = recordchrg: TCharRange;lpstrText: PAnsiChar;end; function REGetTextRange(RichEdit: TRichEdit; BeginPos, MaxLength: Integer): string; RichEdit - RichEdit 控件,BeginPos - 第一个字符的绝对 索引值,MaxLength - 获取的最大字符数 varTextRange: TTextRange; beginif MaxLength0 thenbeginSetLength(Result, MaxLength);with TextRange dobeginchrg.cpMin := BeginPos;chrg.cpMax := BeginPos+MaxLength;lpstrText := PChar(Result);end;SetLength(Result, SendMessage(RichEdit.Handle, EM_GETTEXTRANGE, 0, longint(TextRange);endelse Result:=; end; 这个函数能够用来提取当前光标下的单词: function RECharIndexByPos(RichEdit: TRichEdit; X, Y: Integer): Integer; function returns absolute character position for given cursor coordinates varP: TPoint; beginP := Point(X, Y);Result := SendMessage(RichEdit.Handle, EM_CHARFROMPOS, 0, longint(P); end;function REExtractWordFromPos(RichEdit: TRichEdit; X, Y: Integer): string; X, Y - point coordinates in rich edit control returns word , under current cursor position varBegPos, EndPos: Integer; beginBegPos := RECharIndexByPos(RichEdit, X, Y);if (BegPos 0 ) thenbeginresult:=;exit;end;if SendMessage(RichEdit.Handle, EM_FINDWORDBREAK, WB_CLASSIFY, BegPos - 1) and(WBF_BREAKLINE or WBF_ISWHITE) = 0 thenBegPos := SendMessage(RichEdit.Handle, EM_FINDWORDBREAK, WB_MOVEWORDLEFT, BegPos);EndPos := SendMessage(RichEdit.Handle, EM_FINDWORDBREAK, WB_MOVEWORDRIGHT, BegPos);Result := TrimRight(REGetTextRange(RichEdit, BegPos, EndPos - BegPos); end;P 在在 Delphi 3 中如何使用中如何使用interface 类型询问所有的窗体类型询问所有的窗体一个窗体是一个 TComponent 组件, 它提供了一个 COM 对象(VCLComObject/ComObject)包裹器。因此, 它不需要 _AddRef/_Release 自己, 但是需要_AddRef/_Release 它包 裹的对象。在 Delphi 3 中,这意味着组件(窗体)需要实 现一个哑对象,用来进行参考计数。在 Delphi 4 中, 就不 需要赋值一个哑对象,因为 Delphi 只有在对象被赋值时才 _AddRef/_Release 它们。下面的例子就一个 IShowMe 界面 类型询问所有的窗体: procedure ExecuteShowMeOnAllForms; varIdx : integer;ShowMeObject : IShowMe;ObjectAssigned : boolean;RefCountedObject : IUnknown; beginRefCountedObject := TInterfacedObject.Create;for Idx := Screen.FormCount - 1 downto 0 dowith Screen.FormsIdx do begin/ Find out if we need to assign a VCLComObject.ObjectAssigned := not Assigned (VCLComObject);if ObjectAssigned thenVCLComObject := Pointer (RefCountedObject);try/ GetInterface calls ShowMeObjects _Release / finallyif ObjectAssigned then beginShowMeObject := nil; / Calls VCLComObject._Release.VCLComObject := nil; / Now we can safely / reset VCLComObject.end;end;end; end;Q 在应用程序中广播信息在应用程序中广播信息VCL 使用 TWinControl 的 Broadcast 方法通知应用程序中 所有的类。一个控制必须解释一个事件句柄来对消息作出 反应,如果你希望停止这条消息,让 Message.Result 返回 0 即可。 var i: integer;hMessage: TMessage; beginhMessage.Msg := WM_USER + 1;hMessage.WParam := 0;hMessage.LParam := 0;for i := 0 to Screen.FormCount-1 doScreen.Formsi.Broadcast(hMessage); end; TScreen 类拥有应用程序中所有的窗体。事件句柄如下: TMyButton = class(TButton)protectedprocedure EventHandler(var Message: TMessage); message WM_USER + 1;end; . procedure TMyButton.EventHandler(var Message: TMessage); begin/ commandsMessage.Result := 0; / Event continues end;R 千年虫问题千年虫问题在 SysUtils 单元有一个全局字型(Word)变量 TwoDigitYearCenturyValue,默认值为 0,可以解决某些 Y2K 问题。它是如何起作用呢? 如果今天的日期是 10/22/1998, 减去 TwoDigitYearCenturyWindow 的值,即:1998 - 50 = 1948, 在日期区间 48-98 之间的任何日期将具有第一个日期的世 纪数,即 10/22/1998 中的19。 TwoDigitYear
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号