国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

PageControl和類-代碼編輯器

2019-11-14 13:15:04
字體:
供稿:網(wǎng)友
PageControl位于Win32選項(xiàng)卡中,可以在控件上右鍵點(diǎn)擊“New Page”,來實(shí)現(xiàn)靜態(tài)的頁面添加。
先說說幾個(gè)重要的屬性:
ActivePage:當(dāng)前活動(dòng)的頁面(在設(shè)計(jì)模式中切換頁面會(huì)更改ActivePage屬性)
MultiLine:選項(xiàng)卡以多行形式顯示。
Style:頁面樣式。
tsTabs:(默認(rèn))選項(xiàng)卡樣式
tsButtons:按鈕樣式(經(jīng)典樣式)
tsFlatButtons:按鈕樣式2(經(jīng)典樣式)
TabHeight, TabWidth:選項(xiàng)卡位置設(shè)置(默認(rèn)為0,單位:px)

TabPosition:選項(xiàng)卡的位置

tpBottom:下面(很奇怪)
tpLeft:左面(經(jīng)典樣式)
tPRight:右面(經(jīng)典樣式)
tpTop:(默認(rèn))上面

然后是PageControl中的TabSheet:

Caption:在選項(xiàng)卡中顯示的內(nèi)容
TabVisible:選項(xiàng)卡可見性
PageIndex:頁面的索引值
首先添加一個(gè)PopupMenu,PageControl1。PageControl不要添加TabSheet。
PageControl的Align設(shè)置為alClient,PupopMenu設(shè)置為PopupMenu1。
PopupMenu1添加如下菜單(Add的Visible是False):
簡單文本編輯器——PageControl和類(Delphi 2009) - ZomGraves - 編程為主
然后進(jìn)入代碼編輯界面,在interface中的uses引用StdCtrls。
和以前不同的是,之前是把Memo也添加到窗體中,直接在屬性窗口設(shè)置好相應(yīng)的屬性值。但是,用代碼創(chuàng)建的控件,就只能用代碼去設(shè)置其屬性了。
 
不難看出,這里面的每一個(gè)控件(包括窗體)都是一個(gè)類。當(dāng)然,不同于C++和java,類定義了之后要手動(dòng)創(chuàng)建,一般情況下是Create()。
1 procedure TForm1.Button1Click(Sender: TObject);2 var3   btn: TButton;4 begin5   btn := TButton.Create();6   //下面是對Button的屬性修改7   btn.Caption := '按鈕';8 end;
然后,在ActionList中添加一些Action,接下來設(shè)置主菜單。如圖:
簡單文本編輯器——PageControl(Delphi 2009) - ZomGraves - 編程為主
Action里面的StandardAction可以直接使用。
只不過,有的還需要自己手動(dòng)添加代碼,比如:打開等等。
像撤銷,剪切,粘貼等不需要自己添加代碼,也不需要自己弄Enabled屬性。
之前說過,只有窗體,菜單(主菜單和彈出式菜單),按鈕等一些控件能使用Action。
想想如果不使用ActionList里面的StandardAction,自己去寫代碼的話,除了引用Clipbrd.pas之外就是使用Windows.pas里面的SendMessage了。
不過,還是得提醒一下:在菜單上添加Action會(huì)更改菜單的Caption, Checked和ShortCut屬性。
所以在設(shè)置完Action之后再改Caption(StandardAction的默認(rèn)的Caption是英文...)。
--如何判斷當(dāng)前活動(dòng)的Memo
在這里,一個(gè)Page里面只有一個(gè)Memo,這樣,就可以通過PageControl的ActivePageIndex來決定了。
在靜態(tài)使用Memo的時(shí)候我們可以直接Memo1.Text什么的,但是現(xiàn)在不可以。那么,可以用下面的替代:
類名(PageControl1.Pages[PageControl1.ActivePageIndex].Controls[0]).屬性
比如:
TMemo(PageControl1.Pages[PageControl1.ActivePageIndex].Controls[0])
--關(guān)閉頁面與打開、保存
關(guān)閉的時(shí)候,直接調(diào)用TabSheet的Destroy()就可以了,對于容器型的控件來說,對容器進(jìn)行Destroy的同時(shí),內(nèi)部的控件也同樣會(huì)被Destroy。
注意,靜態(tài)添加的控件也可以用代碼Destroy。但是...不推薦這么做。
在關(guān)閉之前最好詢問用戶沒保存的文件是否保存。
那么,Memo的Modified屬性就非常重要了,初始情況是False,當(dāng)文本框的內(nèi)容出現(xiàn)變化的時(shí)候Modified為True(但也有特例)。
在不考慮UTF-8編碼的情況下直接使用Lines.LoadFromFile()和Lines.SaveToFile()就可以了。
 1 procedure TForm1.FileOpenAccept(Sender: TObject); 2 var 3   fName: string; 4   cIndex: Integer; 5 begin 6   Add1.Click(); 7   cIndex := PageControl1.ActivePageIndex; 8   fName := FileOpen1.Dialog.FileName; 9   TMemo(PageControl1.Pages[cIndex].Controls[0]).LoadFromFile(fName);10 end;
在不考慮類的繼承的情況下,保存這部分實(shí)現(xiàn)比較難而且很麻煩。
首先,需要一個(gè)字符串類型的動(dòng)態(tài)數(shù)組,按照PageControl1的標(biāo)簽的順序記錄其完整的文件名(新建的文件,值為空),而且數(shù)組的索引值要和PageControl的TabSheet的索引值對應(yīng)。
然后還需要考慮什么時(shí)候需要修改這個(gè)動(dòng)態(tài)數(shù)組等等。顯然很麻煩。
所以,這里通過類的繼承實(shí)現(xiàn)。則有:
1 type2   TRecEdit = class(TMemo)3   protected4     fPath: string;        //用于存放通過打開的文件的完整路徑5   end;
這樣子類擁有父類能繼承的所有屬性,以及子類定義的屬性。
類的定義寫在interface中。
另外,主菜單的“關(guān)閉當(dāng)前”和“關(guān)閉所有”使用的過程基本相同,這樣我們可以不用在另一個(gè)過程里面寫xxx.Click();了。
選擇一個(gè)菜單,在屬性窗口中單擊Events,找到OnClick,選擇要使用的過程即可。
簡單文本編輯器——PageControl和類(Delphi 2009) - ZomGraves - 編程為主
當(dāng)用戶關(guān)閉窗口的時(shí)候,應(yīng)該詢問用戶沒保存的文件是否保存,當(dāng)然,這里面會(huì)用到while循環(huán),同時(shí)我定義了函數(shù)ClosePageQuery,通過其返回值來決定。
當(dāng)ClosePageQuery返回False的時(shí)候使FormCloseQuery的CanClose為True。
則有如下代碼:
1 procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);2 begin3   while PageControl1.PageCount > 0 do4     if not ClosePageQuery() then begin5       CanClose := True;6       Exit;7     end;8 end;
--擴(kuò)展
字體設(shè)置:
在窗體上添加一個(gè)FontDialog。然后可以使用如下代碼:
那么,在這里就可以這么用:
if FontDialog1.Execute then
  TRecEdit(PageControl1.Pages[PageControl1.ActivePageIndex].Controls[0]).Font := FontDialog1.Font
上面的幾個(gè)可以根據(jù)自己的情況添加。
--調(diào)試
調(diào)試還是比較簡單的。這里先說一下容易出問題的地方。
關(guān)閉所有
最開始的時(shí)候使用for循環(huán),然后就有如下代碼:
for i := 0 to PageControl1.PageCount - 1 do  PageControl1.Pages[i].Destroy;
但是——這么做會(huì)出錯(cuò)。
因?yàn)閕的值會(huì)變,而且PageControl1.PageCount也會(huì)變,但只能變小,而i只能變大。
所以,會(huì)出現(xiàn)下標(biāo)越界的錯(cuò)誤。
PageControl1.Pages[i].Destroy;
換成
PageControl1.ActivePage.Destroy;
就不會(huì)出錯(cuò)。
后期把保存部分添加之后,就不能直接使用Destroy了。
顯然,for循環(huán)不合適。
然后是while循環(huán),之前說ClosePageQuery為False的時(shí)候退出循環(huán)。
1 while PageControl1.PageCount > 0 do2   if not ClosePageQuery() then3     break;
也可以把while和if合并。
保存
保存和另存為是兩回事。首先,另存為是無論文件是否是新建的,都會(huì)彈出保存對話框。
而保存就是TRecEdit的fPath是空字符串的時(shí)候,也就是文件是新建的時(shí)候彈出保存對話框。所以有:
1 pIndex := PageControl1.ActivePageIndex;2 s := TRecEdit(PageControl1.Pages[pIndex].Controls[0]).fPath;3 if s = '' then begin4   if SaveDialog1.Execute then5     TRecEdit(PageControl1.Pages[pIndex].Controls[0]).Lines.SaveToFile(SaveDialog1.FileName);6 end else7   if TRecEdit(PageControl1.Pages[pIndex].Controls[0]).Modified then8       TRecEdit(PageControl1.Pages[pIndex].Controls[0]).Lines.SaveToFile(s);
實(shí)際上是if語句的嵌套。
這里很可能弄成先if xxx.Modified then然后再if s = '' then。
但這樣會(huì)忽略一種情況——新建的文件沒有輸入任何文字,理論上會(huì)彈出保存對話框的但實(shí)際上沒有,而且沒有進(jìn)行保存。
 
根據(jù)前面部分(不包括擴(kuò)展),整理代碼:
  1 unit Unit1;  2   3 interface  4   5 uses  6   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  7   Dialogs, Menus, StdCtrls, ComCtrls, StdActns, ActnList;  8   9 type 10   TRecEdit = class(TMemo) 11   protected 12     fPath: string; 13   end; 14  15   TForm1 = class(TForm) 16     PageControl1: TPageControl; 17     PopupMenu1: TPopupMenu; 18     Add1: TMenuItem; 19     ClosePage1: TMenuItem; 20     CloseAll1: TMenuItem; 21     ActionList1: TActionList; 22     FileOpen1: TFileOpen; 23     FileSaveAs1: TFileSaveAs; 24     EditCut1: TEditCut; 25     EditCopy1: TEditCopy; 26     EditPaste1: TEditPaste; 27     EditSelectAll1: TEditSelectAll; 28     EditUndo1: TEditUndo; 29     EditDelete1: TEditDelete; 30     MainMenu1: TMainMenu; 31     F1: TMenuItem; 32     E1: TMenuItem; 33     N1: TMenuItem; 34     O1: TMenuItem; 35     S1: TMenuItem; 36     SaveAs1: TMenuItem; 37     Undo1: TMenuItem; 38     N2: TMenuItem; 39     Cut1: TMenuItem; 40     Copy1: TMenuItem; 41     Paste1: TMenuItem; 42     Delete1: TMenuItem; 43     N3: TMenuItem; 44     SelectAll1: TMenuItem; 45     N4: TMenuItem; 46     C1: TMenuItem; 47     L1: TMenuItem; 48     N5: TMenuItem; 49     X1: TMenuItem; 50     SaveDialog1: TSaveDialog; 51     procedure Add1Click(Sender: TObject); 52     procedure FormCreate(Sender: TObject); 53     procedure ClosePage1Click(Sender: TObject); 54     procedure CloseAll1Click(Sender: TObject); 55     procedure FileOpen1Accept(Sender: TObject); 56     procedure N1Click(Sender: TObject); 57     procedure S1Click(Sender: TObject); 58     procedure FileSaveAs1Accept(Sender: TObject); 59     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); 60   private 61     { Private declarations } 62     function ClosePageQuery(pIndex: Integer): Boolean; overload; 63     function ClosePageQuery(): Boolean; overload; 64   public 65     { Public declarations } 66   end; 67  68 var 69   Form1: TForm1; 70   n: Integer; 71  72 implementation 73  74 {$R *.dfm} 75  76 procedure TForm1.Add1Click(Sender: TObject); 77 var 78   tab: TTabSheet; 79   TeMemo: TRecEdit; 80 begin 81   tab := TTabSheet.Create(PageControl1); 82   tab.PageControl := PageControl1; 83   TeMemo := TRecEdit.Create(tab); 84   TeMemo.Parent := tab; 85   TeMemo.fPath := ''; 86   TeMemo.Align := alClient; 87   TeMemo.ScrollBars := ssVertical; 88   C1.Enabled := True; 89   L1.Enabled := True; 90 end; 91  92 function TForm1.ClosePageQuery(pIndex: Integer): Boolean; 93 var 94   ret: Integer; 95 begin 96   if TRecEdit(PageControl1.Pages[pIndex].Controls[0]).Modified then begin 97     ret := application.MessageBox('當(dāng)前文件內(nèi)容已經(jīng)修改,想保存文件嗎?', '保存', 51);    //51=48+3 98     case ret of 99     IDYES:      FileSave1.Click();100     IDCANCEL:   begin101                   Result := False;102                   Exit;103                 end;104     end;105   end;106   PageControl1.Pages[pIndex].Destroy;107   Result := True;108 end;109 110 function TForm1.ClosePageQuery: Boolean;111 begin112   Result := ClosePageQuery(PageControl1.ActivePageIndex);113 end;114 115 procedure TForm1.CloseAll1Click(Sender: TObject);116 begin117   while PageControl1.PageCount > 0 do118     if not ClosePageQuery() then119       break;120   if PageControl1.PageCount = 0 then begin121     C1.Enabled := False;122     L1.Enabled := False;123   end;124 end;125 126 procedure TForm1.ClosePage1Click(Sender: TObject);127 begin128   ClosePageQuery(PageControl1.ActivePageIndex);129   if PageControl1.PageCount = 0 then begin130     C1.Enabled := False;131     L1.Enabled := False;132   end;133 end;134 135 procedure TForm1.FileOpen1Accept(Sender: TObject);136 var137   pIndex: Integer;138   fName: string;139 begin140   Add1.Click;141   pIndex := PageControl1.ActivePageIndex;142   fName := FileOpen1.Dialog.FileName;143   TRecEdit(PageControl1.Pages[pIndex].Controls[0]).Lines.LoadFromFile(fName);144   TRecEdit(PageControl1.Pages[pIndex].Controls[0]).fPath := fName;145   PageControl1.ActivePage.Caption := ExtractFileName(fName);146   //Form1.Caption := fName;147 end;148 149 procedure TForm1.FileSaveAs1Accept(Sender: TObject);150 var151   pIndex: Integer;152   sPath: string;153 begin154   pIndex := PageControl1.ActivePageIndex;155   sPath := FileSaveAs1.Dialog.FileName;156   TRecEdit(PageControl1.Pages[pIndex].Controls[0]).Lines.SaveToFile(sPath);157   TRecEdit(PageControl1.Pages[pIndex].Controls[0]).fPath := sPath;158 end;159 160 procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);161 begin162   while PageControl1.PageCount > 0 do163     if not ClosePageQuery() then begin164       CanClose := True;165       Exit;166     end;167 end;168 169 procedure TForm1.FormCreate(Sender: TObject);170 begin171   n := 1;172   N1.Click;173 end;174 175 procedure TForm1.N1Click(Sender: TObject);        //新建176 begin177   Add1.Click;178   PageControl1.ActivePage.Caption := '無標(biāo)題' + IntToStr(n);179   Inc(n);180 end;181 182 procedure TForm1.S1Click(Sender: TObject);        //保存183 var184   s: string;185   pIndex: Integer;186 begin187   with PageControl1 do begin188     pIndex := ActivePageIndex;189     s := TRecEdit(Pages[pIndex].Controls[0]).fPath;190     if s = '' then begin191       if SaveDialog1.Execute then begin192         TRecEdit(Pages[pIndex].Controls[0]).Lines.SaveToFile(SaveDialog1.FileName);193         TRecEdit(Pages[pIndex].Controls[0]).fPath = SaveDialog1.FileName;194       end;195     end else196       if TRecEdit(Pages[pIndex].Controls[0]).Modified then197         TRecEdit(Pages[pIndex].Controls[0]).Lines.SaveToFile(s);198     ActivePage.Caption := ExtractFileName(s);199   end;200 end;201 202 end.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 赣榆县| 托克逊县| 重庆市| 大方县| 博兴县| 崇仁县| 萝北县| 南木林县| 龙泉市| 定远县| 郎溪县| 邯郸市| 揭阳市| 灵寿县| 扶沟县| 西畴县| 辽宁省| 梅州市| 自贡市| 南漳县| 西和县| 鸡东县| 石首市| 上杭县| 东至县| 茌平县| 建德市| 万山特区| 大理市| 开远市| 敦化市| 和顺县| 东乡| 当阳市| 舟曲县| 手机| 龙川县| 简阳市| 蒲江县| 韩城市| 汝城县|