2009-02-13 261 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 
相关问题