| 网站首页 | 业界新闻 | 小组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
买学问 - 大牛一对一辅导,有问必答买学问 - 专业的付费知识问答平台
共有 443 人关注过本帖
标题:传递图片控件参数的问题
只看楼主 加入收藏
chen3bing
Rank: 2
等 级:论坛游民
帖 子:291
专家分:99
注 册:2008-11-12
结帖率:90.59%
  已结贴   问题点数:10  回复次数:8   
传递图片控件参数的问题
我界面上有一个picturebox控件。
我一开始初始化
PicFrame.Width = 1400
后来调用一个函数,如下:
'数据显示窗口宽度初始化
Private Sub InitialGraph(ByVal Pic As PictureBox, ByVal XMin As Long, ByVal XMax As Long, ByVal YMin As Integer, ByVal YMax As Integer)
  
  intDisplayWidth = Pic.ScaleWidth - Pic.ScaleLeft - intLeftMargin - intRightMargin   '计算动态曲线显示窗口的宽度
  intDisplayHeight = Pic.ScaleHeight - Pic.ScaleTop - intTopMargin - intBottomMargin   '计算动态曲线显示窗口的宽度
  
  intPixelsPerStepInX = intDisplayWidth / (XMax - XMin) / 20  '计算每两相邻点间像素数
  'intPixelsPerStepInX = 1
  intDisplayWidth = intPixelsPerStepInX * (XMax - XMin) * 20 '重新计算动态曲线显示窗口的宽度
  
 ' PicFrame.Width = intLeftMargin + intRightMargin + intDisplayWidth  '将曲线显示窗口的宽度设为像素的整数倍
 
  Pic.Width = intLeftMargin + intRightMargin + intDisplayWidth  '将曲线显示窗口的宽度设为像素的整数倍
End Sub
调用语句:
InitialGraph PicFrame, intXMin, intXMax, intYMin, intYMax '初始化数据显示窗口宽度
调用了这个函数,发现PicFrame.Width=1065
,参数没传过去。
貌似不能这样传参数,那应该怎么传呢?谢谢!
2019-01-07 16:05
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:248
帖 子:4394
专家分:26986
注 册:2008-10-15
  得分:2 
ByVal Pic As PictureBox

这里怎么按值传递,
本来对象,都是要按 地址传递的,修改后的结果才能被反应出来。
要求修改有反应的变量都按地址传递,你来一个按值传递。


授人于鱼,不如授人于渔
早已停用QQ了
2019-01-07 16:58
chen3bing
Rank: 2
等 级:论坛游民
帖 子:291
专家分:99
注 册:2008-11-12
  得分:0 
回复 2楼 风吹过b
怎么按地址传递?你教我
2019-01-07 17:25
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:248
帖 子:4394
专家分:26986
注 册:2008-10-15
  得分:2 
vb默认是按地址传递参数,你去掉 前缀 byval 就可以了。
要显示申明按地址,前缀是 byref

授人于鱼,不如授人于渔
早已停用QQ了
2019-01-07 17:48
chen3bing
Rank: 2
等 级:论坛游民
帖 子:291
专家分:99
注 册:2008-11-12
  得分:0 
谢谢!
Private Sub InitialGraph(ByRef Pic As PictureBox, ByVal XMin As Long, ByVal XMax As Long, ByVal YMin As Integer, ByVal YMax As Integer)
  intDisplayWidth = Pic.ScaleWidth - Pic.ScaleLeft - intLeftMargin - intRightMargin   '计算动态曲线显示窗口的宽度
  intDisplayHeight = Pic.ScaleHeight - Pic.ScaleTop - intTopMargin - intBottomMargin   '计算动态曲线显示窗口的宽度
  
  intPixelsPerStepInX = intDisplayWidth / (XMax - XMin) / 20  '计算每两相邻点间像素数
  'intPixelsPerStepInX = 1
  intDisplayWidth = intPixelsPerStepInX * (XMax - XMin) * 20 '重新计算动态曲线显示窗口的宽度
  
  PicFrame.Width = intLeftMargin + intRightMargin + intDisplayWidth  '将曲线显示窗口的宽度设为像素的整数倍
 
 ' Pic.Width = intLeftMargin + intRightMargin + intDisplayWidth  '将曲线显示窗口的宽度设为像素的整数倍
End Sub
我这样还是不行啊
2019-01-08 08:36
wmf2014
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:175
帖 子:1774
专家分:9980
注 册:2014-12-6
  得分:2 
经验证,无论传址还是传值都能修改传递对象的属性,没达到楼主要求,应该是逻辑思路问题。
另:设计函数或过程尽量只使用传递的参数,不要使用外部变量,这样可保证代码的可维护性和通用性。

估计你的问题是picture的scalwidth和width不一致造成的。

[此贴子已经被作者于2019-1-8 09:31编辑过]


能编个毛线衣吗?
2019-01-08 09:27
chen3bing
Rank: 2
等 级:论坛游民
帖 子:291
专家分:99
注 册:2008-11-12
  得分:0 
回复 6楼 wmf2014
PIC.Width和PIC.SCALEWidth都是1065
2019-01-08 09:57
wds1
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:36
帖 子:347
专家分:1840
注 册:2016-3-10
  得分:2 
byref 按地址传送,byval按值传送

Private Sub InitialGraph(Byref Pic As PictureBox, ByVal XMin As Long, ByVal XMax As Long, ByVal YMin As Integer, ByVal YMax As Integer)

你也可以用用函数返回新的宽度,在创给pic的。



[此贴子已经被作者于2019-1-8 10:20编辑过]

2019-01-08 10:19
wmf2014
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:175
帖 子:1774
专家分:9980
注 册:2014-12-6
  得分:2 
大致看了下,觉得你那个(XMax - XMin) / 20和(XMax - XMin) * 20不好理解,如果按像素点理解的话1400twip实际像素是93,如果除以20,则只有70,差23pixel=345twip,1400-345=1055,和你的1065隔10隔可能是你加入的其他量造成的。如果需要twip对应的是整数像素点,你只要做int(1400/15)*15=1395就是整数像素点了。

能编个毛线衣吗?
2019-01-08 20:24







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

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