使用Delphi实现win32应用程序的动态流程图
Delphi XE,Win32应用程序,SQL Server 2005数据库.
我正在实施质量管理体系. 这是一个更清楚解释的例子: 假设一个文档控制模块,我们有一个流程图: > [文档控制器]从承包商处接收文档 现在,应用程序应该从数据库中读取其功能的参数. 我想知道实现这样的系统(Delphi XE,win32)的正确方法是什么? 我有一些想法但不确定它是否合适: 我希望我能很好地解释我的问题,如果时间太长,我很抱歉. 谢谢, 解决方法
在我看来,您希望为应用程序执行的每个“业务功能”应用一些通用规则,从而实现某种形式的质量管理.我将使用“业务功能”来表示可能跨越源代码中的若干技术功能和过程的逻辑操作.
没有明确的“正确方法”,但有些想法比其他想法更好. 使用数据库存储动态数据显然是个好主意.例如,您可以将每个业务功能建模为单独的实体(每个业务功能具有一个数据库记录).无论您需要管理每个业务功能的处理所需的变量,都将确定必要的字段.你肯定需要每个人都有一个唯一的ID. 没有理由将业务功能编码到单独的dll中,但我会将它们放在源代码中的单独单元中,或者根据它们的操作类型或对您的业务有意义的其他逻辑分组对功能进行分组.您需要更改调用业务功能的方式.你需要间接调用它们,换句话说,你可以调用一个通用的PerformFunction例程,也许在任何适合你的数据结构中传递一个函数标识符和一些其他参数.随着参数在数据库中的更改(根据您的示例,将文档发送给谁,项目经理或项目架构师?),只要您实现了所有可能的排列,就会相应地修改业务功能的操作.给定每个业务功能的变量数量可能会出现.我确定文档收件人的电子邮件地址不是你想到的全部.这里有一些可能有用的代码.我不是说这是好的代码,只是传达了这个想法. type TFunctionRuntimeParameter = record FunctionID: integer; // this better be unique FunctionName: string; // something intelligible for display purposes ReportToEmail: string; // who to send the end report document AuditLevel: integer; // for example vary the degree of auditing/logging variableABC: TDateTime; // could be a date that influences something end; function TMyForm.GetRuntimeParametersFromDB(aFunctionID: integer): TFunctionRuntimeParameters; var tempResult: TFunctionRuntimeParameters; begin // For brevity I'm going to assume an existing query object connected to your db. qry.SQL.Add('Select * From BusinessFunctions Where Function_ID = :FunctionID'); qry.ParamByName('FunctionID').AsInteger := aFunctionID; qry.Open; tempResult.FunctionID := qry.FieldByName('Function_ID').AsInteger; // don't ask me Y! tempResult.FunctionName := qry.FieldByName('Function_Name').AsString; tempResult.ReportToEmail := qry.FieldByName('Report_To_Email').AsString; tempResult.AuditLevel := qry.FieldByName('Audit_Level').AsInteger; tempResult.variableABC := qry.FieldByName('ABC').AsDateTime; result := tempResult; qry.Close; end; procedure TMyForm.PerformFunction(aFunctionID: integer; FRP: TFunctionRuntimeParameters); var MyReportDocument: TMyReportDocument; begin if (FRP.AuditLevel > 0) then // do something special before starting the function case aFunctionID of 101: MyReportDocument := DoBusinessFunctionABC; 102: MyReportDocument := DoBusinessFunctionDEF; 103: MyReportDocument := DoBusinessFunctionXYZ; end; SendReportDocumentByEmailTo(MyReportDocument,FRP.ReportToEmail); if ((Now - FRP.variableABC) > 28) then // perhaps do something special every 4 weeks! if (FRP.AuditLevel > 0) then // do something special after the function has finished end; procedure TMyForm.btnBusinessFunctionXYZClick(Sender: TObject); var FunctionID: integer; FunctionRuntimeParameters: TFunctionRuntimeParameters; // record that mimics db entry begin FunctionID := 1234; // or you might prefer an enum FunctionRuntimeParameters := GetFunctionRuntimeParametersFromDB(FunctionID); PerformFunction(FunctionID,FunctionRuntimeParameters); end; 这样,随着数据库中运行时参数的更改,应用程序将以不同的方式运行,而无需重新编译. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |