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

前端之家收集整理的这篇文章主要介绍了自动生成用于填写青铜器的“工作日报”(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

猜你在找的VB相关文章