| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7576 人关注过本帖, 1 人收藏
标题:学习一个月,开始开发系统,开贴做个记念!
取消只看楼主 加入收藏
hmj0745
Rank: 2
等 级:论坛游民
帖 子:53
专家分:83
注 册:2021-11-6
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:25 
学习一个月,开始开发系统,开贴做个记念!
      我是一个42岁的中年老男人了!儿子面临中考,我暂时放弃了手上的工作,回到家中给儿子做辅导。
     工作了这么多年,一下子放松下来,有点很不适应,在上个月的今天,也就是11月6日,我在本站注册了一个号,开始学习写代码,编程方面的知识。经过选择,觉得还是VB最容易实现我的想法,虽然这个语言不是最佳的选择,但对我而言,它却是最适合我的选择!
     一大把年级了,而且我还没有上过大学,我说要学编程开发系统,在大多数人听来,都会来一句,哇,这个大叔真好学啊。 我要是说出来,我准备开发的是一套中大型的公司ERP&EMS管理系统,相信懂这方面的人都会当笑话来听吧。 而且当我学习了一个月后了解的更多我自己也明白要想开发一套中大型系统有多少东西要做。 别人都是团队进行的。我凭什么能一个人想开发整套的系统!我自己也觉得不可能啊。
     但是,房子不也是一块一块的砖搭起来的么?好像有个名言什么的,说的是什么,做行动的巨人,我想不管结果如何,权当人生中的一次突破偿试吧。因为我感兴趣啊!说不准以后能做个副业什么的,当然如果能有所收获,哪就是最好的结果了。
     感谢你!朋友,能看到这里,后续我会在写累了时,就把一些心得苦乐点滴写出来做一个笔记吧。
搜索更多相关主题的帖子: 选择 结果 开发 学习 系统 
2021-12-06 18:05
hmj0745
Rank: 2
等 级:论坛游民
帖 子:53
专家分:83
注 册:2021-11-6
收藏
得分:0 
回复 2楼 约定的童话
感谢版主的提点,我会慢慢来的,后面是真的会有很多地方要请教论坛里的朋友们了。
我明白,后面会有多少困难在等着我....! 一点点克服吧。

不去做永远没有结果!
2021-12-07 01:06
hmj0745
Rank: 2
等 级:论坛游民
帖 子:53
专家分:83
注 册:2021-11-6
收藏
得分:0 
回复 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编辑过]


不去做永远没有结果!
2021-12-07 01:17
hmj0745
Rank: 2
等 级:论坛游民
帖 子:53
专家分:83
注 册:2021-11-6
收藏
得分:0 
主框架已确定好了,为了方便后续布署,选择了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编辑过]


不去做永远没有结果!
2021-12-08 18:50
hmj0745
Rank: 2
等 级:论坛游民
帖 子:53
专家分:83
注 册:2021-11-6
收藏
得分:0 
回复 7楼 罗达
建议现在直接就就用VB 来写。
你有VBA 的基础,会学的很快,就是有一点,移到VB里做,表格方面的操作就没有哪么方便了。
另外就是VB因为年代久远,微软没有再更新了,里面的一些功能控件很旧,如果不是想要脱离office 的环境,达到独立的目的。
其实,用access开发,里面有很多功能和控件要超过VB的。

不去做永远没有结果!
2021-12-08 19:24
hmj0745
Rank: 2
等 级:论坛游民
帖 子:53
专家分:83
注 册:2021-11-6
收藏
得分:0 
回复 8楼 约定的童话
版主,想请教你一下。
我在后面的开发中很多地方要用到表格,因为有进销存的模块。
但我找了几天都找不到合适的表格控件。所有只好选择自带的MSHFlexGrid1
网上的一些好的表格控件,都是要付费的控件,我也不了解需要多少代价,所以心里也没有底。
你有没有什么好的建议?
目前一个是表格问题,还有一个是想在程序里加入像QQ,微信一样的截图功能方便操作。但都是一下子解决不了,暂时只有使用自带的表格。 和暂时使用上载图片再转存的方法。

不去做永远没有结果!
2021-12-08 20:02
hmj0745
Rank: 2
等 级:论坛游民
帖 子:53
专家分:83
注 册:2021-11-6
收藏
得分:0 
回复 9楼 独木星空
谢谢,是的初学者一起讨论也是一个很开心的过程。
可惜现在学VB的人太少,大部分是做一个过渡吧。

不去做永远没有结果!
2021-12-08 20:55
hmj0745
Rank: 2
等 级:论坛游民
帖 子:53
专家分:83
注 册:2021-11-6
收藏
得分:0 
回复 16楼 约定的童话
的确是很不灵活,所以VB表格基本上只是有来展示数据。
但就是这样,这个表格还是不够用。不支持中间滚轮,用代码实现后也不顺。
滑动条用起来也不够丝滑。
但后面的功能模块上必须要用到表格也是没有办法的事。先做做看。

不去做永远没有结果!
2021-12-08 21:03
hmj0745
Rank: 2
等 级:论坛游民
帖 子:53
专家分:83
注 册:2021-11-6
收藏
得分:0 
回复 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编辑过]


不去做永远没有结果!
2021-12-10 22:37
hmj0745
Rank: 2
等 级:论坛游民
帖 子:53
专家分:83
注 册:2021-11-6
收藏
得分:0 
回复 20楼 kings12333
字体好像不能改变大小,好像是根据行高自动适配的。
可以通过在imagelist 插入一个指定像素高度的图片。
这个方法可以调整行高,字体大小,也可以实现隔行变色。
我在 Excelhome 论坛查到过资料,也试过,能实现。
就是我觉得 listviwe 不够稳定,有时在别的是脑上不能打开。
所以不太想用这个控件。

不去做永远没有结果!
2021-12-10 22:48
快速回复:学习一个月,开始开发系统,开贴做个记念!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026750 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved