如何把已知的数组元素删除?

Surpass 2003-10-31 09:30:39
如何把已知的数组元素删除,但是索引不变。例如:
dim a(5)as string
a(0)="aa"
a(1)="bb"
a(2)="cc"
a(3)="dd"
a(4)="ee"

…… <--这行应该如何删除?

返回结果:
a(0)="aa"
a(1)="bb"
a(3)="dd"
a(4)="ee"

数组a的元素个数变成4,但是原始索引不变。
...全文
600 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Surpass 2003-11-07
  • 打赏
  • 举报
回复
谢谢楼上的仁兄,能详细的描述一下你的方法吗?比如……
subzero 2003-11-07
  • 打赏
  • 举报
回复
我倒是觉得你可以换一种角度来考虑问题
你可以监视所有状态为可视窗口,并截取他们的wm_paint消息
只有重绘才需要你改变数据
其它的按照 拷屏——处理数据——传输 流程处理即可

需要传输的不光有屏幕数据,还有窗口的坐标和zorder等数据
至于处理数据,你可以参考jpeg压缩算法的第一步,应该能够压缩掉很多
Surpass 2003-11-02
  • 打赏
  • 举报
回复
您的代码好高深哟,我被看的糊里糊涂的。
lingll 2003-11-01
  • 打赏
  • 举报
回复
假设你原来的数组是 a(1 to n) ,
现在再dim一个数组, b(1 to n) as boolean
对b所有元素赋初值,true

想要删除a(i)的时候,将b(i)=false即可,
以后访问a中元素的时候,判断对应b中的元素是否true即可
(false,a中元素已删除,true,未删除)
Surpass 2003-11-01
  • 打赏
  • 举报
回复
非常感谢楼上的几位:

to lingll(20分)
能给我举例说明吗?

to FSoft()
您的方法我也想过,但是我不想改变元素的索引。还有其他的办法吗?

to northwolves(野性的呼唤)
不好意思,集合怎么用?能简单的举个例子吗?

zyl910 2003-11-01
  • 打赏
  • 举报
回复
别用GetBitmapBits
那是DDB位图数据
与硬件有关

用GetDIBits得到DIB位图数据
是规格的,设备无关的
Surpass 2003-11-01
  • 打赏
  • 举报
回复
谢谢,我先去研究一下……
zyl910 2003-11-01
  • 打赏
  • 举报
回复
并不是实现很困难
而是现在又太多的人被控件的光环所迷惑
不愿意去学习底层的技术


http://www.fantasiasoft.net/Zyl910/zSaveGIF.zip
我以前写的GIF编码/解码程序(当时是为ThirdApple写的,最开始只有编码的功能)
Surpass 2003-11-01
  • 打赏
  • 举报
回复
这里有一篇关于delphi的文章,其中说到了图像压缩和传输的方法,后面提及到了只传输差异部分,我不知道在vb中能否实现其中的压缩和解压缩步骤。
差异部分如果抛弃我的数组比较的笨方法,还有那些更好的方法?
http://zeroworld.html.533.net/program/mystream.htm
Surpass 2003-11-01
  • 打赏
  • 举报
回复
非常感谢zyl910(910:分儿,我又来了!)
我对GIF_LZW、JPEG不是很明白,利用vb好像有些困难,您能给我一点示例吗?vb方面的。
zyl910 2003-11-01
  • 打赏
  • 举报
回复
只要你懂GIF_LZW、JPEG压缩算法
你可以直接对内存中的位图数据进行压缩
Surpass 2003-11-01
  • 打赏
  • 举报
回复
谢谢 zyl910(910:分儿,我又来了!)
我看了很多关于图像压缩算法的文章,它们把bmp文件经过计算压缩后另存为另外格式的文件。请问有没有什么方法把内存中的bmp直接压缩,我的源码如下:

声明:
Option Explicit
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long


操作:
Dim Bytes() As Byte '图像缓冲区
Dim hScreen As Long '屏幕句柄
Dim hScene As Long '内存场景
Dim hBitmap As Long '屏幕图像
Dim BmpByte As Long '图像字节数
Dim W As Long, H As Long
'获得分辨率
W = Screen.Width \ Screen.TwipsPerPixelX
H = Screen.Height \ Screen.TwipsPerPixelY
'获得当前屏幕句柄
hScreen = GetDC(0)
'创建与当前屏幕一致的内存场景
hScene = CreateCompatibleDC(hScreen)
'创建与当前屏幕一致的位图
hBitmap = CreateCompatibleBitmap(hScreen, W, H)
SelectObject hScene, hBitmap
'把本机的即时屏幕图象复制到内存
BitBlt hScene, 0, 0, W, H, hScreen, 0, 0, vbSrcCopy
'显示内存图像
'StretchBlt hScreen, 0, 0, W - 2, H, hScene, 0, 0, W, H, vbSrcCopy
'将屏幕位图的二进制位复制到缓冲区
ReDim Bytes(W * H * 4)
BmpByte = GetBitmapBits(hBitmap, UBound(Bytes), Bytes(0))

'Bytes就是我的图像数据,是bmp格式的,在这里能直接压缩吗?
'或者在这里产生与前一副图像的差异,就是删除与其相同的数组元素。

'释放占用的资源
ReleaseDC 0, hScreen
DeleteDC hScene
DeleteObject hBitmap

如果您有更好的建议请指教。
zyl910 2003-11-01
  • 打赏
  • 举报
回复
先计算更新区域,把他规格化到一个Rect中
发送Rect
再发送数据

最好去学图像压缩算法:GIF_LZW、JPEG
Surpass 2003-11-01
  • 打赏
  • 举报
回复
谢谢楼上:
我主要是用于网络传输,最终的目的是要把数组减小到最小,如果建立一个标志数组好像并没有使我的数组减小。
zyl910 2003-11-01
  • 打赏
  • 举报
回复
那再建立一个标志数组
用于标志元素是否存在
Surpass 2003-11-01
  • 打赏
  • 举报
回复
to 楼上
谢谢!关键的问题是我不想让元素的索引改变呀,如果“写个循环 把后面的元素往前挪 再ReDim”结果就不是我想要的了。
zyl910 2003-11-01
  • 打赏
  • 举报
回复
写个循环 把后面的元素往前挪
再ReDim


你学过《数据结构》没有?
这是很基础的 线性表 操作
Surpass 2003-11-01
  • 打赏
  • 举报
回复
to lingll(20分)
谢谢!
我编写了一个桌面共享程序,在S端把桌面传输到C端,如果每次都把整个屏幕传输过来速度非常慢,哪怕是压缩后。我采取把屏幕直接保存到数组(不保存成文件,避免读写硬盘耽误时间),然后发送。不理想的是数组也同样大(数组的大小等于屏幕分辨率*4),我不知道该如何压缩数组。以前在网上看过Delphi的一篇文章,说的就是采用差异传输法,把有过变化的部分传输过去。也就是我的数组比较,把相同的部分删除,但是必须保留剩余部分的索引,否则传输过去程序根本不知道把它显示在哪。
你的这种方法从根本上说就没有删除……

哪位高手能给小弟指点一二,小弟不胜感激。
northwolves 2003-10-31
  • 打赏
  • 举报
回复
建议用集合,用KEY选择。
FSoft 2003-10-31
  • 打赏
  • 举报
回复
把数组声明成可变数组,在要改变数组大小时用Preserve关键字的Redim语句声明。
如:
aa(3)=aa(4)
redim preserve aa(0 to 3)
加载更多回复(3)

1,066

社区成员

发帖
与我相关
我的任务
社区描述
VB 资源
社区管理员
  • 资源
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧