2016/05/01

淺談 Delphi Class 和 Record Helper

Class (and Record) Helpers  圖片來源:Class Helper/Jobs Pictures

Helper 是一個從 Delphi 2005 開始就已經支援的特色之一。

使用時機:

在需要擴充現有Class或是Record裡的函式功能時使用之。

Delphi 7 之前我們要擴充或是修改現有Class功能時,我們會採取【基礎課程 - Delphi Interceptor Classes】這篇的作法。

然而在 Delphi 2005 之後,就可以利用 Helper 簡單作到對現有 Class 的擴充,以TStrings為例:我們在找尋字串是否在TStrings裡時,我們會用以下的判斷式:


if TStrings.IndexOf('Some String') = -1 then
  raise Exception.Create('Not Found String!!');

現在,我們可以這樣做:

type
TStringsHelper = class helper for TStrings
public
  function Contains(const AString : string) : boolean;
end;

function TStringsHelper.Contains(const AString: string): boolean;
begin
  result := -1 <> IndexOf(AString);
end;

接著我們就可以這樣寫:

if TStrings.Contains('Some String') then
...

覺得只是這樣?我只能說你太小看Helper了,現在連TComboBox、TMemo和TListBox裡的Items/Lines的TStrings都有被支援到了!

這意味著你現在可以這樣寫:

if ListBox1.Items.Contains('some string') then ...


從XE3開始,Delphi又再度擴充了Helper的功能 -- 支援【基本型別】!
String和TDateTime也能夠被擴充了!

有外國網友已經寫成一個Helper單元來擴充TDateTime:
Helper record for TDateTime type

範例如下:
uses DateTimeHelper;

var
  T1, T2: TDateTime;

begin
  // Set date to 14th September 2012
  T1 := TDateTime.Create(2012, 9, 14);

  // Set date to today's date
  T1 := TDateTime.Today;

  // Set T2 to 1 year, 3 months and 10 days ahead of T1.
  T2 := T1.AddYears(1).AddMonths(3).AddDays(10);

  if T2.IsInLeapYear then
    WriteLn(Format('%d is a leap year', [T2.Year]));

  T1 := TDateTime.Create(1995, 2, 14); // Delphi's birthday

  WriteLn(Format('Delphi is %d years old today.', [T1.YearsBetween(Now)]));
  WriteLn('Delphi''s birthday was ' + T1.ToString('dd/mm/yyyy'));
end;

操作上比另外呼叫 DateUtils 要來得更直覺也更實用!

快來試試看這個超實用的秘技吧!

See also:

2 則留言: