uniGUI的主窗體可以采用多頁面方式進行管理,參考網上的資料,都是用TUniFrame + TUniPageControl 來實現,嘗試了一下,效果還不錯,如下圖:
用TUniFrame 能夠使用繼承模式,我采用了以下的類關系:
TfmeWebEmbedBase : 所有嵌入Frame的基類,實現了與主窗體的交互和控制,包括窗體的關閉等
TfmeWebDBListBase: 與數據集列表操作相關的基類,實現了數據集的開啟、數據導出與打印等
TfmeWebDBListEditBase:與數據集讀寫操作相關的基類,實現了數據集的新增、修改、刪除、導入及保存等
業務窗體根據情況從TfmeWebDBListBase或TfmeWebDBListEditBase繼承。
在主窗體中,首先構建一個列表,容納所有的Frame
FFrameList : TList;
菜單或按鈕點擊,需要開啟業務窗體時,調用函數
procedure TfrmWebMain.ShowFrame(AfmeBaseClass: TfmeWebEmbedClass; AOwnerData: Variant); var ts: TUniTabSheet; fme : TfmeWebEmbedBase; begin { 查找是否已經存在相應的業務窗體 } fme := FindFrame(AfmeBaseClass); { 如果沒有則新建 } if not Assigned(fme) then begin { 先創建TabShee,用於放置Frame } ts := TUniTabSheet.Create(self); ts.PageControl := pcMain; ts.Closable := False; { 置換關閉事件,用於關閉業務窗體 } ts.OnClose := OnTabSheetClose; { 構建業務窗體 } fme := AfmeBaseClass.Create(Self); fme.Parent := ts; fme.TabSheet := ts; fme.Align := alClient; fme.MainForm := Self; { 設置返回事件,當業務窗體按下<返回>時,執行該函數} fme.OnReturn := OnFrameReturn; ts.Caption := fme.ModelName; { 業務窗體加入到列表 } FFrameList.Add(fme); end else { 如果找到已存在的業務窗體,則取其對應的TabSheet} ts := fme.TabSheet; { 進行業務窗體的數據准備工作,失敗則釋放業務窗體 } if not fme.PrepareData(AOwnerData) then begin ReleasFrame(fme); Exit; end; { 顯示業務窗體 } ts.TabVisible := true; pcMain.ActivePage := ts; end;