[英]VB6: Interacting with an invisible form
因此,我在VB中有一個窗體,該窗體是可見的,除非程序以靜默方式啟動,在這種情況下,窗體仍處於加載狀態,但交互是以編程方式完成的。 但是,在極少數情況下,我希望在不可見表單中創建的表單可見。 什么是實現此目的的最佳方法,最好是不創建新表格。 我提出了一些想法,但真的不喜歡:
根本不使用不可見的表單,而是重構代碼以更好地將表單的功能與用法分開。 實際上,這在很大程度上已經是正確的,但是在不重復使用類的方式的情況下,我看不到一種完全做到這一點的方法,因為最終我將不得不使用包含相同功能的不同類。 不過,可能是理想解決方案。
我實際上最終要做什么:在受影響的地方放置一個shell execute調用,這將啟動使用不同標志編譯的程序副本的新實例。 這並沒有聽起來那么糟糕。 使用任何其他解決方案的部分問題在於,每當我想在代碼上拍下不同的UI時,都需要創建一個新的控制器類來以不同方式處理相關事件。 程序的大多數界面已經與實現分開,但是創建新的UI需要我添加額外的事件處理程序以及其他內容。 誠然,它可能僅需要大約3個事件處理程序來處理,從而在觸發事件時提示用戶輸入。
編輯: 在某種程度上,我已經解決了我的問題:問題是我想回收部分現有UI,但不是全部。 因此,使我不希望用戶看到的部件不可見,但使顯示的菜單可見。 去耦各個UI組件可能最終會增加程序的復雜性。
最后一種選擇是可取的; 重構后應該沒有多余的代碼
擺弄無形的表格很好地表明了重構的必要性!
我還建議最后一種選擇。 我要做的是用最少的更改來安全地實現以下內容。
進行備份或將所有內容檢入源代碼管理並創建一個分支。
新建一個ActiveX DLL項目。 我將其命名為UI_Controller的一些變體
注意:一個新項目將迫使您識別EXE中的隱藏依賴項。
讓它引用EXE現在的所有內容。
讓EXE項目引用UI_Controller。
為應用程序中的每種主要形式創建一個類。
將次要對話框復制到UI_Controller DLL中。
對於每種表單,在UI_Controller DLL中創建一個接口類(該表單將實現此接口)
例如,如果您有六個主要表單,則有六個表單接口和六個控制器類
瀏覽每個過程和事件的表單,將過程復制到UI Controller Class並將其公開。
確保每個控制器類都有一個初始化過程。
但是,有一個例外,那就是如果代碼僅處理其他控件和表單。 例如,Resize事件重新排列了代碼。 這樣做的原因是特定於該樣式的邏輯。 使用控制器類的不同窗體或UI將具有不同的調整大小算法,因此將代碼移到任何位置都沒有意義。 您將必須使用自己的最佳判斷。
返回到Controller類。 許多過程將需要引用特定表單上的元素或表單上的火災事件。 在表單接口類中編寫一個子例程頭或函數,以允許發生該事件或檢索所需的信息。 請注意,如果您發現將相同的操作分組在一起或檢索到的相同信息系列,則考慮僅使一個子例程而不是多個子例程。
將對表單的任何直接引用更改為接口上的調用。
讓您的主要形式實現每個接口。 在UI控制器DLL中創建一個GlobalMultiUse類,該類允許EXE向其控制器注冊每個表單。 register子例程應該只接受form接口的對象。 在您執行其他任何操作之前,請在應用程序中初始化將每個主要形式傳遞給正確的注冊功能。
運行您的項目並更正所有錯誤。 請注意,軟件的實際功能應與僅復制和實現時的功能相同。
當軟件運行無誤時。 將其簽入您的源代碼管理或進行備份。
開始用對您的控制器表格的相應方法的調用替換您的一個主要表格中的每個過程。 如果還有其他表單在您正在使用的表單上調用某些內容,則將其切換到控制器。
完成后,請確保在應用程序初始化部分中調用了控制器表單初始化。 您需要切換到使用Sub Main才能正常工作。
當此方法正常工作時,可以在其他表單上使用。 繼續執行此操作,直到所有表格都轉換完畢。
清理所有不使用的東西。
測試,如果通過,您就完成了。
您現在擁有的是一個應用程序,您可以在其中剝離當前的UI,並用實現表單界面的任何內容替換。 因此,您可以擁有一個不可見的EXE,一個單元測試EXE和一個常規的EXE。
您將必須根據應用程序的復雜性來決定最適合自己的。 您可以進行部分轉換,其中僅給一個或兩個表格一個控制器類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.