设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
楼主: 小黄鸡
打印 上一主题 下一主题

[有事请教] 请教一个vb的问题Orz(←模糊标题自重)

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
23 小时
注册时间
2011-8-15
帖子
44
11
 楼主| 发表于 2011-11-2 12:23:52 | 只看该作者
熊猫 发表于 2011-11-2 10:57
Dim arr1() As Integer = {1, 2, 3}
        Dim arr2() As Integer = {2, 3, 4}
        Dim li ...

new list定义不能
然后请问熊猫君如果换成byte如何组合呢?
0v0
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
72
在线时间
673 小时
注册时间
2006-10-3
帖子
1795

开拓者

12
发表于 2011-11-2 14:44:03 | 只看该作者
本帖最后由 熊猫 于 2011-11-2 14:45 编辑
小黄鸡 发表于 2011-11-2 12:23
new list定义不能
然后请问熊猫君如果换成byte如何组合呢?


        Dim arr1() As Byte = {1, 2, 3}
        Dim arr2() As Byte = {2, 3, 4}
        Dim list As New List(Of Byte)
        list.AddRange(arr1)
        list.AddRange(arr2)
        Dim new_arr() As Byte = list.ToArray
Byte一个道理。这个……话说只有VB.NET才可以用List。。

如果是原始的VB6的话,就写一个Sub或者Function。我不是很确定VB6的Function是否能返回数组~Sub的话注意接收参数要定义为ByRef。
用Ubound函数取前后两个数组长,根据长度ReDim一个新数组。再把两个数组填进去,新数组就是你要的合并后的了。
用VB.NET仿VB6的风格写了一个。
  1.     Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  2.         Dim arr1() As Byte = {1, 2, 3}
  3.         Dim arr2() As Byte = {4, 5, 6}
  4.         Dim new_arr() As Byte = Nothing
  5.         Call CombineArraries(arr1, arr2, new_arr)
  6.         For Each bit In new_arr
  7.             Debug.Print(bit)
  8.         Next
  9.     End Sub
  10.     Sub CombineArraries(arr1() As Byte, arr2() As Byte, ByRef new_arr() As Byte)
  11.         ReDim new_arr(UBound(arr1) + UBound(arr2) + 1)
  12.         arr1.CopyTo(new_arr, 0)
  13.         arr2.CopyTo(new_arr, UBound(arr1) + 1)
  14.     End Sub
复制代码
输出了:
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
复制代码
不过好像VB6的话,CopyTo也没有,倒是可以用循环替代。
( ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็ ω ส้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้【看猫君玩,我也搞一只】)
回复

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
39832
在线时间
7490 小时
注册时间
2009-7-6
帖子
13485

开拓者贵宾

13
发表于 2011-11-2 16:19:13 | 只看该作者
熊猫 发表于 2011-11-2 14:44
Dim arr1() As Byte = {1, 2, 3}
        Dim arr2() As Byte = {2, 3, 4}
        Dim list As  ...

循环那悲催的效率囧。
vb6没有更直接的方法组合两个byte吗囧rz。
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
72
在线时间
673 小时
注册时间
2006-10-3
帖子
1795

开拓者

14
发表于 2011-11-2 17:00:05 | 只看该作者
fux2 发表于 2011-11-2 16:19
循环那悲催的效率囧。
vb6没有更直接的方法组合两个byte吗囧rz。

小查了一下,简单对象的数组好像可以使用CopyMemory。21点后回来研究研究……不知道别人有什么好方法~

点评

熊猫君知道有什么高效截屏的方法吗?详见21楼  发表于 2011-11-2 20:51
( ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็ ω ส้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้【看猫君玩,我也搞一只】)
回复

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
39832
在线时间
7490 小时
注册时间
2009-7-6
帖子
13485

开拓者贵宾

15
发表于 2011-11-2 17:05:29 | 只看该作者
熊猫 发表于 2011-11-2 17:00
小查了一下,简单对象的数组好像可以使用CopyMemory。21点后回来研究研究……不知道别人有什么好方法~ ...

当前用的copymemory,但是生成的图有错位颜色也诡异,下标都改过尝试了。
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
72
在线时间
673 小时
注册时间
2006-10-3
帖子
1795

开拓者

16
发表于 2011-11-2 17:09:53 | 只看该作者
fux2 发表于 2011-11-2 17:05
当前用的copymemory,但是生成的图有错位颜色也诡异,下标都改过尝试了。

你检查一下CopyMemory后数组是否是正好俩拼在一起。是不是一些数据改变了。
如果数据有变化,就是CopyMemory的问题。
如果数据正好是俩数组拼起来的,那就是拼的问题,是不是拼的时候要去除或者添加一些东西。
( ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็ ω ส้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้【看猫君玩,我也搞一只】)
回复

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
39832
在线时间
7490 小时
注册时间
2009-7-6
帖子
13485

开拓者贵宾

17
发表于 2011-11-2 17:34:27 | 只看该作者
本帖最后由 fux2 于 2011-11-2 17:38 编辑
熊猫 发表于 2011-11-2 17:09
你检查一下CopyMemory后数组是否是正好俩拼在一起。是不是一些数据改变了。
如果数据有变化,就是CopyMem ...


于是直接帖代码吧。
客户端的发送部分是这样的.
  1. Private Sub CaptureScreen()
  2.     Dim ScreenHDC   As Long
  3.     Dim size        As Long
  4.     Dim s           As String
  5.     Dim hIconMouse  As Long
  6.     Dim ICONINFO    As ICONINFO
  7.     Dim Pt          As POINTAPI
  8.     On Error GoTo ErrProc
  9.    
  10.     If SendOK Then
  11.         SendOK = False
  12.         '拷屏
  13.         ScreenHDC = GetDC(0)
  14.         WinAPI.BitBlt mHDC, 0, 0, w, h, ScreenHDC, 0, 0, WinAPI.SRCCOPY
  15.         '压缩
  16.         With jpg
  17.             .Quality = 10
  18.             .SampleHDC mHDC, w, h
  19.             buff() = .SaveData()
  20.         End With
  21.         '发送本幅图像数据长度
  22.         size = UBound(buff()) - LBound(buff())
  23.         s = "|SIZE:|" & CStr(size)
  24.         Winsock1.SendData s
  25.         DoEvents
  26.         Sleep 20
  27.         '发送图像数据
  28.         Winsock1.SendData buff()
  29.         DoEvents
  30.         Erase buff()
  31.         WinAPI.ReleaseDC 0, ScreenHDC
  32.     End If
  33.     Exit Sub
  34. ErrProc:
  35.     Winsock1.Close
  36.     Timer1.Enabled = False
  37.     SendOK = True
  38.     ResetNetConnect
  39.     Exit Sub
  40. End Sub
复制代码
接收端代码
  1. Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  2.     On Error Resume Next
  3.     Static p As Long
  4.     Static recv As Boolean
  5.     Dim buff() As Byte
  6.     Dim s As String
  7.     Static lenght As Long
  8.         Winsock1.GetData buff()
  9.         If Not recv Then
  10.             s = StrConv(buff(), vbUnicode)
  11.             If InStr(1, s, "size", vbTextCompare) >= 1 And bytesTotal < 20 Then
  12.                 Dim cmd() As String
  13.                 cmd() = Split(s, "|")
  14.                 lenght = CLng(cmd(2))
  15.                 recv = True
  16.                 p = 1
  17.             End If
  18.         Else
  19.             Put #2, p, buff()
  20.             CopyMemory szfile(p), buff(1), (UBound(buff()) + 1 - LBound(buff()))
  21.             p = p + (UBound(buff()) + 1 - LBound(buff()))
  22.             If p >= lenght Then
  23.                 szfile(0) = &HFF
  24.                 Open App.Path & "/asfd.jpg" For Binary As #1
  25.                 Put #1, , szfile()
  26.                 Close #1
  27.                 Close #2
  28.                 recv = False
  29.                 lenght = 0
  30.                 p = 0
  31.                 myPaintPicture
  32.                 Close
  33.                 Unload Form1
  34.                 End
  35.             End If
  36.         End If
  37.         NewClient = True
  38.     Exit Sub
  39. End Sub
复制代码
这里的#2输出一张qq.jpg,图像正常
asfd是字节数组szfile输出的图像,都是花的= =,貌似哪里有错位,但没发现.
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
72
在线时间
673 小时
注册时间
2006-10-3
帖子
1795

开拓者

18
发表于 2011-11-2 17:54:20 | 只看该作者
fux2 发表于 2011-11-2 17:34
于是直接帖代码吧。
客户端的发送部分是这样的.接收端代码这里的#2输出一张qq.jpg,图像正常
asfd是字节数 ...

我记得写文件的时候,是按反着的数组顺序写的
例如正常写{1,2,3,4}
写出来是{4,3,2,1}
你拆开成俩数组了(拆开多个也是一个道理)
变成了{1,2}{3,4}
写完变成了
{2,1,4,3}
我感觉是因为这个。
你可以把正常的和花花的都保存出来用16进制编辑器对比一下。
( ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็ ω ส้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้【看猫君玩,我也搞一只】)
回复

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
39832
在线时间
7490 小时
注册时间
2009-7-6
帖子
13485

开拓者贵宾

19
发表于 2011-11-2 18:08:13 | 只看该作者
熊猫 发表于 2011-11-2 17:54
我记得写文件的时候,是按反着的数组顺序写的
例如正常写{1,2,3,4}
写出来是{4,3,2,1}

对比过了,前面貌似全部正常,但最后文件结尾的一段没合进去,原因实在不明。
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
72
在线时间
673 小时
注册时间
2006-10-3
帖子
1795

开拓者

20
发表于 2011-11-2 18:18:43 | 只看该作者
CopyMemory szfile(Ubound(szfile)), buff(1), (UBound(buff()) + 1 - LBound(buff()))
这样不知道是否可以。。
( ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็ ω ส้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้【看猫君玩,我也搞一只】)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-7 16:21

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表