為了實現以上功能程序中使用了動態頁面類(TDynaPage)其定義如下
type TDynaPage = Class(TObject)
該類可根據需要動態的產生頁面 每個頁面上創建了可進行文本編輯的TMeno部件
procedure…
puclic
CurPage : integer;
FileList : TSringList;
end;
CurPage表示當前用戶選擇的頁面數用戶切換增加刪除頁面均影響CurPage 的值CurPage初如化為零頁FileList存放打開或創建文件的名字以及與這些文件相關的編輯部件TMemo頁面動態創建刪除將影響FilstList的值
TNotebook部件創建後至少有一個頁面因此Pages屬性不是空值只要往Pages中加入字符串Delphi自動地把該字符串與TPage類對象相聯系TPage類是TCustomEdit派生出來的在對象浏覽器(Object Browse)中可觀察到TPage的數據成員和方法靜態生成的頁面也是 TPage類
要創建多頁面編輯器必須從TPage的父件(Parent屬件)創建相應編輯部件但在動態創建頁面時TPage只是一個與字符串相聯系的TObject類不能寫成
MemoParent := NotebookPagesObject[ ];
在Delphi中宣稱對象和創建對象都是用指針來標識 因此可用無類型指針進行指針傳遞
var
Pi : Pointer;
begin
Pi := NotebookPagesObject[];
MemoParent := Pi;
end;
這樣就可在TPage上動態創建編輯部件了
往Notebook中動態生成頁面時頁面應所相應的切換TDynaPage NotebookTabset有關的屬性要作相應的調整
TDynaPage的DynaAdd方法定義如下
procedure TDynaPageDynaAdd(Sender:TNotebook;FileName:String)
var
Pi:Pointer;
Memo:TMemo;
begin
SenderPagesadd(FileName)
Pi:= SenderPagesObjects[SenderPagesCount];
DynaMemo(pi)
DynaPageFileListaddObject(FileNameMemo)
EditFormTabSetTabs := SenderPages;
EditFormTabsetTabIndex:=SenderPagesCount;
EditFormNotebookPageIndex := EditFormTabsetTabIndex;
DynaPageCurPage:= SenderPagesCount;
end;
procedure DynaMemo(Pi:Pointer)
var
Memo:TMemo;
begin
Memo:=TMemoCreate(Pi)
MemoParent:=Pi;
MemoAlign:=alClient;
MemoborderStyle:=bsNone;
MemoHideSelection:=False;
Memo:=Memo;
end;
procedure TDynaPageDel(Sender:TNotebook;No:integer)
var
Pi:pointer;
begin
SenderPagesdelete(No)
EditFormTabSetTabsdelete(No)
FilelistDelete(No)
DynaPageCurPage:=EditFormTabSetTabIndex;
SenderPageIndex := EditFormTabsetTabIndex;
Pi:=FileListObjects[DynaPageCurPage];
Memo:=Pi;
EditFormCaption:=SenderPagesStrings[DynaPageCurPage];
end;
當用戶在多個頁面中進行切換時程序應當保證對當前頁面進行編輯 例如在多頁編輯器中用戶選中某一頁面即可對該頁面中的文件進行編輯尋找設置打印等為了實現這一功能定義了一個TMemo類型的變量Memo該變量沒有實例化每次調用DynaAddDynaDel方法均定把TabIndex指定頁面的Memo指針傳給Memo這樣在程序運行中始終有一個實例化的Memo指針賦給Memo而菜單中的文本編輯功能均對Memo進行操作這種指針傳遞就能保證對當前頁進行操作
定義了TDynaPage後只需在OpenClose菜單項中加入如下代碼即可方便的在用戶打開關閉文件時創建成刪除頁面
procedure TEditFormCloseClick(Sender: TObject)
begin
if DynaPageCurPage<> then
DynaPageDel(NotebookDynaPageCurPage)
if NotebookPagescount = then
CloseEnabled:=False;
end;
procedure TEditFormOpenClick(Sender: TObject)
begin
if OpenDialogExecute then
begin
if not(OpenFile or NewFile) then
begin
OpenFile:=true;
Open(OpenDialogFileName)
NotebookPagesStrings[]:=ExtractFileName( OpenDialogFileName)
TabSetTabs:=NotebookPages;
end
else
begin
DynaPageDynaAdd( Notebook ExtractFileName(OpenDialogFileName))
Open(OpenDialogFilename)
if NotebookPagescount > then
CloseEnabled:=True;
end;
end;
end;
文本編輯部件及應用
TEdit 部件
TEdit部件是一個標准的編輯框用戶可在編輯框中輸入數據編輯框也可向用戶顯示數據編輯時只能讀寫一行信息
TEdit的Text屬性存放著用戶輸入的數據或向用戶顯示的數據Modified屬性用以標識 Text的數據是否改變可通過設置Maxlength屬性值來限制用戶輸入字符的個數量CharCase
屬性可定義編輯框中字符的大小寫如果設計者想禁止用戶輸入可將ReadOnly屬性設置成真值編輯框也能用做密碼輸入框通過設置PassWordChar 屬性的值可將用戶輸入的字符在編輯框中顯示成指定的字符如*號等編輯框還可以進行字符選擇操作粘貼復制和剪切操作
[] [] []
From:http://tw.wingwit.com/Article/program/Delphi/201311/25255.html