⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9906.txt

📁 关于编程技术技巧的文章
💻 TXT
字号:

                   《编 程 技 术》

         一份属于广大编程爱好者的电子杂志

                   第六期 99/05/02


<本期栏目>
 *刊首语*
 *雕虫小技*
    VB4.0使用与编程技巧10则
 *技术文档*
    在Visual Basic 中格式化磁盘
    如何在VC5中实现工具栏的属性控制
    用Delphi4实现风Word97格的工具栏
    Delphi3.0中的函数调用模式
    VFP3.0中表格的应用
 *服务台*

*****************************************************

<刊首语>
    
    抱歉,因为“五·一”放假几天一直在走亲戚,本期杂志晚
了两天,望大家多多包涵。
    另外本刊已经获准加入中国电子杂志联盟,欢迎您常去访问
联盟的主页( http://china-ezl.yeah.net),本期杂志中附带
了联盟成员的名单(见附件),有许多不错的杂志,欢迎您订阅。

*****************************************************
*****************************************************

<雕虫小技>

              VB4.0使用与编程技巧10则 

          西安未来电子有限公司(710075)侯延堂 


1.有一个简单的方法从完整路径名中摘取文件名 

Function FName(filespec As String)As String 
Dim i 
As Integer 
Dim size As Integer 
size=Len(filespec) 
For i=size To 1 Step-1 
if Mid$(filespec,i,1)Like"[\:]"Then 
FName=Right(filespec,size-i) 
Exit Function 
End If 
Next i 
End Function 
例如: 
File_Name=FNmae("A:\test.dat") 
File_Name=FNmae("A:test.dat") 
File_Name=FNmae("A:\test\test.dat") 

2.控制Form_Load事件中的错误 

创建一个属性表明成功或者失败。如果失败就在调用过程中卸载该Form。 
Public SuceesfulLoad 
As Boolean 
`创建属性Form1.SuccessfulLoad 
Private Sub Form_Load() 
SuccessfulLoad=True 
If An Error Occurs Then 
SuccessfulLoad=False 
End If 
End Sub 
调用过程: 
Sub LoadTheForm() 
Dim MyForm As Form1 
Set MyForm=New Forml 
Load MyForm 
If MyForm.SuccessfulLoad then 
MyForm.Show vbModal 
End If 
Unload MyForm 
Set MyForm=Nothing 
End Sub 

3.设置Form的属性ControlBox为True,Icon为None,Borderstyle为3,将会得
到一个没有系统菜单但有关闭按钮的对话框。 

4.在结束程序之前设置所有的object变量为noth-ing,因为在一个OLE客户端
应用程序End语句执行时,OLE服务器的关闭并不能使所有的object的Terminate
事件被调用。 

5.使用特定的object类型如:Dim object1 As CTask来代替Dim object1 as Object,
这样会极大地提高性能。 

6.VB4.0中的几个快捷键与VB3.0中不同: 
Ctrl-T Custom Controls. 
Ctrl-E Menu Editor. 
Ctrl-H Replace. 

7.当传递Unicode字符串给函数或从函数中接受Uni-code字符串时,应使用VB4
中新的数据类型Byte。 
转换字符串变量到Byte数组: 
Redim MyByteArray(0 to len(MyString$)-1)as Byte 
MyByteArray()=StrConv(MyString$,vbFromU-nicode) 
转换Byte数组到字符串变量: 
MyString$=StrConv(MyByteArray(),vbUnicode) 
由于VB4中的"Bug",VB4不允许转换字符串到结构中的Byte数组,例如下面程序
将得不到正确结果。 
TYPE MyByteType 
Bytes(0 to 255)as Byte 
END TYPE 
Dim MBA as MyByteType 
MBA.Bytes()=StrConv(MyString$,vbFromU-nicode) 
但是MyString4=StrConv(MBA.Bytes(),vbUnicode)是正确的。 

8.Printer Object的"Bug" 

下面的代码应该更改字体,但是在VB4中不起作用 
Printer.FontName="Arial" 
Printer.FontSize=11 
Printer.Print"This is a test." 
在VB4中每开始一个新页必须初始化,下面的代码将会正确工作。 
`Start new page 
Print.Print 
Printer.FontName="Arial" 
Printer.FontSize=11 
Printer.Print"This is a test." 

9.Windows 95是抢先式多任务操作系统,所以函数DoEvents()不是必须的,仅当
用户自己的VB4应用程序需要时进行调用。 

10.使用以下函数可获得当前用户名 
Declare Function GetModuleHandle Lib"Kernel" 
(ByVal lpModuleName As String)As Integer 
Declare Function LoadString Lib "User" 
(ByVal hInstance As Integer,ByVal wID As Integer,By Val lpBuffer As Any ,ByVal
 nBufferMax As Interger)As Integer 
Declare Function GetUserName Lib"advapi32.dll"Alias 
"GetUserNameA"(ByVal lpBuffer As String,nSize As Long)As Long 
Function MyGetUserName()As String 
Dim hInst As Integer 
Dim User As String 
Dim Length As Integer 
User=Space(255) 
#If Win16 Then 
hInst=GetModuleHandle("User.exe") 
Length=LoadString(hInst,515,User,Len(User)) 
User=Left$(User,Length) 
MyGetUserName=User 
#Else 
`Win95或WinNT 
GetUserName User,Len(User) 
MyGetUserName=User 
#End If 
End Function 

*****************************************************
*****************************************************

<技术文档>

                          在Visual Basic 中格式化磁盘 

                                 雷兴利 编译 

    本文描述怎样在Visual Basic应用中格式化软盘。Microsoft Windows中没有提供任何
格式化磁盘的函数,但我们可以通过WinExec API函数实现这些工作。 

    格式化磁盘 

    Windows WinExec API函数可以实现任何基于Windows或非基于Windows的程序。调用
WinExec函数,必须首先在Visual Basic应用的全局描述段中(Global Declarations section)
增加其描述语句(Declare statement)。下面是WinExec函数的描述: 
    Declare Function WinExec Lib"Ker-nel"(ByVal lpCmdFile As String,ByVal fuCmdShow As
Integer)As Integer 

    应该注意的是,这一说明语句必须键入在一行中。为了执行一个程序,必须使用下面的
语句调用WinExec函数: 
    x=WinExec(lpCmdFile,fuCmdShow) 

    说明下列参数: 
    lpCmdFile \包含执行的应用名字的一个字符串 
    fuCmdShow \一个整数值,告诉WinExec函数怎样显示正在执行的应用 
    \它可以是下列参数之一: 
    SW_HIDE \窗口是隐含的并且操作可以传递到另一个窗口 
    SW_MINIMIZE \窗口被最小化并且操作可以传递到另一个窗口 
    SW_RESTORE \窗口被激活并以原来的大小在原来的位置显示 
    SW_SHOW \窗口被激活并以原来的大小在原来的位置显示 
    SW_SHOWMAXIMIZED \窗口最大化并被激活 
    SW_SHOWMINIMIZED \窗口最小化并被激活 
    SW_SHOWMINNOACTIVE \窗口被最小化但激活的窗口不变 
    SW_SHOWNA \窗口在现行的位置以现行的大小显示,但活动的窗口不变 
    SW_SHOWNOACTIVATE \窗口在最近显示的位置以最近显示的大小显示 
    \但活动的窗口不变 
    SW_SHOWNORMAL \窗口被激活并以原来的大小在原来的位置显示 
    WinExec函数调用后,如果应用执行成功,它返回一个大于32的整数值;否则,返回下列错
误代码之一: 
    错误代码描述 
    0 内存不够 
    2 未发现文件 
    3 未发现路径 
    5 共享/保护错误 
    6 每个任务需要各自的数据段 
    10 Windows版本不正确 
    11 无效.EXE文件 
    12 不能执行OS/2应用 
    13 不能执行DOS 4.0应用 
    14 EXE类型未知 
    15 Windows不支持保护内存模式 
    16 不能装入另一个.EXE文件事例 
    17 在large-frame EMS模式下不能装入第二个事例 
    18 在当前模式下不能装入保护模式应用 
    lpCmdFile变量必须是包含要执行的应用程序名字的字符串,以及应用程序自身需要的
任何命令行参数。如果变量不包括全部路径,Windows将以下列顺序搜索应用: 
    1.现行目录 
    2.Windows目录 
    3.Windows系统目录 
    4.包含现行任务的应用文件的目录 
    5.PATH环境变量设定的所有目录 
    6.网络目录 

    早期,WinExec函数可以执行任何基于Windows或基于MS-DOS的程序,如.EXE、.COM、.BAT
文件。此外,WinExec也能用于执行Windows屏幕保存程序(扩展名为.SRC的文件)和程序信息
文件(扩展名为.PIF的文件)。Win-dows有几种与WinExec函数相关的.PIF文件。其中之一是
DOSPRMPT.PIF文件,这一特殊的.PIF文件包含Windows运行MS-DOS程序的信息。例如.PIF文件
告诉Windows要设置多少内存用于运行MS-DOS程序。在Visual Basic中我们可以使用下列语
句让Windows执行FOR-MAT命令: 

    x=WinExec("dosprmpt.pif /c c:\dos\format b:< 
    c:\response.tmp",SW_HIDE) 

    每次MS-DOS格式化一张磁盘时,都要求用户键入ENTER键以开始格式化磁盘的过程。在
格式化完成之后,格式化程序要求用户键入卷标和/或键入EN-TER键,之后询问用户是否需要
格式化另一张磁盘,用户要回答"Y"或者"N"。在Visual Basic中这一问题是容易解决的。为
响应FORMAT命令行的提示,我们首先需要创造一个称之为RE-SPONSE.TMP的文件,这一文件包
括要传递给FORMAT命令的命令,就象我们从键盘上键入这些命令一样。DOS的重定向功能允
许将RE-SPONSE.TMP文件的内容传递给FORMAT.COM程序。 

    事例程序 
    下面的程序在驱动器B中格式化一张磁盘。 
    1.在Visual Basic中开始一个新的项目,这样系统就默认建立了一个Form1。 

    2.在Form1的公用描述段内,加入下列三个语句: 
    Const Resp_File = "c:\response.tmp" 
    Const SW_HIDE = &H0 
    Dim ActiveApps As Integer 

    3.加入下列两个描述语句(注意每条语句必须键入在一行中): 
    Declare Function WinExec Lib "Ker-nel" (ByVal lpCmdLine As String,ByVal nCmdShow As
Integer) As Integer 
    Declare Function GetNumTasks Lib "Kernel"() As Integer 

    4.在Form1中增加一个命令控制按钮,于是系统默认建立了Command1。对"Format Disk 
"设置Caption属性。 

    5.对Command1的鼠标敲击事件加入下列代码1: 
    Sub Command1_Click() 
    Cmd = Chr(13) & Chr(10) & Chr(13) & Chr(10) & "N" & Chr(13) & Chr(10) 
    FileNum=FreeFile 
    Open Resp_File For Output As #FileNum 
    Print #FileNum,Cmd 
    Close #FileNum 
    ActiveApps=GetNumTasks() 
    X = WinExec("dosprmpt.pif /c c:\dos\format b: <c:\response.tmp",SW_HIDE) 
    Do While GetNumTasks() <>ActiveApps 
    X = DoEvents() 
    Loop 
    Kill Resp_File 
    End Sub 

    按F5功能键,或者在Visual Basic菜单中选择Run执行上述演示程序,将磁盘插入驱动器
B中用鼠标敲击"Format Disk"命令按钮,这样Visual Basic就可以格式化驱动器B中的磁盘并
将控制返回演示程序。 
             
*****************************************************

                      如何在VC5中实现工具栏的属性控制 

                            (辽宁 宋立波)

  在WIN98/95很多应用程序中,鼠标右键弹出属性表功能具有很强的功能特色,很
多应用程序中都对各种功能进行了属性控制设置,由于工具栏在大型应用程序中显得
更为重要,所以为应用程序中的工具栏增加属性控制功能更具有现实意义。那么如何
在自己利用VC5 开发的应用程序中实现工具栏的属性控制功能?这里给出笔者实现手
记。
  一、工具栏属性控制的功能表
  在工具栏的属性表中可以设置工具栏的消隐与显示、工具栏按钮的排序和其它各
种控制功能,这要根据应用程序的需要来确定。在本文中以控制工具栏的显示与消隐
为实现样例功能。
  二、工具栏属性控制的实现步骤
  1、首先打开资源列表中的菜单资源,利用“Insert→Resource→Menu”增加菜单
资源IDR_TOOLBAR,在菜单中建立四个工具栏菜单选项,并为各菜单选项设置ID标识和
菜单项名,注意将各菜单选项标识符设置为与工具栏名称完全相同的控制符,如笔者
程序中工具栏ID为IDR_wndToolBar,那么控制工具栏的菜单选项ID标识符也必须是
IDR_wndToolBar,这样设置后可以直接使用MFC 类库中提供的功能来控制工具栏的显
示与消隐、菜单项检查状态与非检查状态。
  2、利用类向导ClassWizard 为应用程序主框架窗口增加解释消息PreTranslate-
Message处理函数;
  3、在应用程序实现文件MainFrm.cpp中完善解释消息函数:
  BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
  { //利用解释消息函数来处理鼠标右键
   if (pMsg->message==WM_RBUTTONDOWN){
   CWnd* pWnd=CWnd::FromHandlePermanent(pMsg->hwnd);
   CControlBar* pBar=DYNAMIC_DOWNCAST(
   CControlBar,pWnd);//取得控制条句柄
   if (pBar!=NULL){
   CMenu Menu;//建立弹出式菜单
   CPoint pt; //鼠标指针位置
   pt.x = LOWORD(pMsg->lParam);
   pt.y = HIWORD(pMsg->lParam);
   pBar->ClientToScreen(&pt);//转换成屏幕坐标
   if (Menu.LoadMenu(IDR_TOOLBAR)){//调入菜单资源
   CMenu* pSubMenu = Menu.GetSubMenu(0);//取得选项
   if (pSubMenu!=NULL){//跟踪菜单以取得输入
   pSubMenu->TrackPopupMenu(TPM_LEFTALIGN|
    TPM_RIGHTBUTTON,pt.x,pt.y,this);
   }
   }
   }
   }
   return CFrameWnd::PreTranslateMessage(pMsg);
  }
  4、在消息映射函数后增加
  BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
   //{{AFX_MSG_MAP(CMainFrame)
   ......//其它消息映射函数
   //}}AFX_MSG_MAP
   //增加扩展命令和更新消息映射,利用现成MFC函数更新菜单
   ON_UPDATE_COMMAND_UI(IDR_TOOLBAR,OnUpdateControlBarMenu)
   ON_COMMAND_EX(IDR_TOOLBAR,OnBarCheck)
   ......//其它工具栏映射函数基本相同,只有标识不同
  END_MESSAGE_MAP()
  三、工具栏属性控制的关键技巧
  在上述步骤中,第一步和第四步是实现工具栏属性菜单有效控制的最关键技巧。
如果不在第一步中将菜单ID设置成与工具栏相同的ID,或者不在第四步中设置相应的
消息映射功能,都不可能实现工具栏菜单与工具栏显示状态的有效控制。这两个技巧
是利用MFC 类库中提供的现成函数,使工具栏属性菜单与主菜单具有相同的控制功能,
并和应用程序主菜单一样进行菜单项的正常更新和检查状态设置。
  工具栏菜单中的其它属性功能可模仿实现。
                       
*****************************************************
 
                    用Delphi4实现风Word97格的工具栏

                             (陕西 孙 云)

         用过Word97的人对它的工具栏印象很深刻,因为它的风格很“酷”,同
     样IE4.0的工具栏也有类似的风格,Win98的出现,使这种风格的工具栏得到
     了推广。其实,用Delphi4很容易实现具有Word97风格的工具栏。
       在Delphi4的元件选项板Additional页中,新增了Controlbar元件,此元
     件和Win32页中的Toolbar、Coolbar配合使用,再辅以Imagelist、Mainmenu
     等元件,完全可以实现具有Word97风格的工具栏。下面以一个FORM中的工具
     栏为例,详细介绍设计步骤:
       1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -