注册 登录
编程论坛 VB6论坛

学习一个月,开始开发系统,开贴做个记念!

hmj0745 发布于 2021-12-06 18:05, 9606 次点击
      我是一个42岁的中年老男人了!儿子面临中考,我暂时放弃了手上的工作,回到家中给儿子做辅导。
     工作了这么多年,一下子放松下来,有点很不适应,在上个月的今天,也就是11月6日,我在本站注册了一个号,开始学习写代码,编程方面的知识。经过选择,觉得还是VB最容易实现我的想法,虽然这个语言不是最佳的选择,但对我而言,它却是最适合我的选择!
     一大把年级了,而且我还没有上过大学,我说要学编程开发系统,在大多数人听来,都会来一句,哇,这个大叔真好学啊。 我要是说出来,我准备开发的是一套中大型的公司ERP&EMS管理系统,相信懂这方面的人都会当笑话来听吧。 而且当我学习了一个月后了解的更多我自己也明白要想开发一套中大型系统有多少东西要做。 别人都是团队进行的。我凭什么能一个人想开发整套的系统!我自己也觉得不可能啊。
     但是,房子不也是一块一块的砖搭起来的么?好像有个名言什么的,说的是什么,做行动的巨人,我想不管结果如何,权当人生中的一次突破偿试吧。因为我感兴趣啊!说不准以后能做个副业什么的,当然如果能有所收获,哪就是最好的结果了。
     感谢你!朋友,能看到这里,后续我会在写累了时,就把一些心得苦乐点滴写出来做一个笔记吧。
66 回复
#2
约定的童话2021-12-06 18:25
记得多查资料搭框架,不要急于下手,盖房子底基打不好,早晚会有塌的,不懂了或者卡住了论坛发帖,我们都在的!
#3
kings123332021-12-06 19:26
回复 2楼 约定的童话
大哥,我想学数组,但始终找不到方法,看资料也是看不进去,有没有什么好的方法或资料推荐一下,数组太难了,谁发明的啊
#4
约定的童话2021-12-07 00:05
回复 3楼 kings12333
数组就是一个平面的箱子,可以存放数据用,数组分为一维数组和二维数据,数组可以存放大量数据,计算的时候是在虚拟内存里面,所以速度非常快!
#5
hmj07452021-12-07 01:06
回复 2楼 约定的童话
感谢版主的提点,我会慢慢来的,后面是真的会有很多地方要请教论坛里的朋友们了。
我明白,后面会有多少困难在等着我....! 一点点克服吧。
#6
hmj07452021-12-07 01:17
回复 3楼 kings12333
我也是初学的,对数组也是粗浅的了解皮毛。
数组是个好东西,可以把一大堆数据装进去,就会给每个数据生成一个x,y 坐标了。很方便去引用或操作了。
目前,我了解的是1维数组,和2维数组,更高维的太复杂了,我也用不上,所以没有去学。
1维数组,你可以理解为一排数据, 他的坐标是从0 ,1,2 .....这样往后排的。
2维数组,你可以理解为很多排数据,它的坐标是x 和 y 两个方向的数字,比如起始是(0,0),
具体你可以自己多试,我学的这一个月,很多东西都是试出来的,边试边用 msgbox 验证结果。
好像立即窗口也是可以的吧,但我不会用。
另外,补充一点,在学习使用数组时,通常都是要搭配循环一起使用的,有必要时可能还要带上字典(有点复杂)
先把for ...next 循环搞熟了,学循环中我得到的心得是,除了遍历的需要,在得到你所要的条件时。
使用exit for 或者 GOTO 跳出会节省很多时间。

[此贴子已经被作者于2021-12-7 01:57编辑过]

#7
罗达2021-12-07 19:54
回复 4楼 约定的童话
童话版主好,我自己用EXCEL VBA+ADO+ACCESS开发了一个库存系统,感觉如果用类模块会少很多代码,还想移植到VB进行封装exe。我是先学的VBA,现在学习VB,有没有好的类模块(VB的也行)教程分享分享,这块儿的资料比较少,自学难度大。谢谢
#8
约定的童话2021-12-07 22:20
回复 7楼 罗达
链接:https://pan.baidu.com/s/1yt1l01rQr8duMOpwkTPVIA
提取码:j7g7
--来自百度网盘超级会员V5的分享
#9
独木星空2021-12-08 09:36
回复 6楼 hmj0745
往往一个人的学习心得,对于初学者很重要。
#10
独木星空2021-12-08 09:37
回复 8楼 约定的童话
多谢约定的童话版主给提供的连接。
#11
kings123332021-12-08 16:22
回复 6楼 hmj0745
感谢....
#12
kings123332021-12-08 16:23
回复 2楼 约定的童话
有老师真好....
#13
hmj07452021-12-08 18:50
主框架已确定好了,为了方便后续布署,选择了VB做前端,Access做数据库的形式。具体思路如下:
1. ADO 连接ACCESS 全部写到模块 Function 里面,如果后面要升级把数据移到Mysql或是云数据库,只要重写这些连接就行了。
2. 考虑到Access的容量和并发有限,软件分多个功能模块,为每个功能模备独立的MDB数据库, 数据交互时要用到比较多的平面合查询,共用全局联接函数需要设计的好一些。
3. 图片,文件类体积较大的全部用加载读到界面,和指定转存到局域网设定的文件夹内,这样数据库内只用来存纯数据。
这样的话,通过多数据库,和文件存文件夹的方式,应该是可以比较有效的缓解了Access的容量和并发的短处了
这两天做好了登陆窗体,和主框架
1. 登陆窗体上有 单选按钮,可以指定程序路径方式,计划设为:单机、局域网、互联网(目有没有做,要买云数据库)
2. TXT做为,登陆窗体的登陆信息的配置文件,登陆时可以加载上次登陆的信息(这里在想能不能把TXT加密转换成乱码,但又怕影响加载时的读入,后面有空时试一下)
3. 主窗体用MID 窗口,左边用treeview 做功能菜单,点击Node 可以在各功能菜单中转换。tree是通过从数据库加载的,所以支持更换名字和图片。
4. 主窗体左边的功能菜单具备往左边滑入隐藏和拉出效果。子窗体同MID窗体无缝同步缩放(为了解决拉动缩放时的闪屏问题花了我一些时间)
下面上图,和部分代码。 (不知怎么做哪种点击演示的Gif动图,也不知论坛是否支持这个功能)
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
这是几做好的几个界面,下面附上登陆界面的代码,好像前几天看到有人在找这个。
程序代码:

Private Sub Form_Load() '//登陆界面加载
YN = False
Call LoadPath '''加载路径
Call LoadData '''加载预存信息
Call AddIDist '''加载账号list
Rem MeLogo.Picture = LoadPicture(FindPic("\Images\TPIC", "logo001"))'// 用于设计登陆界面加公司logo
End Sub

Private Sub Timer1_Timer()
Unload Me
A0MDIForm1.Show 0
Timer1.Interval = 1000 '开启时钟给予显示登陆成功的提示时间
End Sub


Private Sub Option1_Click() '// 点击后单机路径载入本地数据库
On Error GoTo errmsg
If YN = True Then Exit Sub '如果是由备存记忆带来的触发直接跳转
myPath = App.Path '// 点击后将单机路径赋给变量
Call SavePath '// 路径信息存盘
GoTo 111
errmsg:
    MsgBox Err.Description, , "错误报告"
111
End Sub

Private Sub Option2_Click() '// 把共享数据库路径写入本地数据库
On Error GoTo errmsg
If YN = True Then Exit Sub '//如果是由备存记忆带来的触发直接跳转
myPath = C_SelectPath(Me.hwnd, App.Path)
If myPath = "" Then '//如果没有选择文件夹路径回到选择单机路径
Option1.Value = True
End If
Call SavePath '// 路径信息存盘
GoTo 111
errmsg:
    MsgBox Err.Description, , "错误报告"
111
End Sub

Private Sub AddIDist() '//账号获取list
On Error GoTo errmsg
StrDB = "\data\1系统设置.accdb"
myTable = "A2账号管理"
SQL = "select 账号 from " & myTable & ""
Opendb (StrDB)
Set RS = CreateObject("adodb.recordset") '//创建一个数据集保存数据
RS.Open SQL, cnn, 1, 3 '//数据集保存数据
For x = 0 To RS.RecordCount - 1
Me.账号.AddItem RS.Fields!账号
RS.MoveNext
Next
GoTo 111
errmsg:
    MsgBox Err.Description, , "错误报告"
111
Disconnect
End Sub

Private Sub 登陆_Click(index As Integer)
On Error GoTo errmsg
Static try_times As Byte '设置一个静态变量来保存登错次数
If Me.账号 = "" Or IsNull(Me.账号) = True Then
Msg ("账号不能为空!")
Me.账号.SetFocus
Exit Sub
End If
If Me.密码 = "" Or IsNull(Me.密码) = True Then
Msg ("密码不能为空!")
Me.密码.SetFocus
Exit Sub
End If

StrDB = "\data\1系统设置.accdb"
myTable = "A2账号管理"
SQL = "select 密码 from " & myTable & " where 账号='" & Me.账号 & "'"
Opendb (StrDB)
Set RS = CreateObject("adodb.recordset") '//创建一个数据集保存数据
RS.Open SQL, cnn, 1, 3 '//数据集保存数据

If Me.密码.Text = RS.Fields!密码 Then
Disconnect '//断开数据库,避免给备存账号造成影响

Frame2.Visible = True
Timer1.Interval = 150 '//开启时钟显示登陆成功字标1秒后关闭

Call SaveData '//对登陆信息进行存盘
Call SavePath '//对设置路径进行存盘

Else
   try_times = try_times + 1
    If try_times >= 5 Then
     Msg ("密码错误5次请联系管理员,系统自动退出!")
     Unload Me
     End
     Exit Sub
    End If

 Msg ("密码不正确,请重新输入")

 Me.密码 = ""

 Me.密码.SetFocus

 Exit Sub
End If
GoTo 111
errmsg:
    MsgBox Err.Description, , "错误报告"
111
End Sub

Private Sub SaveData() 'Rem 把保存密码和勾选状态保存到本地
On Error GoTo errmsg
MyId = Me.账号 '//把当前登陆账号赋值给全局
Dim ID, PW, Ck1, Ck2
ID = Me.账号
PW = Me.密码
Ck1 = Check1.Value
Ck2 = Check2.Value
Open App.Path & "\savedata.txt" For Output As #1
Print #1, ID
Print #1, PW
Print #1, Ck1
Print #1, Ck2
GoTo 111
errmsg:
    MsgBox Err.Description, , "错误报告"
111
Close #1
End Sub

Private Sub SavePath() 'Rem 把路径数据备份到本地
On Error GoTo errmsg
If Option1.Value = True Then
Ms = "单机"
Else
Ms = "局网"
End If
Dim Path As String, Op1, Op2 As Boolean
Op1 = Option1.Value
Op2 = Option2.Value
Path = myPath
Open App.Path & "\Savepath.txt" For Output As #1
Print #1, Op1
Print #1, Op2
Print #1, Path
GoTo 111
errmsg:
    MsgBox Err.Description, , "错误报告"
111
Close #1
End Sub

Sub LoadPath() '// 加载路径
On Error GoTo errmsg
YN = True '// 加入一个标记判断,登陆自加载中不触发单选框事件
Dim str As String
Dim arr(3) As String
Open App.Path & "\Savepath.txt" For Input As #1
For x = 1 To 3
Line Input #1, str
If str = "" Then '//如果没有加载到路径信息视为第1次直接加载为单机路径
myPath = App.Path
Me.Option1 = True
GoTo 111
End If
arr(x) = str '//把读取到的数据3条写入数组
Next
If arr(1) = True Then '//如果加载的是单机
myPath = App.Path
Me.Option1 = True
Else '//如果加载的是局网就把存盘的路径写入并点选标记
myPath = arr(3)
Me.Option2 = True
End If
GoTo 111
errmsg:
    MsgBox Err.Description, , "错误报告"
111
Close #1
End Sub

Sub LoadData() '从TXT文件中把登陆备存数据加载进来
On Error GoTo errmsg
YN = True '// 加入一个标记判断,登陆自加载中不触发单选框事件
Dim str As String
Dim arr(4) As String
Open App.Path & "\SaveData.txt" For Input As #1
For x = 1 To 4
Line Input #1, str
If str = "" Then GoTo 111
arr(x) = str '//把读取到的数据3条写入数组
Next
If arr(3) <> 1 Then GoTo 111 '//如果账号是非记录状态直接结束
If arr(3) = 1 Then
Me.账号 = arr(1)
Me.Check1.Value = Checked
End If
If arr(4) = 1 Then '//如密码是记录状态
Me.密码 = arr(2)
Me.Check2.Value = Checked
End If

GoTo 111
errmsg:
    MsgBox Err.Description, , "错误报告"
111
YN = False
Close #1
End Sub

Private Sub 退出_Click()
Unload Me
End
End Sub

'*****************************************************************************************
'
01函数名:  GetPath
'
函数功能:  读档取得数据库路径
'
*****************************************************************************************
Rem
从本机存盘加载数据库路径
Function GetPath()
Dim str As String
Dim arr(3) As String
Open App.Path & "\Savepath.txt" For Input As #1
For x = 1 To 3
Line Input #1, str
If str = "" Then '//如果没有加载到路径信息视为第1次直接加载为单机路径
myPath = App.Path
GoTo 222
Else
arr(x) = str '//把读取到的数据3条写入数组
End If
Next
myPath = arr(3) '//如果加载的是单机
222
Close #1 '// 关闭加载
GetPath = myPath
End Function

'*****************************************************************************************
'
02函数名:  Opendb
'
函数功能:  连接到指定名称的数据库
'
*****************************************************************************************
Public Sub Opendb(StrDB As String) '//输入一个数据库名,连接到数据库,(前面要带/)
If isConnect = True Then Exit Sub '//如果连接为真
myPath = GetPath
Rem 加载路径结束
Set cnn = CreateObject("adodb.connection")  '定义CNN为一个数据集
cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _
myPath + StrDB + ";jet oledb:database password=" & "0745"
If cnn.State <> adStateOpen Then '对连接做出判断,不成功终止
MsgBox "数据库连接失败!", , "系统提示!"
Else
isConnect = True
End If
End Sub

'*****************************************************************************************
'
03函数名:  Disconnect
'
函数功能:  断开数据库连接
'
*****************************************************************************************
Public Sub Disconnect() '// 断开连接
If isConnect = False Then Exit Sub '// 如果处于断开状态直接跳转
cnn.Close
Set cnn = Nothing
isConnect = False
End Sub





[此贴子已经被作者于2021-12-8 19:27编辑过]

#14
hmj07452021-12-08 19:24
回复 7楼 罗达
建议现在直接就就用VB 来写。
你有VBA 的基础,会学的很快,就是有一点,移到VB里做,表格方面的操作就没有哪么方便了。
另外就是VB因为年代久远,微软没有再更新了,里面的一些功能控件很旧,如果不是想要脱离office 的环境,达到独立的目的。
其实,用access开发,里面有很多功能和控件要超过VB的。
#15
hmj07452021-12-08 20:02
回复 8楼 约定的童话
版主,想请教你一下。
我在后面的开发中很多地方要用到表格,因为有进销存的模块。
但我找了几天都找不到合适的表格控件。所有只好选择自带的MSHFlexGrid1
网上的一些好的表格控件,都是要付费的控件,我也不了解需要多少代价,所以心里也没有底。
你有没有什么好的建议?
目前一个是表格问题,还有一个是想在程序里加入像QQ,微信一样的截图功能方便操作。但都是一下子解决不了,暂时只有使用自带的表格。 和暂时使用上载图片再转存的方法。
#16
约定的童话2021-12-08 20:18
回复 15楼 hmj0745
VB表格控件灵活性不太友好,如果你有大批量数据操作,建议放在csv或者SQL数据库里面
#17
hmj07452021-12-08 20:55
回复 9楼 独木星空
谢谢,是的初学者一起讨论也是一个很开心的过程。
可惜现在学VB的人太少,大部分是做一个过渡吧。
#18
hmj07452021-12-08 21:03
回复 16楼 约定的童话
的确是很不灵活,所以VB表格基本上只是有来展示数据。
但就是这样,这个表格还是不够用。不支持中间滚轮,用代码实现后也不顺。
滑动条用起来也不够丝滑。
但后面的功能模块上必须要用到表格也是没有办法的事。先做做看。
#19
风吹过b2021-12-08 21:23
网络,美化的话,我是自定义显示,使用 print 向 pic控件输出,自己画网格线,代码量最大。
如果求简单,不需要编辑,我就使用 listview 显示,可以整行选择,更适合使用习惯,自我感觉这个控件要快一些,当然代码要求更多一点。


#20
kings123332021-12-09 09:10
回复 19楼 风吹过b
版主,Listview控件能改变单行的字体大小吗?
#21
kings123332021-12-09 09:11
回复 13楼 hmj0745
漂亮的布局,能不能分享一下原始文件……我也想看看这些怎么弄出来的
#22
kings123332021-12-09 09:13
回复 13楼 hmj0745
这个表格控件漂亮,叫什么名字啊……朋友
#23
hmj07452021-12-10 22:37
回复 22楼 kings12333
不好意思,源文件不方便发你,正在开发我还没有做完。
思路是:MID窗体 左边加一个Picturebox 里面放treeviwe (通过读取配置文件生成,方便个性化调整),通过time 配合Picturebox 的宽度变化,实现菜单栏的推拉式收起和展开,右边功能区通过 Form_Resize() 随时保持功能区窗体同MID窗体的无缝同步。


表格控件是: MSHFlexGrid1
**窗体中代码***************************************
程序代码:
Private Sub 查询_Click()
On Error GoTo errmsg
'Dim t
'
t = Timer   '//开始时间
Call LockWindowUpdate(Me.hwnd) '//禁止更新防止闪烁
Me.MSHFlexGrid1.Clear
StrDB = "\data\2商务项目.accdb"
myTable = "B1客户列表"

If Me.查询大类 = "" Or Me.关键字 = "" Then
SQL = "select * from " & myTable & " ORDER BY 客户编号 DESC" '//   DESC反序"
Else
Dim NB As String: NB = Me.查询大类
Dim Cx As String: Cx = Me.关键字
SQL = "SELECT * FROM " & myTable & " where " & NB & " like '%" & Cx & "%'"
End If

Opendb (StrDB)
Set RS = CreateObject("adodb.recordset") '//创建一个数据集保存数据
RS.Open SQL, cnn, 1, 3 '//数据集保存数据
Set Me.MSHFlexGrid1.DataSource = RS
Me.Frame2.Caption = "***列表" & RS.RecordCount & "项***"

Call setCol(Me, MSHFlexGrid1, 500, 400) '//自适应列宽,根据是否超首行宽度进行不同的系数补偿
Call SetRowFont(MSHFlexGrid1, 350, 350, 11, 9) '//分别设定首行高度和下面的行高
Call setColAlig(Me, MSHFlexGrid1, 1) '//设置数据对齐方式
Call setBackcol(MSHFlexGrid1) '//设置隔行背景色
Call LockWindowUpdate(0) '//开启更新
GoTo 111
errmsg: MsgBox Err.Description, , "错误报告"
111
'MsgBox "查询完毕!一共用时:" & Format(Timer - t, "#0.0000") & " 秒", , "系统提示!!"   '//提示所用时间
Disconnect
End Sub

***调整表格的代码*************************************************************
程序代码:
   
'01函数名: SetrowFont
'
函数功能: MSHFlexGrid设定单元格隔行背景色
'
参数说明: 表格控件名,首行高,其它行高,首行字号,其它行字号
'
*****************************************************************************************
'
*****************************************************************************************
Public Sub SetRowFont(MSHF As Object, RowH1 As Long, RowH As Long, TextSize1 As Single, TextSize As Single)
Dim i As Integer, j As Integer
    With MSHF
               .TextMatrix(0, 0) = "序号"
               .RowHeight(0) = RowH1  '//第一行行高
        For i = 1 To .Rows - 1
               .TextMatrix(i, 0) = i '//在第一列写入行号
               .RowHeight(i) = RowH '//其它行行高
        Next
        
        .CellFontName = "宋体"
        .CellFontSize = TextSize
       ' .ForeColorFixed = RGB(0, 0, 0) '//标头字体色
       ' .ForeColor = RGB(0, 0, 0) '//普通单元格字体颜色
        
        For j = 0 To .Cols - 1
               .Row = 0
               .Col = j
               .CellFontSize = TextSize1
        Next
    End With
End Sub

'02函数名: setCol
'
函数功能: MSHFlexGrid设定行自适用列宽+补偿
'
*****************************************************************************************
'
*****************************************************************************************
Public Sub setCol(Myform As Form, MSHF As Object, B1 As Long, b2 As Long)
Dim x, y As Integer
Dim Width0, maxwidth, minwidth As Double
With MSHF
For y = 1 To .Cols - 1
Width0 = 0
   For x = 0 To .Rows - 1
      If x = 0 Then
        Width0 = Myform.TextWidth(.TextMatrix(x, y)) '// 把第一行的字段宽度做为初始列宽
          GoTo 222 ' 第一行取得列宽初始值后直接跳转到此
             End If
      If Myform.TextWidth(.TextMatrix(x, y)) > Width0 Then
        Width0 = Myform.TextWidth(.TextMatrix(x, y)) '// 遍历此列找到最宽的一个一行数据,赋给Width0
           End If
222
       Next
               
If Width0 = Myform.TextWidth(.TextMatrix(0, y)) Then '//对字段做出判断
.ColWidth(y) = Width0 + b2 ' //如果列内字符长度不超过首行则补偿系数为b2
Else
.ColWidth(y) = Width0 + B1 ' //如果列内字符串长度超过首行则补偿系数为B1
End If
Next
End With
MSHF.ColWidth(0) = 600 '// 在此直接对第一列做出固定定义
End Sub

'02函数名: setColAlig
'
函数功能: MSHFlexGrid设定单元格对齐方式
'
*****************************************************************************************
'
*****************************************************************************************
Public Sub setColAlig(Myform As Form, MSHF As Object, x As Integer)
Dim y As Integer
For y = 0 To MSHF.Cols - 1

 MSHF.ColAlignment(y) = x

 MSHF.FixedAlignment(y) = 4 '设置首行的对齐方式
Next
End Sub
        
'02函数名: setbackcol
'
函数功能: MSHFlexGrid设定单元格隔行背景色
'
*****************************************************************************************
'
*****************************************************************************************
Public Sub setBackcol(MSHF As Object)
Dim x As Integer
With MSHF
         .AllowBigSelection = True '设置网格样式
         .FillStyle = flexFillRepeat
    For x = 1 To .Rows - 1
         .Row = x: .Col = .FixedCols
         .ColSel = .Cols() - .FixedCols ' - 1
         If x Mod 2 = 0 Then
         .CellBackColor = vbWhite '
         Else
         .CellBackColor = RGB(213, 216, 217) '
         End If
    Next
   '.FocusRect = flexFocusNone
    End With
End Sub
   



[此贴子已经被作者于2021-12-10 22:39编辑过]

#24
hmj07452021-12-10 22:48
回复 20楼 kings12333
字体好像不能改变大小,好像是根据行高自动适配的。
可以通过在imagelist 插入一个指定像素高度的图片。
这个方法可以调整行高,字体大小,也可以实现隔行变色。
我在 Excelhome 论坛查到过资料,也试过,能实现。
就是我觉得 listviwe 不够稳定,有时在别的是脑上不能打开。
所以不太想用这个控件。
#25
kings123332021-12-11 19:07
回复 23楼 hmj0745
帮忙做个例子,看你怎么实现的。
#26
hmj07452021-12-11 19:58
回复 25楼 kings12333
因为我开发的项目都是相关联的,拆分出来一小块还比较麻烦。
给你拆分出来MSHFlexGrid1 表格的一个实例 。以及增删改查的全套代码和一些我使用成熟的函数。
里面都写了注释,我也是刚学一个月,理解的不一定正确,具体你自己一步一步看吧
*附件***********************
只有本站会员才能查看附件,请 登录

如果你要 listviwe 的资料,进这个excel论坛查看
https://club.

[此贴子已经被作者于2021-12-11 20:03编辑过]

#27
hmj07452021-12-12 01:18
    哈哈有点小开心了,到现在BOM模块基本上算是写完了。这也是物料管理的最核心部分了。就这一个子模块功能,前前后后用了快两周了,脑细胞死了不少!
总结一下,以下几点:
1. 数据库内层级码规律的设计,字符串的拆分组合逻辑。排序,层级逻辑。
2. 从数据库内查询层级码后,自动生成Treeviwe,这里攻关了根据件名全自动匹配零件图,总成子件的多层级严格排序难点(产品由多层级的总成,小总成,子件构成,对层级的变化和要求很严格)
3. 从Treeviwe界面上可视化,随意增改删各层级子件,和图片,理论上可以无限层级增加,每个单层级的子件上限为999件,相信如果不是造飞机,这个量是冗余量是够了的。
4. 可操作Excel模板批量编辑BOM层级,导入数据库,自动加载到软件前端。批量上传前进行自检,和比对数据库中已存在同零件层级码,因为层级码的规则是BOM精确性的关键点,所以上传前双层自检很重要,本来想简单点,如果上传的数据错了,删除重新上传。但想一下还是做好防呆吧,有可能错误的数据不要进数据库。这里用到了数组和字典,字典不太熟所以多花了一天时间。
    我相信在现有这个思路上,还是有很多提升的空间,后面自己有能力了再从算法上改良吧。 有一个缺憾就是,用VB操作EXcel ,开始调用时,响应会有个1秒的延迟,不够丝滑啊。 考虑加个进度条吧,VB的单线程,也不好搞。因为我这个过程不是循环造成的。也不好加进度条,有点难搞啊。
#28
kings123332021-12-12 22:08
回复 27楼 hmj0745
大哥,没有数据库报错,起动不了
#29
kings123332021-12-12 22:14
只有本站会员才能查看附件,请 登录
报错信息
#30
hmj07452021-12-12 22:41
回复 29楼 kings12333
1. 解压文件后,数据库是包含在DATA 文件夹内的。代码会自动访问连接。解压后不要把文件拖出来启动,就在哪个文件夹里运行。因为数据路径设为了 APP.path\DATA
2. 报错的是表格插件,其实示例里面没有用到,不影响。 你可以在部件里加载这个就行了。
*************
只有本站会员才能查看附件,请 登录
#31
kings123332021-12-13 00:14
回复 30楼 hmj0745
只有本站会员才能查看附件,请 登录
指定了路径,还是报错
#32
hmj07452021-12-13 12:42
回复 31楼 kings12333
呃, 你发的这个只是我没有删除的登陆界面的读取txt配置的一个过程。我的所有代码都全在里面了。
如果只是要看表格演示过挰,你可以直接修改连接路径就行了,代码直接改几个字就行了。
如果是别人写的代码逻辑,我也可以一步一步 F8 看, 就能搞清楚了。
只有本站会员才能查看附件,请 登录
#33
wlbwxd2021-12-13 14:49
回复 26楼 hmj0745
建议使用VSFLEXGRID这个表格控件,功能强大,使用很方便,大部份功能设置与msflexgrid一样,但功能更多,更重要的是支持打印,这点很重要。
#34
wlbwxd2021-12-13 14:53
只有本站会员才能查看附件,请 登录
#35
kings123332021-12-13 15:14
回复 32楼 hmj0745
好的
#36
hmj07452021-12-13 15:21
回复 34楼 wlbwxd
感谢!
请教一下,VSFLEXGRID 需要收费吗,还是免费开源的?

看你做的这个界面,你是做机加工行业的,你做的这个界面
我要做的大部分模块功能和你左边菜单标的差不多。
你开发完这一套花了多长时间 ?
#37
风吹过b2021-12-13 17:31
提一个浩大代码的建议

显示界面做的不好看,可以不可以使用 webbrow 来显示 ,程序里生成 html 代码,再加上CSS,加上JS,拼起来显示。
选中的话,可以使用JS后台提交数据,程序拦截提交的数据来响应。
#38
hmj07452021-12-13 17:43
回复 37楼 风吹过b
目前编程储备知识还不够,风版的这些好的建议我们还没有能力去实践,
慢慢进步,慢慢来。
#39
wlbwxd2021-12-13 18:06

'vsflexgrid获取数据源
Function VSFGridAdd(SqlText As String, vsfg As Object) As Recordset
    Dim cn As New ADODB.Connection
        If cn.State = adStateOpen Then cn.Close
        cn.ConnectionString = ConnectString
        cn.Open
        cn.CursorLocation = adUseClient         '使用客户端游标   
        Dim MyComm As New          '定义一个命令对象
        Dim param As ADODB.Parameter            '定义一个参数对象
        Set VSFGridAdd = New ADODB.Recordset
        With MyComm
                .ActiveConnection = cn           '数据连接
                .CommandType = adCmdText         '调用SQL 查询语言
                .Prepared = True                 '要求将SQL命令先行编译
                .CommandText = SqlText
        End With
        If TypeOf vsfg Is VSFlexGrid Then
            vsfg.VirtualData = False             '如果为true,只能显示前100条记录
            Set vsfg.DataSource = MyComm.Execute()
        Else
            Set VSFGridAdd = MyComm.Execute()     ' 执行此存储过程,返回记录集
        End If
End Function
#40
kings123332021-12-14 09:35
回复 39楼 wlbwxd
如果数据源是TXT文件,怎么引用到这个表格控件上来呢
#41
广泛豆腐干2021-12-15 19:36
回复 楼主 hmj0745
楼主我也有这个想法,可以加好友吗?沟通分享一下经验。我的微信13922213659
#42
罗达2021-12-17 20:38
回复 8楼 约定的童话
感谢童话版主的推荐分享
#43
罗达2021-12-17 20:45
回复 14楼 hmj0745
我的已经在VBA里做好了,也有版本问题。局域网里面有些电脑可用,有些电脑就不可以。主要想能否写一个不那么依赖软件环境的,就想用VB写好制作成安装文件来用。
现在遇到一个难题:VB访问access2016很麻烦,第一次装的VB还能找到驱动引擎,就是不能保存,保存后再打开就丢失了几个控件(从部件里引用的例如DataGrid),于是重装了系统、VB、office,结果现在的VB直接只有3.51和4.0两个引擎版本了,只能用mdb格式,纠结中
#44
hmj07452021-12-18 12:30
回复 43楼 罗达
不知道你用的是不是accdb 格式。 一般来说,不会出现你说的哪种情况。我现在就是用accdb 做数据库。联接是完全没有问题的。 下面是我以前用过的一些連接代码
给你参考一下。
在模块中的代码******************************
程序代码:
'*****************************************************************************************
'
03函数名:  OPENACCESS
'
函数功能:  打开数据库形成一个记录集(myPath ,myTable是全局变量)
'
*****************************************************************************************
Function OPENACCESS(SQL As String) ''
On Error GoTo errmsg   ' 改变错误处理的方式。
    Dim cnn '定义数据库连接和SQL语句
    Set cnn = CreateObject("adodb.connection")  '定义CNN为一个数据集
    Set RS = CreateObject("adodb.recordset") '创建一个数据集保存数据
    If Application.Version * 1 <= 11 Then
    cnn.Open "Provider=Microsoft.jet.OLEDB.4.0;Data Source=" & myPath & " ; jet oledb:database password=" & "0745" '//0745是数据库密码
    Else
    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & myPath & ";jet oledb:database password=" & "0745"
    End If
    RS.Open SQL, cnn, 1, 3 '创建一个可以读写的数据集’// 这一句也可以不写在模块里
    GoTo 111
errmsg:
    MsgBox Err.Description, , "错误报告"
111
End Function

*****应用中**************************
程序代码:
Private Sub Command信息删除_Click()
'On Error GoTo errmsg
If MsgBox("是否删除【" & Me!客户简称 & "】的所有信息资料?", 32 + vbYesNo, "系统提示!") = vbYes Then
Rem 定义数据路径
myPath = 下载路径("数据库路径") & "\2商务项目.accdb" '//下载路径是定义的一个函数,用来抓取存在数据库中备存的各种路径,这里可以直接换成路径
myTable = "B1客户列表"
Rem 结束
SQL = "SELECT * FROM " & myTable & " where 客户编号='" & Me!客户编号 & "'"
OPENACCESS (SQL)
RS.Delete
RS.Close
Set RS = Nothing
Rem 清空
Call 清空控件(Me.Form)
MsgBox "删除记录成功", , "系统提示!"
End If
Call Command查询_Click
Me!B1客户管理子窗.Requery '//刷新
Application.RefreshDatabaseWindow
Exit Sub
errmsg: MsgBox "数据库内没有" & Me!客户编号 & "这个编号记录", , "系统提示!"
End Sub

另外用VBA开发的话,建议用Access来开发,在一定程度上还要优于VB, 主要缺点就是在要别人的电脑上安装Access ,比较麻烦。不推荐用EXCL开发,因为EXCL基本上每台办公电脑都会要用到,有的人喜欢office,有的人喜欢wps,而且就算全用excel,版本不一致还是很多不适配。让所有的电脑统一用同一版本的excl比较麻烦,你布署软件运行就很麻烦。ACCess的话用于日常处理办公的人很少,软件冲突的可能性要小很多
#45
wmf20142021-12-19 16:09
回复 楼主 hmj0745
楼主这智商没有240,断然是不会才学一个星期就能独立做应用的。

想当年,孔乙己是用VB6写代码唯一的人,他对人说话,总是满口“if then ,for”,教人半懂不懂的。孔乙己一开始打开VB6,一办公室的人就看着他笑,故意的高声嚷道,“你一定又侵了人家的版权了!”孔乙己睁大眼睛说,“你怎么这样凭空污人清白……”“什么清白?我前天亲眼见别人网上说你代码和bccn的完全一样,网管都把你禁言了。”孔乙己便涨红了脸,额上的青筋条条绽出,争辩道,“^C^V不能算侵权……侵权!……IT人的事,能算侵权么?”接连便是难懂的话,什么“面向对象”,什么“框架”之类,引得众人都哄笑起来,办公室内外充满了快活的空气。在这些时候,对面的小姐姐也可以附和着笑,boss是决不责备的。而且boss见了孔乙己,也每每这样问他,引人发笑。孔乙己自己知道不能和他们谈天,便只好向对面小姐姐说话。一次,孔乙己见小姐姐在Access里调试sql语句,就问小姐姐:“你知道VB6连接Access数据库主要有三种方式么?”,小姐姐皱着眉头,一脸厌恶地说道:“我干嘛要知道VB6怎么连接呀,现在都是用python+mysql好么”,孔乙己见小姐姐毫不热心,便又叹一口气,显出极惋惜的样子。

娱乐一下,无他


[此贴子已经被作者于2021-12-19 16:17编辑过]

#46
hmj07452021-12-19 20:21
回复 45楼 wmf2014
    自问年级一大把了,也不至于有哗众取宠的爱好了,只不过是借论坛冷清的一角,记录一下自己心情,说直白一点,当属自娱自乐而已,如果能收获几个志同道合的朋友,平时讨论一下,也是一个开心的事情。 从没想过,也不致于去触怒别人!
******************************************
    贵宾您可能是看的太快,我从没说过,学一个星期来做应用。11月份开始正式接触VB的, 以前上班时对excel VBA 有一定的了解和应用。然而就算是我真说了,又如何呢?这也只是,敢与不敢的区别,而决扯不到智商的高度吧。
    无知者无畏,的确,我无知,所以我无畏!我开篇时就已承认了的,了解的越多,就知道自己欠缺的更多,做为专业的人或是高人,的确有资格站在高度上,甚至于带着怜悯的心态来府视我们初学者,并表达一些看法。 但这并不能影响我自己去决定做什么吧。
******************************************
    至于代码的原创性,我买了几本书,还天天看论坛,都是抄的,连 if, then,next 这些单词 都是抄的,我自己也没有能力创造出什么新的东西。这一点我完全承认的
    另外,我也没有吃着几颗茴香豆,蘸着酒水教大文豪写字的胆量。只不过是人家在我开的贴子里提问了,我尽我的能力和我的理解给出回应。仅此而已! 至于是否会招人厌恶,我倒是还没有去想过。毕竟,我也没有主动窜到人家面前去之乎者也吧! 我不好为人师,
******************************************
    我,一个普通中年人,因爱好,借贵宝地一角,做一个心得记录,不妨碍别人的.....! 仅此而已!无他亦无妨吧.......。


[此贴子已经被作者于2021-12-19 20:24编辑过]

#47
kings123332021-12-20 19:22
回复 46楼 hmj0745
大哥,别跟那小人一般见识,有没有联系方式加下QQ,我的Q:414096340
#48
hmj07452021-12-20 21:40
回复 47楼 kings12333
QQ好久没用了,我下载好了后加你!

也没什么,只是有些奇怪。
有能力去汇编语言版块秀一下,不是更有存在感吗?
如果很强,可以用 010101 编出一段来,给大家学习,哪就更能让人仰视了!

主观意识里,还在用过气的VB的人,都是孔乙已,迂腐且落后。用高级流行语言的人是高端的,雷军、乔布斯式的精英。
基础不一样,起点不一样,面向的需求情况也不一样,老旧的VB并非原罪。总有它价值的存在。

说实话,在VB版块,几个初学者面前,也体现不出多少的优越感!


[此贴子已经被作者于2021-12-20 21:43编辑过]

#49
hmj07452021-12-21 17:56
    今天心情不错,做个小总结,首先感谢 wlbwxd 给我推介的 VS 表,我们一起学习这个表的用法,。 真的是比较好用,相较自带的表单。 好用太多,Excel上的一些功能都可以移过来。其中复制粘贴很不错! 主要是wlbwxd 的改良很不错!
*界面操作,发几个动图,不知是否能发,*********************************************
只有本站会员才能查看附件,请 登录

*软件中VS表和外部软件EXCEL 数据的自由粘贴复制交换数据*************************************
只有本站会员才能查看附件,请 登录

*EXcel中一些常用的功能在VS中的模仿*************************************
只有本站会员才能查看附件,请 登录


大神略过,不要嘲讽了! 初学者的自嗨而已!!!

为什么图片发上来,拉的这么大。。。。

[此贴子已经被作者于2021-12-21 18:04编辑过]

#50
vb小小白2022-01-17 19:40
加油!我也是刚开始入门
#51
qiu44662022-01-18 08:19
回复 楼主 hmj0745
支持一下,祝你学习进步,步步高升
12