程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi深度探索-To do list的增強

Delphi深度探索-To do list的增強

編輯:Delphi

 Delphi 5在IDE中還引入了新的特性: To-Do item和To-Do list。To-Do item 描述了項目中的一個需要完成的編碼任務。它相當於一個備忘錄提醒你不要忘記打算作的事情。一個To-Do item包括描述,優先級,負責人和分類。To-Do item被記錄在源代碼中,以TODO關鍵詞注釋。To-Do list相當於項目中所有的To-Do item的列表管理器,可以用來很方便的察看所有需要完成的任務。我們可以通過點任務標題欄按字母或優先級排序項目。也可以調用右鍵菜單中的filter設定根據負責人,分類,項目類型等來定制項目顯示。除此之外,To-Do List 我們還可以調用右鍵菜單的Copy As命令以文本或網頁形式輸出任務列表的狀況。

  添加To-Do item

  我們可以通過調用代碼編輯窗口中的右鍵菜單命令Add To-Do Item命令來添加To-Do Item。

  任務的屬性"Priority"(優先級)通過1到5的數字表明任務的重要性。"Owner"(負責人)意思是誰負責完成這個任務。"Category"代表任務的類型(比如, 是用戶界面部分,還是事件處理)。下圖3.14演示了一個填好了信息的任務:

Delphi深度探索-To do list的增強

  圖3.14

  如上土那樣填好信息後,點OK按鈕就會添加任務到列表中去,同時會在源碼中自動生成下面所示意的注釋: { TODO 2 -ohubdog –c算法 : 需要實現一個復雜的算法 }

  要注意的是除了可以添加同源碼文件相關的任務,我們還可以添加全局的To-Do item。調用VIEw|To-Do List命令調出編輯對話框,點Add按鈕後添加的就是全局的To-Do Item。由下圖我們可以看出兩者的區別:兩者圖標不一樣,其次,全局的任務不會在源碼中添加注釋,而是被儲存在project.To-Do文件中。同時全局的To-Do Item的module屬性是空的,而同文件關聯的To-Do Item的Module屬性為被注釋的源碼文件。我們雙擊局部To-Do Item會自動定位到源碼中被注釋的部分。

Delphi深度探索-To do list的增強

  圖片看不清楚?請點擊這裡查看原圖(大圖)。

  圖3.15

  注意:所有To-Do Item都有一個點選框,點中後,就表明這個任務已經實現。

  增強To-Do List

  雖然IDE提供了強大的To-Do List定制,但用戶有時可能還需要在已有的To-Do List基礎上實現一些特定的功能,為此在Delphi 5中,borland提供了擴展To-Do List的接口,它們是IOTAToDOServices, IOTAToDoManager和INTAToDoItem接口:

  IOTAToDOServices

  To-Do List的服務接口,用來維護系統中的全部To-Do Item的列表,同時我們可以利用它的AddManager函數來添加自定義的To-Do List Manager。

  IOTAToDoManager

  To-Do List的管理接口,用來維護自定義的To-Do Item的列表,我們可以使用這個接口來添加自定義的To-Do Item。

  INTAToDoItem

  To-Do Item的接口,包含很多方法描述和管理To-Do Item的屬性。

  下面就讓我們來演示一下如何擴展To-Do List特性。假設我們現在在做一個項目,項目規劃中要求每到周末,我們就需要打印一份程序開發進度。為了防止程序員遺忘這項任務,

  我們可以設計一個定制的To-Do Item,每到周末的時候,它就會被自動添加到To-Do List中去提醒程序員。

  要想添加一個這樣的To-Do Item,我們首先應該實現一個特殊的ToDoManager,它負責檢查時間,如果時間符合要求,就會自動添加一個提示性的To-Do Item到列表中去。下面就是我們的ToDoManager的類定義,它實現了IOTAToDoManager和INTAToDoItem接口。

TToDoManager = class(TInterfacedObject, IOTAToDoManager, INTAToDoItem)
private
FName: string;
public
constructor Create;
{ IOTAToDoManager methods }
function GetName: string;
procedure SetName(const AName: string);
function GetItem(Index: Integer): INTAToDoItem;
function GetItemCount: Integer;
procedure ProjectChanged;
{ INTAToDoItem methods }
function CanDelete: Boolean;
function CanEdit: Boolean;
function CanShow: Boolean;
procedure Delete;
procedure DrawImage(const Canvas: TCanvas; const Rect: TRect);
procedure DoubleClicked;
procedure Edit;
function GetText: string;
function GetPriority: TOTAToDoPriority;
function GetCategory: string;
function GetChecked: Boolean;
function GetModuleName: string;
function GetKind: string;
function GetData: Integer;
function GetOwner: string;
function IsValid: Boolean;
procedure SetChecked(const Value: Boolean);
procedure Show;
end;

  我們首先來實現IOTAToDoManager接口的方法,下面代碼在GetName的方法中返回一個唯一的字符串用來標示ToDoManager。SetName方法只要簡單的把Aname付值給Fname就可以了。

constructor TToDoManager.Create;
begin
inherited Create;
FName := 'Project Progress ToDo Manager';
end;
function TToDoManager.GetName: string;
begin
Result := FName;
end;
procedure TToDoManager.SetName(const AName: string);
begin
FName := AName;
end;


由於需要添加的To-Do Item只有一個,同時只有當周五的時候,才需要顯示,所以我們要在GetItemCount方法中判斷日期,如果為周末,就返回1,否則返回0。

function TToDoManager.GetItemCount: Integer;
begin
if DayOfWeek(Now)=5{周五} then
Result:=1
else
Result:=0;
end;

  如果GetItemCount大於0,IDE會調用GetItem(index)來獲得To-Do Item,我們只需要用As操作符返回實現的INTAToDoItem的實例就可以了,代碼如下:

function TToDoManager.GetItem(Index: Integer): INTAToDoItem;
begin
Result := Self as INTAToDoItem;
end;

  IOTAToDoManager接口的ProjectChanged過程會在項目變化時被調用,但這裡不會用到,我們只要放一個空的實現就可以了。

procedure TToDoManager.ProjectChanged;
begin
end;

  接下來就該實現INTAToDoItem接口了,下面是實現部分的代碼,注釋對實現部分進行了說明:

// INTAToDoItem 接口
// CanDelete函數返回False是為了避免To-Do Item被誤刪除
//當結果為false時,Item對應的右鍵菜單的Delete命令變灰,無法選取
function TToDoManager.CanDelete: Boolean;
begin
Result := False;
end;
// CanEdit函數返回False,表明這個項目無須編輯
function TToDoManager.CanEdit: Boolean;
begin
Result := False;
end;
// CanShow返回False表述這個項目無法Open(注意只有和文件關聯的項目
//才支持Open命令,缺省條件下調用Open,會打開相應Module,定位到注釋位置。
function TToDoManager.CanShow: Boolean;
begin
Result := False;
end;
//當項目將被刪除時被調用,這裡無須實現 procedure TToDoManager.Delete;
begin
end;
//可以用來畫定制的圖像,這裡沒有實現
procedure TToDoManager.DrawImage(const Canvas: TCanvas; const Rect: TRect);
begin
end;
//雙擊項目,會調用這個過程,這裡我們只是顯示一下提示信息
procedure TToDoManager.DoubleClicked;
begin
ShowMessage('一定要在今天把工作計劃打印出來,否則小心炒你的鱿魚');
end;
//編輯過程中會被調用,這裡無須實現
procedure TToDoManager.Edit;
begin
end;
//返回項目的標題
function TToDoManager.GetText: string;
begin
Result := '務必要在今天把工作進展打出來';
end;
//返回優先級別
function TToDoManager.GetPriority: TOTAToDoPriority;
begin
Result := 1; //我們這裡假定1是最大優先級
end;
//返回項目類別
function TToDoManager.GetCategory: string;
begin
Result := '進度管理';
end;
//返回是否已經完成的信息,這裡不實現
function TToDoManager.GetChecked: Boolean;
begin
end;
// 返回模塊名
function TToDoManager.GetModuleName: string;
begin
Result := '管理';
end;
// 用唯一的字符串標示項目類型
function TToDoManager.GetKind: string;
begin
Result := '打印報表';
end;
// 返回一個數值,但是我不知道是干什麼用的:(
function TToDoManager.GetData: Integer;
begin
Result := 0;
end;
// 返回負責人
function TToDoManager.GetOwner: string;
begin
Result := '該死的老板';
end;
// 是否有效,簡單的返回true,如果返回false,項目就不會出現在列表中
function TToDoManager.IsValid: Boolean;
begin
Result := True;
end;
// 無須實現,因為我們的這個項目是只讀的
procedure TToDoManager.SetChecked(const Value: Boolean);
begin
end;
//無須實現,因為我們這個項目不允許打開
procedure TToDoManager.Show;
begin
end;

 現在我們已經把核心代碼寫完了,剩下的就是編寫一個專家把自定義的ToDoManager注冊到系統中。這部分比較簡單,只需要在Expert的Create方法中調用IOTAToDOServices接口的AddManager添加ToDoManager,並在Destroy方法中釋放ToDoManager即可,代碼如下:

unit TToDoMain;
interface
uses ToolsAPI, Windows, Menus, Graphics, Classes;
type
TToDoExpert = class(TInterfacedObject, IOTANotifIEr, IOTAWizard)
private
FIndex: Integer;
public
constructor Create;
destructor Destroy; override;
{ IOTANotifIEr methods }
procedure AfterSave;
procedure BeforeSave;
procedure Destroyed;
procedure ModifIEd;
{ IOTAWizard methods }
function GetIDString: string;
function GetName: string;
function GetState: TWizardState;
procedure Execute;
end;
procedure Register;
implementation
uses SysUtils, Forms, Dialogs, ImgList;
procedure Register;
begin
RegisterPackageWizard(TToDoExpert.Create as IOTAWizard);
end;
constructor TToDoExpert.Create;
begin
inherited Create;
//利用BorlandIDEServices獲得IOTAToDOServices接口,
//然後調用AddManager方法添加自定義的ToDoManager
//並保存返回的Index,以便後面刪除用。
FIndex := (BorlandIDEServices as IOTAToDOServices).AddManager(
TToDoManager.Create);
end;
destructor TToDoExpert.Destroy;
begin
//利用先前保存的Manager Index刪除ToDoManager
(BorlandIDEServices as IOTAToDOServices).RemoveManager(FIndex);
inherited Destroy;
end;
procedure TToDoExpert.AfterSave;
begin
end;
procedure TToDoExpert.BeforeSave;
begin
end;
procedure TToDoExpert.Destroyed;
begin
end;
function TToDoExpert.GetIDString: string;
begin
Result := 'ProjectProgress ToDoExpert';
end;
function TToDoExpert.GetName: string;
begin
Result := 'ToDo Demo Expert';
end;
function TToDoExpert.GetState: TWizardState;
begin
Result := [];
end;
procedure TToDoExpert.ModifIEd;
begin
end;
procedure TToDoExpert.Execute;
begin
end;

  安裝後的結果如下圖3.16所示,實驗一下雙擊Item的效果如何吧。

  圖3.16

Delphi深度探索-To do list的增強

  上面的例子只是簡單的演示了一下如何擴展To-Do List的功能,其實完全可以編寫更復雜的專家來實現工作計劃,系統流程等方面的工作。





 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved