DELPHI编程技巧集锦(5)

上传人:飞*** 文档编号:43533834 上传时间:2018-06-06 格式:DOC 页数:10 大小:61.50KB
返回 下载 相关 举报
DELPHI编程技巧集锦(5)_第1页
第1页 / 共10页
DELPHI编程技巧集锦(5)_第2页
第2页 / 共10页
DELPHI编程技巧集锦(5)_第3页
第3页 / 共10页
DELPHI编程技巧集锦(5)_第4页
第4页 / 共10页
DELPHI编程技巧集锦(5)_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《DELPHI编程技巧集锦(5)》由会员分享,可在线阅读,更多相关《DELPHI编程技巧集锦(5)(10页珍藏版)》请在金锄头文库上搜索。

1、DELPHI编程技巧集锦(编程技巧集锦(5)董占山(中国农科院棉花研究所,河南安阳,455112)L 使用非使用非 VCL 类类在 Delphi 中重用代码是十分容易的,但是写一个存取常用 代码的 VCL 是十分复杂的,为什么不写一个类单元呢? 在一个大型项目中,维护和调试一个类是比较容易的,因 为每个类是自包含的,没有全局变量的干扰。下面是一个 类的框架: unit cls_mine; interface Uses WinTypes,Winprocs,Messages, SysUtils, Classes; TypeTMYCLASS = class(TObject)private Priva

2、te 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 Wri

3、te 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,就象使用

4、 VCL 类一样,不需 要每次重新编译这个单元。M 获得获得 TMEMO 组件中光标所在组件中光标所在的行数的行数如果 TMEMO 能够告诉你光标在哪一行不是很好吗?但是, 当你单击 TMEMO 组件时,它设置 SelStart 属性为当前光 标的字符位置,这是 TMEMO 中所有文本的一个位置索引 值,你需要计算行长并测试 SelStart,将其翻译为行数, 使用 Windows API 函数可以很容易地获得 TMEMO 组件 中光标所在的行数: LineNumber:=SendMessage(Memo1.Handle,EM_LINEFRO MCHAR,memo1.Selstart,0);

5、LineNumber 是一个 LongInt 型变量,可以将它转换为一个 Integer 型变量。N 让用户选择所有的项目让用户选择所有的项目为了允许用户在记忆组件和编辑组件中可以按 来选择所有的文本,设置窗体的 KeyPreview 属性为真, 并为窗体的 OnKeyPress 事件编写如下的处理程序:procedure TMyForm.FormKeyPress(Sender: TObject; var Key: Char); beginif (ActiveControl is TCustomEdit) and (Key=#1) thenbegin (ActiveControl as TCu

6、stomEdit).SelectAll; Key:=#0; endend; Key:=#0 语句使在非文本输入时强迫程序发嘟嘟声。O 怎样在怎样在 RichEdit 组件中获组件中获得一段文本得一段文本在使用 RichEdit 组件时,希望仅仅获得其中的一部分文本, 但是不想设置选择区间和使用 SelText 属性,可以使用如 下代码实现: overrides wrong TTextRange definition in RichEdit.pasTTextRange = recordchrg: TCharRange;lpstrText: PAnsiChar;end; function REGe

7、tTextRange(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;

8、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 coordi

9、nates 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:

10、 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);E

11、ndPos := 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 自

12、己, 但是需要_AddRef/_Release 它包 裹的对象。在 Delphi 3 中,这意味着组件(窗体)需要实 现一个哑对象,用来进行参考计数。在 Delphi 4 中, 就不 需要赋值一个哑对象,因为 Delphi 只有在对象被赋值时才 _AddRef/_Release 它们。下面的例子就一个 IShowMe 界面 类型询问所有的窗体: procedure ExecuteShowMeOnAllForms; varIdx : integer;ShowMeObject : IShowMe;ObjectAssigned : boolean;RefCountedObject : IUnknow

13、n; 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

14、 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 方法通知应用程序中 所有的类。一个控制必须解释一个事件句柄来对消息作出 反应,如果你希望停止这条消息

15、,让 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(

16、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

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号