2009-02-13 257 views
3

我正在爲CAD圖紙的VB.NET批量PDF導出程序工作。程序運行良好,但架構混亂。基本上,一個大的功能從頭到尾都需要整個過程。我想做一個或幾個單獨的課程來完成出口工作。一個班級如何從另一個班級請求信息?

這裏的問題:
有時將由我的程序創建的PDF文件已經存在。在這種情況下,我想問用戶他/她是否要覆蓋現有的PDF。我只想要這樣做,如果實際上有些東西會被覆蓋,我只想這樣做一次。換句話說,「是」=「對所有人都是。」這個表單(它將調用這個新的PDF導出類)似乎是錯誤的,它會計算出哪些PDF文件將被調用,以及是否有任何覆蓋。事實上,最好在處理單個CAD圖紙時確定PDF文件的名稱(因爲我可能想要使用在後臺加載CAD程序中的文件後纔可用的信息)。

這裏的問題:
我應該如何處理提示用戶的進程?我想將所有的GUI邏輯(甚至像對話框一樣簡單)保存在我的PDF導出類中。我需要一種方法讓PDF導出類說:「嘿,我需要知道是否應該覆蓋或跳過此文件」,並且表單類(或任何其他類)說:「嗯,好的,我會詢問用戶並回復你。「

似乎應該有一些模式來處理這種情況。它是什麼?

後續處理:

活動:看起來這是一個很好的路要走。這是關於什麼代碼應該看起來像在PDF導出類?

 
    Dim e As New FileExistsEventArgs(PDFFile) 
    RaiseEvent FileExists(Me, e) 
    If e.Overwrite Then 
     'Do stuff here 
    End If 

一個瘋狂的想法:關於通過委託職能的PDF出口類來處理覆蓋情況下導出方法是什麼?

+0

什麼是你的目標:可維護性,通用(計劃使用具有相同接口的另一導出格式),或兩者兼而有之? – 2009-02-13 14:03:33

+0

主要目標是可維護性。 – 2009-02-13 14:26:19

回答

4

您可以使用一個事件,創建一個自定義事件參數類,該類具有應用程序可以調用的屬性。然後當你的應用程序處理事件提示用戶,然後告訴出口商該做什麼。我是一個C#人,所以讓我給你一個樣本在那裏第一:

void form_Load(object sender,EventArgs e) 
{ 
    //We are subscribing to the event here. In VB this is done differently 
    pdfExporter.FileExists+=new FileExistsEventHandler(pdfExporter_fileExists) 
} 

void pdfExporter_fileExists(object sender, FileExistsEventArgs e) 
{ 
    //prompUser takes the file and asks the user 
    if (promptUser(e.FileName)) 
    { 
    } 
} 
0

所以在你的類相應的方法需要的

[OverwriteExisting as Boolean = False] 

一個可選參數,但是你的形式將需要處理建立一個文件是否存在的邏輯。在我看來,這不會是你想要封裝在PDF導出類中的函數。假設您的表單或其他函數/類確定需要覆蓋,那麼導出方法被稱爲傳遞True作爲布爾到您的導出類。

1

您的PDF製作課程應提高event。這個事件應該有一個eventargs對象,它可以有一個叫做「覆蓋」的布爾屬性,GUI以你想要的方式設置。當事件在您的PDF類中返回時,您將得到用戶的決定,並可以根據需要進行覆蓋或不覆蓋。無論如何,桂可以處理它喜歡的事件。

此外,我讚揚你的工作,以保持兩個獨立!

+0

聽衆不應該改變發件人的行爲。我知道這是違反「可撤銷」事件,但它只是一個黑客。 – 2009-02-13 14:07:05

+0

爲什麼不呢?只要它有充分的文件記錄,問題是什麼? – 2009-02-13 14:21:04

+0

@David Lay 如果這不是正確的做法,那是什麼?還有另外一種方法可以使用更好的事件,或者您會提出其他事件而不是事件? – 2009-02-13 14:28:01

0

你可以做一個兩階段提交類型的東西。

該類有兩個接口,一個用於準備文件名和文件系統,另一個用於執行實際工作。

因此,第一階段,GUI調用初始化界面,並快速回答是否需要重寫。可能甚至是將被覆蓋的文件的全面列表。用戶的答案是,其他響應中的布爾變量是已知的,然後出口者得到真正的工作,用戶可以去做別的事情。

會有一些重複的計算,但它可能是值得的,以儘快讓用戶的操作的一部分。

0

您不能將GUI內容保留在PDF導出代碼之外。但是你可以精確地定義所需的最小值,而不是綁定到你正在使用的任何框架上。

我該如何做是因爲我有一個Status類和一個Progress類。這兩者之所以存在,是因爲狀態是爲了更新狀態消息而設計的,並且進度欄旨在用於指示進度。

它們都使用具有IStatusDisplay和IPrograssDisplay類類型的對象。

我的GUI定義了一個實現IStatusDisplay(或IProgressDisplay)的對象,並將其註冊爲具有狀態和進度的DLL的當前顯示。具有狀態和進度的DLL也有兩個叫做NullStatus和NullProgress的單例,可以在沒有UI反饋需要時使用。

有了這個方案,我可以用我想要的狀態或進度更新來胡椒我的代碼,我只擔心GUI層的實現。如果我想要一個靜默過程,我可以使用Null對象。另外,如果我完全改變我的GUI框架,所有新的GUI必須做的是使新的對象實現IStatusDisplay,IProgressDisplay。

另一種方法是引發事件,但我發現在GUI級別處理令人困惑和複雜。特別是如果你有多個屏幕用戶可以切換。通過使用界面,您可以使連接更加清晰,並且可以長久維護。

編輯 您可以創建一個提示類和IPromptDisplay處理情況怎麼樣,詢問您是否要覆蓋文件。

例如

Dim P as New Prompt(MyPromptDisplay,PromptEnum.YesNo) 
'MyPromptDisplay is of IPromptDisplay and was registered by the GUI when the application was initialized 

If PromptYesNo.Ask("Do you wish to overwrite files")= PromptReply.Yes Then 
    'Do stuff here 
End If 
相關問題