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

📄 9934.txt

📁 关于编程技术技巧的文章
💻 TXT
📖 第 1 页 / 共 4 页
字号:

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

                        用VB自动改变控件大小
 
    当窗体大小改变时,如何动态的改变控件的大小是许多VB程序员头痛
的事。有的人设置窗体Resizable但却不改变控件的大小;有的人则根据控
件的绝对位置与窗口大小相加减的办法来重新定位控件与改变大小,这种
办法比较繁琐,且不可重用;当然也有人则限定窗口干脆不让改变。有没
有一种简便易行的办法?答案是肯定的,下面给出一个一劳永逸的办法,
源程序如下: 

Option Explicit 
Private FormOldWidth As Long 
`保存窗体的原始宽度 
Private FormOldHeight As Long 
`保存窗体的原始高度 

`在调用ResizeForm前先调用本函数 
Public Sub ResizeInit(FormName As Form) 
Dim Obj As Control 
FormOldWidth = FormName.ScaleWidth 
FormOldHeight = FormName.ScaleHeight 
On Error Resume Next 
For Each Obj In FormName 
Obj.Tag = Obj.Left & " " & Obj.Top & " " 
& Obj.Width & " " & Obj.Height & " " 
Next Obj 
On Error GoTo 0 
End Sub 

`按比例改变表单内各元件的大小,在调用ReSizeForm前先调用
ReSizeInit函数 
Public Sub ResizeForm(FormName As Form) 
Dim Pos(4) As Double 
Dim i As Long, TempPos As Long, StartPos As Long 
Dim Obj As Control 
Dim ScaleX As Double, ScaleY As Double 

ScaleX = FormName.ScaleWidth / FormOldWidth 
`保存窗体宽度缩放比例 
ScaleY = FormName.ScaleHeight / FormOldHeight 
`保存窗体高度缩放比例 
On Error Resume Next 
For Each Obj In FormName 
StartPos = 1 
For i = 0 To 4 
`读取控件的原始位置与大小 

TempPos = InStr(StartPos, 
Obj.Tag, " ", vbTextCompare) 
If TempPos > 0 Then 
Pos(i) = Mid(Obj.Tag, 
StartPos, TempPos - StartPos) 
StartPos = TempPos + 1 
Else 
Pos(i) = 0 
End If 
`根据控件的原始位置及窗体改变大小的比例对控件重新定位与改变大小 
Obj.Move Pos(0) * ScaleX, Pos(1) 
* ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleY 
Next i 
Next Obj 
On Error GoTo 0 
End Sub 

Private Sub Form_Load() 
Call ResizeInit(Me) `在程序装入时必须加入 
End Sub 

Private Sub Form_Resize() 
Call ResizeForm(Me) `确保窗体改变时控件随之改变 
End Sub 

----本例中给出了二个函数:ResizeInit和ResizeForm,在调用
ResizeForm之前必须先调用ResizeInit。你可以将本程序拷到窗体代码
段里,然后在窗体里加入任意控件即可进行测试 

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

            加速Visual Basic For Application(VBA)

  如今的CPU的发展是越来越快,从386、486到今天的Pentium、
PentiumⅡ,发展速度可谓快矣。然而,在CPU高速发展的同时,应用软
件的“体重”也随之猛涨,从我学电脑时的几K、几十K,到今天的几十
兆、几百兆,这变化连我自己都感到吃惊。CPU的进步,使人们工作更加
快速,效率大增,同时也养成了人们“不求简”的不良习惯。笔者曾见过
一位朋友正在编写一段程序,用的是VBA,程序代码如下:

  With ActiveWindow
  If WindowState = wdWindowStateMaximize Then’this is the
first part!
  MsgBox "This is a Maximize Window"
  End If
  If WindowState = wdWindowStateMinimize Then’this is the
second part!
  MsgBox "Here is a Minimize Window"
  End If

  If WindowState = wdWindowStateNormal Then’this is the
third part!
  MsgBox "Now here, is a Normal Window!"
  End If

  End With

  乍看一下,似乎结构还挺漂亮,是个好程序。但细分析一下,你
会发现,这段程序是个败笔。因为这三段程序没有实现应该具有的逻
辑结构。我将这个意见告诉了这位朋友,他到很能听进话,马上修改
了上述程序,具体程序代码如下:

  With ActiveWindow
  If WindowState = wdWindowStateMaximize Then’this is the
first part!
  MsgBox "This is a Maximize Window"
  ElseIf WindowState = wdWindowStateMinimize Then’this is
the second part!
  MsgBox "Here is a Minimize Window"
  ElseIf WindowState = wdWindowStateNormal Then ' this is
the third part!
  MsgBox "Now here, is a Normal Window!"
  End If
  End with

  我的那位朋友写完这段程序后,冲我笑笑,意思说:“怎麽样?”
我看了看这段程序,心想:如果WindowState不等于
wdWindowStateMaximize的话,则要在判断WindowState是否等于
wdWindowStateMinimize,如果还不等于的话呢?则要继续判断是否等于
wdWindowStateNormal,这样下来,要闯三个“家门”方可进对,累不累
啊?我看着不耐烦了,自己亲自编了一段程序:

  Select Case WindowState
  Case wdWindowStateMaximize’this is the first part!
  MsgBox "This is a Maximize Window"
  Case wdWindowStateMinimize’this is the second part!
  MsgBox "Here is a Minimize Window"
  Case wdWindowStateNormal ' this is the third part!
  MsgBox "Now here, is a Normal Window!"
  End Select

  正如你所看到的,这段程序简练、易懂、可读性强,相信会为程
序增色不少。而且如果调试起来,你会发现它的其他优点。难怪朋友
恍然大悟呢!

  其实,使用哪种判断语句,也是有章可循的。比如:如果有两种
可能性,那麽可毫不犹豫地选择If/Elseif;对于两种或两种以上的
可能性,最好选择Select Case/End Select。多数情况下,如果只有
一种唯一选择性的关系,那麽,"if then/endif"将是最佳选择。
(摘自网易IT频道www.163.com/it) 

****************************************************************
 
           VC++程序中用对话框的形式显示HTML文件

                        zhou daibing

----在安装了IE4后,可以在程序中用对话框的形式显示HTML文件,如弹出
用HTML写的帮助文件等等,如同直接用浏览器,但又与浏览器风格不同。 

----其实现如下: 

//在头文件或.cpp文件的开头
包含文件urlmon.h,定义函数
/////
#include "urlmon.h"
typedef HRESULT STDAPICALLTYPE SHOWHTMLDIALOGFN
(HWND hwndParent, IMoniker
*pmk, VARIANT *pvarArgIn, TCHAR* pchOptions,
VARIANT *pvArgOut);
//////

//函数显示对话框,成功返回TRUE,失败返回FALSE
BOOL ShowHtml()
{
HINSTANCE hinstMSHTML = LoadLibrary
(TEXT("MSHTML.DLL")); //装载动态连接库
WCHAR url[]=L"HTTP://www.ccw.com.cn";
//此地址名称可直接用html文件名代替

if(hinstMSHTML)//装载动态连接库成功
{
SHOWHTMLDIALOGFN *pfnShowHTMLDialog;

pfnShowHTMLDialog = (SHOWHTMLDIALOGFN*)
GetProcAddress(hinstMSHTML,
TEXT ("ShowHTMLDialog"));

if(pfnShowHTMLDialog)
{
IMoniker *moniker=NULL;

//
if( FAILED(CreateURLMoniker(NULL,
(LPWSTR)url,&moniker ) ))
{
FreeLibrary(hinstMSHTML);
return FALSE;
}

//调用ShowHTMLDialog函数显示URL上的HTML文件
pfnShowHTMLDialog(m_hWnd,moniker,NULL,NULL,NULL);

if(moniker!=NULL)
moniker->Release();

//显示成功,返回TRUE
return TRUE;

}
else //GetProcessAddress失败
return FALSE;

FreeLibrary(hinstMSHTML);
}
else //装载动态连接库失败
return FALSE;
}

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

                 ASP应用中数据库记录的选取与过滤 

   一、说明 
   大多数最终用户都要求他们的Web方案能够提供某种报表能力。使用HTML
和ASP,可以很容易地提供在表格中列出记录以及逐条浏览它们的能力。但
用户往往要求能够通过下拉列表框(或其它选择方式)选择某一类别的记
录,或者说,他们希望能够使用某种“查询界面”来建立和执行查询,而
不必直接使用SQL。本文演示运用ASP技术建立可选择的记录过滤界面的一
种方法。虽然这里讨论的解决方法相当简单,但使用类似的技术可以在任何
Web页面提供复杂的查询能力。 

   在为任何一个解决方法编码之前,都应该充分理解并记录最终用户的
需求。对于本例来说,用户要求能够用指定类别名字的方法获取指定表的
一组记录,他既可以选择所有的类别也可以选择某个特定的类别。为实现
这个功能,我们使用一个“递归的”ASP页面,它所提供的选择表单中包含
了来自数据库的类别列表,根据表单所发送的数据提取结果记录集,结果
记录将以表格的形式显示以方便用户察看。 

   二、构造过滤条件 

   对于这种数据库应用,首先应该了解所涉及的数据库表结构以及连接
数据库系统所必须的连接参数。连接参数的指定方法在Microsoft的ASP联机
文档中有很详细的说明,本文不再赘述。本例要用到的两个表为:
Document_Category,它包含供用户选择的唯一的类别名字Category_Name;
Documents,它包含对应于类别名字的其它数据,字段包括Category_Name、
File_Name、Comments、Date_Submitted等。 

   选择表单中的类别列表来自于类别表Document_Category的Category_Name
字段,构造类别下拉列表框的代码如下,请注意这里要用到VBScript ADO包
含文件: 

<!-- #Include file = "ADOVBS.INC" -->  
<%  ConnString = "DSN=LocalUpload;"  
Set conn = Server.CreateObject("ADODB.Connection")  
conn.Open ConnString,,,adOpenForwardOnly  
Set rs = SERVER.CreateObject("ADODB.Recordset")  
` 首先获取用来填充下拉列表框的类别记录  
` 设置SQL语句  
strSQL = "SELECT * FROM Document_Category ORDER BY category_name"    
rs.Open strSQL,conn, adOpenStatic  %>    
<FORM name="formCategory">    
<SELECT NAME="qryCategory" onChange="getFilter(this.form.qryCategory)">  
<OPTION selected>请选择一个类别:  
<% Do While Not rs.EOF   
Response.Write ("< OPTION value=`" & rs("Category_Name") & "`>" & rs("Category_Name"))   
rs.MoveNext  
Loop  
rs.Close  
Set rs=Nothing  
%>  
</OPTION></SELECT><BR></FORM> 

   SELECT标记中的OnChange用来提交HTML表单。当下拉列表框的值改变,
JavaScript函数getFilter就会执行。使用类似的方法,可以将数据库表的记
录用多个不同表单元素来描述(如第二个下拉列表框,单选按钮或复选框等
等)。用户所选择的类别值将用来构造从数据库提取记录的SQL SELECT语句。 

   三、提交表单 

   这里我们要用到两个JavaScript函数来完成表单信息提交任务。getFilter
函数用来将用户选择的类别值提交给页面本身,而getListValue函数则用来
获取用户所选择的类别值。选用JavaScript实现这两个函数使得脚本能够在
不同的浏览器上运行: 

<SCRIPT language="JavaScript">  
function getFilter(listitem)
{

⌨️ 快捷键说明

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