扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
第一个问题,先把listbox的内容取出来做内部排序然后重新插入
蛟河网站建设公司创新互联,蛟河网站设计制作,有大型网站制作公司丰富经验。已为蛟河成百上千家提供企业网站建设服务。企业网站搭建\成都外贸网站制作要多少钱,请找那个售后服务好的蛟河做网站的公司定做!
第二个问题,TextBox1.Text = Mid(ListBox1.Items.Item(ListBox1.SelectedIndex), 1, 8)
上面代码速度太慢,下面代码可快速实现图象旋转
一、新建一个模块,并复制下面代码到模块中:
Option Explicit
Type BITMAPINFOHEADER '40 bytes,这个大家可以看看BMP的格式
BmSize As Long
BmWidth As Long
BmHeight As Long
BmPlanes As Integer
BmBitCount As Integer
BmCompression As Long
BmSizeImage As Long
BmXPelsPerMeter As Long
BmYPelsPerMeter As Long
BmClrUsed As Long
BmClrImportant As Long
End Type
Type BITMAPINFO
BmHeader As BITMAPINFOHEADER
End Type
'下面是两个操作DIB的函数
Declare Sub GetDIBits Lib "GDI32" (ByVal hDC, ByVal hBitmap, ByVal nStartScan, ByVal nNumScans, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage)
Declare Sub SetDIBits Lib "GDI32" (ByVal hDC, ByVal hBitmap, ByVal nStartScan, ByVal nNumScans, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage)
Sub RotatePicDI(SrcPic As PictureBox, DestPic As PictureBox, A As Double)
Dim SrcInfo As BITMAPINFO, DesInfo As BITMAPINFO
Dim X, Y, CA As Double, SA As Double, nX, nY
Dim sW, sH, sW2, sH2, dW, dH, dW2, dH2
Const Pi = 0.017453292519943
CA = Cos(A * -1): SA = Sin(A * -1)
sW = SrcPic.ScaleWidth '源图
sH = SrcPic.ScaleHeight
dW = DestPic.ScaleWidth '目标图
dH = DestPic.ScaleHeight
sW2 = sW / 2: sH2 = sH / 2 '确定中心点坐标
dW2 = dW / 2: dH2 = dH / 2
SrcInfo.BmHeader.BmSize = 40
SrcInfo.BmHeader.BmWidth = sW
SrcInfo.BmHeader.BmHeight = -sH
SrcInfo.BmHeader.BmPlanes = 1
SrcInfo.BmHeader.BmBitCount = 32
SrcInfo.BmHeader.BmSizeImage = 3 * sW * sH
LSet DesInfo = SrcInfo
DesInfo.BmHeader.BmWidth = dW
DesInfo.BmHeader.BmHeight = -dH
DesInfo.BmHeader.BmSizeImage = 3 * dW * dH
ReDim SrcPix(0, sW - 1, sH - 1) As Long
ReDim DesPix(0, dW - 1, dH - 1) As Long
Call GetDIBits(SrcPic.hDC, SrcPic.Image, 0, sH, SrcPix(0, 0, 0), SrcInfo, 0)
For Y = 0 To dH - 1
For X = 0 To dW - 1
nX = CA * (X - dW2) - SA * (Y - dH2) + sW2
nY = SA * (X - dW2) + CA * (Y - dH2) + sH2
If nX -1 And nY -1 And nX sW And nY sH Then
DesPix(0, X, Y) = SrcPix(0, nX, nY)
End If
Next
Next
Call SetDIBits(DestPic.hDC, DestPic.Image, 0, dH, DesPix(0, 0, 0), DesInfo, 0)
DestPic.Picture = DestPic.Image
End Sub
二、在Form1中,函数调用举例:
Private Sub Command1_Click()
RotatePicDI Picture1, Picture1, Val(Text1.Text)
End Sub
一个一个回答吧。
1、CheckBox 的 MouseDown 事件发生在 CheckedChange 事件之前,但这是指在单步调试的状态下,事实上在编译好的程序中,这两个事件是分别处在两个不同的线程中,单纯的考虑时间上的前后没有意义。
2、MouseDown 在先。Scroll 事件发生在滚动条移动的过程中,而 ValueChange 事件发生在滚动条的 Value 属性发生改变的时候,两者没有必然联系。举例,当你用鼠标拖动滚动条移动的时候,这时发生的是 Scroll 事件;松开鼠标键后,Value 属性值改变,这时候触发 ValueChange 事件。另外,如果滚动条的 Value 是通过代码改变的而非鼠标拖动的,是不触发 Scroll 事件只触发 ValueChange 事件。
3、ClientSize 是指控件的工作区的高度和宽度。比如说 form,它的 Size 值是包括标题栏、边框等,而 ClientSize 是工作区,不包括标题栏、边框等。
4、一般是 Load→Paint→Shown。
您好,在Visual Basic.NET中,是没有像这样的文件I/O操作的,一般都是通过System.IO.StreamReader和System.IO.StreamWriter类,System.IO.BinaryReader和System.IO.BinaryWriter类来读写文件以及利用My.Computer.FileSystem类读写文件,利用System.IO.Filestream类来创建文件,通过引用Microsoft Scripting Runtime来执行文件(夹)和驱动器的特殊操作,常用的是System.IO.StreamReader和System.IO.StreamWriter类。
例如说要读取一个文件,我们可以利用System.IO.StreamReader类编写一个方法(也就是函数),但是首先要在当前类的开头添加一个引用,引用名称:System.IO,添加引用的代码如下
Imports System.IO
添加引用之后,就在当前类的内部创建方法:
Private Function ReadFile(ByVal FileURL As String) As String
Dim sr As StreamReader = New StreamReader(FileURL)
ReadFile = sr.ReadToEnd()
sr.Close()
sr = Nothing
End Function
示例说明:
该方法是一个返回String(字符串)数据的函数,FileURL作为参数是用来存放需要访问的文件的URL,当然,要获取一个文件的URL,就是利用这一句代码实现的:
Dim sr As StreamReader = New StreamReader(FileURL)
当获取了URL之后,就要对文件进行读取操作了,然后将读取的结果返回给方法:
ReadFile = sr.ReadToEnd()
读取文件完毕之后,要对文件执行关闭操作:
sr.Close()
当然别忘了清理资源:
sr = Nothing
StreamReader类可以从流或文件中读取字符,在创建StreamREader类的对象时,可以指定一个流对象,也可以指定一个文件URL,创建对象后就可以调用他的方法,从流中读取数据,其常用方法如下:
Peek:返回下一个可用字符,但不使用它。
Read:读取输入流中下一个字符或一组字符并移动流或文件指针。
ReadBlock:从当前流中读取最大数量字符并从index开始将数据写入buffer。
ReadLine:从当前流中读取一行字符并将字符作为String返回。
REadToEnd:从流的当前位置到末尾读取流。
Close:关闭打开的对象,释放资源。
注:流,一种新的数据格式,这种格式可通过System.IO命名空间下的类访问。流用Stream类表示,所有的流都是从这个类中继承的。流向用户提供了一个一般的数据视图,隐藏了操作系统和底层设备的实现细节,所有的流都支持读写操作。在打开文件时将返回对应的流对象,用户可以对流对象进行读写操作。
如果要对文件执行按行读取操作,这时就会用到枚举,这时候,代码就要更改一下了:
Private Function ReadFile(ByVal FileURL As String) As String
Dim sr As StreamReader = New StreamReader(FileURL)
For Each fLine As String In sr.ReadToEnd()
Line = sr.ReadLine()
ReadFile = ReadFile fLine
Next sr.ReadLine
sr.Close()
End Function
示例说明:
For Each…Next:派生于For…Next循环,用于枚举一系列对象中的成员,而这些对象组成集合,如果集合中至少存在一个元素,程序就会静茹For Each块执行。其格式如下:
For Each 元素 [As 数据类型] In 元素集合
[循环体]
[Exit For]
[循环体]
Next [元素]
比如:
Dim CountNumber As ULong = 0
Dim FolderName() As String = New String() {" "}
For Each strFolder As String In My.Computer.FileSystem.GetDirectories("C:\")
CountNumber = CountNumber + 1
ReDim Preserve FolderName(1 To CountNumber)
FolderName = strFolder
Next strFolder
注:My.Computer.FileSystem.GetDirectories:主要用来枚举指定目录的子文件夹。
Preserve:主要用来避免重定义数组而不损失数组元素的原有数据。
另外,利用My.Computer.FileSystem也可以实现文件的读取,其代码如下:
Dim fpReader As String = My.Computer.FileSystem.ReadAllText("C:\test.txt")
示例说明:
定义一个字符串变量利用My.Computer.FileSystem.ReadAllText来实现对“C:\test.txt”的读取。
如果是已经编码的文本,则可以使用My.Computer.FileSystem对象中的ReadAllText方法并提供路径和文件编码类型,将文本写入字符串变量中,例如:
Dim fpReader As String = My.Computer.FileSystem.ReadAllText("C:\test.txt", _
System.Text.Encoding.UTF32)
当然,System.Text.Encoding的成员不止一个,它还有如下成员:
System.Text.Encoding.UTF8
System.Text.Encoding.UTF16
System.Text.Encoding.ASCII
System.Text.Encoding.Unicode
这些是常见的成员,也是主要的成员。
另外,利用My.Computer.Filesystem类无法实现文件的行操作,还有,如果您的计算机未安装完整的Microsoft.NET Framework Runtime,则无法实现这种操作!
写入文件的操作同样简单,Visual Basic.NET 允许用户使用StreamWriter来对文件写入内容,下面就让我们来创建一个子例程,来实现文件的写入:
Private Sub WriterFile(ByVal FileURL As String, ByVal FileCon As String)
Dim sr As StreamWriter = New StreamWriter(FileURL)
sr.Write(FileCon)
sr.Close()
sr = Nothing
End Sub
示例说明:
sr.Write(FileCon):将FileCon写入文件FileURL之中。
另外,StreamWriter常用方法如下:
WriteLine:向流中写入一行,后面跟结束符。
Write:写入流,向流对象中写入字符并移动流或文件指针。
Close:关闭打开的对象,释放资源。
附:Visual Basic 6.0文件操作解说:
打开: Open 文件名 For Input | Output | Append As [#]文件号
Input打开读入,文件不存在报错。Output打开覆盖写入,文件不存在则创建。Append打 开追加写入,文件不存在则创建。
读: Line Input #文件号, 字符串变量
读一行数据存入字符串变量,数据包括空格、Tab、等,不包括回车符和换行符,所以要显示文件的换行效果,要手动添加回车符和换行符(vbCrLf)
Input #文件号, 变量1[, | ;] [变量2]...
这种方式可以存入多个变量,而且变量类型不限于字符串型。
写: Print #文件号, 参数1[, | ;] [参数2]...
将各参数逐个写入文件。参数间用逗号隔开时,文件中相应插入多个空格;用分号隔开时,插入一个空格。可以用Spc(n)、Tab(n)等进行排版。
Write #文件号, 参数1[, | ;] [参数2]...
这种写入方式将自动添加界定符,对不同参数的类型加以界定。
Visual Basic 6.0文件操作函数:
Seek: Seek(文件号)
返回文件正在访问的位置,返回值为长整型。对顺序文件和二进制文件,返回值以字节为单位;对随机访问文件,返回值以记录号为单位。
Seek: Seek [#]文件号,位置
定位文件到指定位置。位置单位同上所述。
Input: Input (字节数,[#]文件号)
从文件的访问当前位置读入指定字节数的数据。仅适用于顺序文件和二进制文件。
EOF: EOF(文件号)
判断文件的访问位置是否在文件尾,如果是,返回True,否则,返回False。
LOF: LOF(文件号)
返回文件长度,单位为字节。
FileLen: FileLen (文件名)
返回文件名对应文件的长度,单位是字节。该函数取磁盘文件标识中的长度,即文件打开前的长度,可以取未打开的文件长度。
GetAttr: GetAttr (Pathname)
返回指定文件或文件夹的属性。
FileAttr: FileAttr (文件号)
返回文件号对应文件的打开方式。
GetDateTime: GetDateTime (Pathname)
返回文件被创建或修改的最后日期和时间。
Free: FreeFile[(0|1)]
返回未被占用的文件号,Free或Free(0)返回1~255之间未占用的文件号,Free(1)返回256~511之间未占用的文件。
Dir: Dir (Pathname [,Attributes])
测试指定路径是否有某文件,Attributes附加文件属性条件,取值vbNormal、vbReadOnly、vbHidden、vbSystem、vbVolume、vbDirectory。
Kill: Kill (文件名)
删除指定文件,文件名可包含路径。
FileCopy: FileCopy 源文件,目标文件
拷贝文件。
Name: Name 旧文件名 As 新文件名
文件重命名。前后路径不一致时,操作为移动文件并重命名。
MkDir: MkDir path
新建文件夹。
RmDir: Rmdir path
删除文件夹。
ChDrive: ChDrive Drive
改变当前驱动器 ChDrive "D"
CurDir: CurDir [(driver)]
返回当前工作路径,指定driver则返回目标驱动器的当前工作路径。
举例:
'新建文件,并写入数据,关闭
Open "a.txt" For Output As #1
Print #1, "ABCDEFG"; vbCrLf; "HIJK"
Close #1
'打开文件,并全部写入新文件,关闭
Open "a.txt" For Input As #2
Open "b.txt" For Output As #3
Dim str As String
While (Not EOF(2))
Line Input #2, str
Print #3, str
Wend
Close
注:关于Visual Basic 6.0的文件操作资料来自于
如果您觉得我的回答帮助了您解决难题,别忘了采纳哦,如果我的回答未能解决您的问题,您可以在互联网上寻找更多的解决方案!
你直接传一个数组进去,而且是一个结构体数组,array.sort怎么知道根据结构中的哪一个属性进行排序?放一个c#的代码你看看,VB和C#很相似的
class Program
{
static void Main(string[] args)
{
People[] p = new People[3]
{
new People{name="张三"},
new People{name="李四"},
new People{name="张二名"}
};
//重点传一个实现了IComparer接口的类进去,告诉Array.Sort怎么排序
Array.Sort(p, new PeopleCompare());
foreach (var item in p)
{
Console.WriteLine(item.name);
}
Console.ReadKey();
}
}
//People结构体,换成类一样的
public struct People
{
public string name { get; set; }
}
//实现了IComparer接口的类
public class PeopleCompare : IComparer
{
public int Compare(object x, object y)
{
People p1 = (People)x ;
People p2 = (People)y;
return p1.name.CompareTo(p2.name);
}
}
例1:以下程序我们申请几个指向不同类型的指针:
’使用StructLayout(LayoutKind.Sequential)属性告诉net编译器:结构的元素在内存中按其出现的顺序排列
StructLayout(LayoutKind.Sequential) _
Public Structure DEFUDT_Test
Public bytb As Byte
Public i32a As Int32
End Structure
Public Function fnGetIntptr1() As IntPtr
’取得一个4字节数组指针
Dim tabytTest(3) As Byte
’以下语句告诉net垃圾回收进程不对tabytTest进行处理,也就是说tabytTest占用的内存区域固定不变。
Dim thObject As GCHandle = GCHandle.Alloc(tabytTest, GCHandleType.Pinned)
Dim tpObject As IntPtr = thObject.AddrOfPinnedObject() ’取得指向字节数组的指针
’取得一个指向32位内存数据的指针,
’由于使用gchandle取指针的方法只能对引用的对象有效,
’所以对如int32等值类型必须使用将其封装成为一个对象的方法以变为引用类型
Dim ti32Test As Object = Convert.ToInt32(0)
’以下语句告诉net垃圾回收进程不对ti32test进行处理,也就是说ti32Test的内存位置固定不变。
Dim thObject1 As GCHandle = GCHandle.Alloc(ti32Test, GCHandleType.Pinned)
Dim tpObject1 As IntPtr = thObject1.AddrOfPinnedObject() ’取得ti32Test的首地址
Dim tudtTest1 As DEFUDT_Test
’由于结构是一种值类型变量,为保证指针申请方便,我们申请
’取得一个和结构tudtTest1大小一致的字节数组指针,只要空间占用长度和结构一样就可以了
’由于net在结构封装中会插入额外的数据位,所以一定要用sizeof方法得到结构在非托管使用时的实际大小
Dim tudtTest(Marshal.SizeOf(tudtTest1)) As Byte
Dim thObject2 As GCHandle = GCHandle.Alloc(tudtTest, GCHandleType.Pinned)
Dim tpObject2 As IntPtr = thObject2.AddrOfPinnedObject() ’取得指向结构的指针
’在这儿你可以写对指针处理的任意代码(在例2中会给予补充)……
’在使用完毕后一定要释放指针指向的内存块,让垃圾回收器可对这个内存块回收处理
If thObject.IsAllocated Then
thObject.Free()
End If
If thObject1.IsAllocated Then
thObject1.Free()
End If
If thObject2.IsAllocated Then
thObject2.Free()
End If
End Function
上例中指针流程处理可以归纳为:
1、 定义一个具有合适内存长度的引用变量(关于引用变量和值变量的差异可以参观VB.NET的书籍)
2、使用GCHandle.Alloc方法将变量的内存区域固定下来。
3、使用GCHandle对象的AddrOfPinnedObject取得该内存区域的首地址并赋值给指针变量.
4、对指针进行操作
5、使用GCHandle对象的free方法释放指针指向的内存区域以便net垃圾回收器可以回收这个内存空间
2、指针所指向数据的存取
在.net中,对指针指向数据的存储函数都封装在marshal类中,主要的函数包括:Copy、PtrToStringUni 、PtrToStructure 、OffsetOf、WriteXXX,RreadXXX等,其中WriteXXX的表示向指针所表示的地址中写入XXX类型的数据,而ReadXXX中作用就是将指针所在地址的数据以XXX类型方式读出。看例程2,我们使用这些方法演示对例1那几个指向不同类型数据的指针作数据存/取操作。
例2:演示向例1申请得到的几个指针执行写入及读取数据的操作.
Marshal.WriteInt32(tpObject1, 0, Convert.ToInt32(77)) ’向ti32Test变量指向的地址写入32位整数77
MsgBox("现在ti32Test的值为:" ti32Test) ’因为变量存储地址的数据已改为77,所以显示为77
’以下这句之所以可行,因为ti32Test是32位整数,而tpObject指向的tabytTest数组刚好有4个元素
’而每一个byte元素都占用8位,合起来就是32位,和ti32Test占用的空间一样。这就印证了前面提’
’到的net中指针没有指向类型的说明。
Marshal.WriteInt32(tpObject, 0, ti32Test)
’以下代码再将tabytTest字节数组的内容理解为一个int32整数,
’并将值赋值给tudtTest结构中的int32元素
’我们使用Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32以取得i32a元素在结构中的内存偏移位置
’所以New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32)就临时产生了
’一个指针并指向i32a所在的内存地址(, 这个方法也说明了指针可以以字节为单位进行加减计算以指向合适的变量。
’Marshal.ReadInt32的作用是从指针中读取一个32整数。
Marshal.WriteInt32(New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32), _
0, Marshal.ReadInt32(tpObject))
’这儿可以将字节数组的内容复制到真正的结构中
MsgBox(Marshal.OffsetOf(tudtTest1.GetType, "i32a").ToInt32)
tudtTest1 = CType(Marshal.PtrToStructure(tpObject2, GetType(DEFUDT_Test)), DEFUDT_Test)
MsgBox("结构tidtTest1中i32a元素的值为:" tudtTest1.i32a) ’此处将显示刚赋的值77
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流