自动生成用于填写青铜器的“工作日报”(VB.NET改进版)

之前写过一篇 C#自动生成用于填写青铜器的“工作日报”。由于后来重装了几次系统,每次重新编译都要拉界面,感觉很不方便 :-(好吧这和我比较懒也有关系,所以这回加强了一下程序的功能。重写后的程序,生成条目的数量和生成条目的内容都放到了XML配置文件里。方便编译,缺点是控制台没有TopMost属性,每轮“复制+粘贴”后都要把控制台呼唤出来。

配置文件LogConfig.xml,要求与本程序的可执行文件在同一个目录下:

<?xml version="1.0" encoding="utf-8" ?>
<Root LogNeed="4">
  <Log Text="维护监控客户端,优化代码" />
  <Log Text="与研发中心协调解决监控客户端的内存泄漏问题" />
  <Log Text="学习C++编程" />
  <Log Text="熟悉linux环境" />
  <Log Text="修复程序BUG,发布版本" />
  <Log Text="搭建环境,测试程序运行" />
  <Log Text="对程序进行新一轮的自测,优化代码" />
  <Log Text="阅读项目文档,学习项目相关知识" />
  <Log Text="研究监控数据脚本,熟悉Linux上的Oracle数据库相关知识" />
  <Log Text="修订详细设计文档" />
  <Log Text="维护监控系统,为NEEQ提供技术支持" />
  <Log Text="探讨新需求的实现,评估新需求的可行性" />
  <Log Text="制定了新需求的实现时间表" />
  <Log Text="程序编码" />
  <Log Text="程序新功能实现,发布新版本" />
  <Log Text="参加业务相关的集中培训" />
  <Log Text="总结程序运行环境,完善程序相关文档" />
  <Log Text="为程序部署提供技术支持" />
  <Log Text="完善监控客户端使用手册" />
</Root>

程序代码:

Imports System.Xml

Module MainModule

    Sub Main()

        ‘读取XML文档中的内容
        Dim xmlDoc = New XmlDocument
        xmlDoc.Load("LogConfig.xml")
        Dim xmlRoot As XmlNode = xmlDoc.SelectSingleNode("Root")
        ‘统计一共需要随机选出多少项
        Dim iLogNeed As Integer =
            DirectCast(xmlRoot, XmlElement).GetAttribute("LogNeed")
        ‘统计有多少个XmlElement
        Dim counter As Integer = 0
        For Each xmlObj In xmlRoot.ChildNodes
            If xmlObj.GetType().ToString() = "System.Xml.XmlElement" Then
                counter = counter + 1
            End If
        Next
        ‘生成数组
        Dim sGoingText() As String = New String(counter - 1) {}
        counter = 0
        For Each xmlObj In xmlRoot.ChildNodes
            If xmlObj.GetType().ToString() = "System.Xml.XmlElement" Then
                sGoingText(counter) =
                    DirectCast(xmlObj, XmlElement).GetAttribute("Text")
                counter = counter + 1
            End If
        Next

        ‘For Each x In sGoingText
        ‘   Console.WriteLine(x)
        ‘Next

        ‘如果要选出的条目数大于总共的条目数,则报警并退出
        If iLogNeed > sGoingText.Length Then
            Console.WriteLine("配置错误:条目数不够")
            PrintAChar()
            Environment.Exit(exitCode:=1)
        End If

        ‘循环生成日志条目
        While True
            Try
                ‘生成一组日志信息
                Generate(iLogNeed, sGoingText)
                PrintAChar()
            Catch ex As Exception
                Console.WriteLine(ex.Message)
            End Try
        End While

    End Sub

    ‘‘‘ <summary>
    ‘‘‘ 生成n个不重复的有序随机数,并将s中的内容按生成的随机数打印出来
    ‘‘‘ </summary>
    ‘‘‘ <param name="n">生成条目数</param>
    ‘‘‘ <param name="s">源条目内容</param>
    ‘‘‘ <remarks></remarks>
    Private Sub Generate(n As Integer, s() As String)

        ‘随机生成4个不重复的数字由小到大排列
        Dim rd As Random = New Random(DateTime.Now.Millisecond)
        Dim rdnum(n - 1) As Integer ‘生成数组,下标从0到n-1
        For i As Integer = 0 To n - 1
            ‘生成不重复的四个随机数
            rdnum(i) = rd.Next(s.Length)
            Dim bNeedRdAgain As Boolean = False
            Do
                bNeedRdAgain = False
                For j As Integer = 0 To i - 1
                    If rdnum(j) = rdnum(i) Then
                        ‘随机数重复则重新生成一个随机数,重新判定
                        bNeedRdAgain = True
                        rdnum(i) = rd.Next(s.Length)
                        Exit For
                    End If
                Next
            Loop Until Not bNeedRdAgain
        Next

        Dim a = 1

        ‘为生成的n个随机数排序
        Array.Sort(rdnum)

        Dim sb As Text.StringBuilder = New Text.StringBuilder
        For i As Integer = 1 To n
            sb.Append(i.ToString + "." + s(rdnum(i - 1)) + vbCrLf)
        Next
        Console.WriteLine(sb.ToString)

        ‘复制生成的内容到剪贴板
        ‘需要手动添加引用 System.Windows.Forms
        System.Windows.Forms.Clipboard.Clear()
        System.Windows.Forms.Clipboard.SetText(sb.ToString()) ‘复制到剪贴板()

        Console.WriteLine("内容已被复制到剪贴板")

    End Sub

    ‘‘‘ <summary>
    ‘‘‘ 实现按任意键继续
    ‘‘‘ </summary>
    ‘‘‘ <remarks></remarks>
    Private Sub PrintAChar()

        Console.Write("按任意键继续")
        Console.ReadKey()
        Console.WriteLine(vbBack + vbCrLf)

    End Sub

End Module

程序运行效果:

END

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。