当前位置:文档之家› C++Builder一些小技法

C++Builder一些小技法

C++Builder一些小技法
C++Builder一些小技法

怎样在C++Builder中创建使用DLL

自从C++Builder从去年浪漫情人节上市以来,吸引了大量的Delphi、VC、Vb的程序员到它的怀抱,大量的C、C++程序员感叹道:总算有了C的可视化开发工具,对我也是一样,从BC、Delphi到C+

+Builder。

动态链接库(DLL)是Windows编程常遇到的编程方法,下面我就介绍一下在BCB (C++Builder下简

称BCB) 中如何创建使用DLL和一些技巧。

一、创建:

使用BCB File|NEW建立一个新的DLL工程,并保存好文件BCB,生成一个DLL的程序框架。

1.DllEntryPoint函数为一个入口方法,如果使用者在DLL被系统初始化或者注销时被调用,用来写入对DLL的初始化程序和卸载程序;参数:hinst用来指示DLL的基地址;reason用来指示DLL的调用方式,用于区别多线程单线程对DLL的调用、创建、卸载DLL;

2.在程序中加入自己所要创建的DLL过程、函数;

3.用dllimport描述出口;

例程序如下:

#include

#pragma hdrstop

extern 揅?__declspec(dllexport) int test();

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)

{

return 1;

}

int test()

{

return 3;

}

注意:动态链接库中调用过程、函数时有不同的CALL方式__cdecl、__pascal, __fastcall、__stdcall,BCB中默认的方式为__cdecl(可不写),如果考虑兼容性可用时__stdcall声明方法为:

extern 揅?__declspec(dllexport) int __stdcall test();

对于其中过程、函数也改为:

int __stdcall test()

二、使用DLL

在BCB中使用DLL有两种方法:

1.用静态调用法

首先需要在BCB的项目中加入输入接口库(import library),打开工程项目,使用BCB View|Project Manager打开项目列表,向项目中加入接口库(*.lib)。

其次在头文件中加入接口声明。

例程序如下:

//define in include file

extern 揅?__declspec(dllimport) int __cdecl test();

//use function in main program

int I;

I=test();

注意:

(1)动态链接库调用过程、函数时CALL方式与创建时方式一样不写为__cdecl,其它需要声明。

(2)BCB创建的DLL有对应的输入接口库(import library),如只有DLL而无库时,可用BCB的implib工具产生:implib xxx.lib xxx.dll;另外可用:tlib xxx.lib,xxx.lst 产生DLL的内部函数列表,许多Windows的

未公开技术就是用这种方法发现的。

2.动态调用法

动态调用法要用Windows API 中的LoadLibrary()和GetProcAddress()来调入DLL库,指出库中函

数位置,这种方法较常见。

例程序如下:

HINSTANCE dd;

int _stdcall (*ddd)(void);

dd=LoadLibrary(搙xx.dll?;

ddd=GetProcAddress(dd,搕est?;

Caption=IntToStr(ddd());

FreeLibrary(dd);

三、注意:

创建DLL时编译链接时注意设置Project Options。

Packages标签:去除Builder with runtime packages检查框。

Linker标签:去除Use dynamic RTL检查框。

否则创建的DLL需要Runtime packages or Runtime library。

用C++Bulider在WIN.INI中保存信息

现在许多软件把程序中需要的数据保存在注册表中,这样当用户装的软件越来越多时,致使注册表越来越庞大,容易使系统出错。当然,微软也建议在注册表中保存数据,但当我们需要保存的数据不多时完全可以把数据保存在WIN.INI中,这样可以很方便地维护,实现方法相对来说比较简单。下面我以Borland

C++Builder为例来说说如何实现。

原理其实很简单,只需调用API的WriteProfileString和GetProfileInt函数就可以了。这两个函数的原型是:BOOL WriteProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString );

UINT GetProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault);

其中lpAppName指在WIN.INI中段的名字,即用[]括起来的字符串,lpKeyName指在这个段中每一个项目的名字,lpString指这个项目的值,即“=”后的数, nDefault为当GetProfileInt没有找到lpAppName 和lpKeyName时返回的值,即缺省值,前者返回为布尔值(true 或false),后者返回为无符号整形值。当在WriteProfileString函数中lpKeyName 为空(NULL)时,则清除这个段的全部内容,lpString 为空时,

则清除这一项目的内容,即这一行将清除掉。

下面举一例子来说明这两个函数的用法。新建一个应用程序,在Form1上放两个Edit和三个Button,其中Edit的Text为空,三个Button的Caption分别为“添加”、“查看”、“清除”。双击“添加”按钮加入下面

代码:

WriteProfileString(“例子程序”,“项目”,Edit1→Text.c_str());

双击“查看”按钮加入如下代码:

unsigned int Temp;

Temp=GetProfileInt(“例子程序”,“项目”,100);

Edit2→Text=IntToStr(Temp);

双击“清除”按钮加入如下代码:

WriteProfileString(“例子程序”,NULL,NULL);

然后按F9键运行程序。

下来可以检验一下程序的正确性。在Edit1中输入数字,如“3265”,按“添加”按钮,这时运行“sysedit”

来查看“WIN.INI”文件的最后面,可以看到加入了如下内容:

[例子程序]

项目=3265

其中“[]”和“=”是函数自动加上的。按下“查看”按钮,在Edit2中出现“3265”,当按下“清除”按钮可清除

添加的部分。经过查看可知程序已达到预期的目的。

喜爱编程的朋友可以把上述方法应用到自己的程序中去,来达到保存数据信息的作用。当确实要把信息保存到注册表中,可以在C++Builder中定义一个TRegistry类的对象来进行相关的操作,或者直接调用Windows的API函数,具体如何编程大家可以参阅相关资料或者同我联系。

如何在C++Builder中检测硬件

在我们编写的程序中常常要和硬件打交道,那么如何在程序中确定系统中是否有该设备,它的运行状态又是怎样的呢?对于初学者来说,这个问题常常不好解决,其实只需简单地利用几个API函数,硬件的问题并不神秘。下面就让我们一起看看在C++Builder中是如何检测硬件的。

1. 检测CPU的型号

先让我们从最简单的做起,看一看自己的CPU型号。首先,在C++Builder中画出图1所示的窗体,在下面的几个例子中我们将一直使用这个窗体作示范,它包括一个用来激活测试的Button和一个用来显示结果的Memo。我们可以用GetSystemInfo这个API获得CPU的型号。将下列代码添加到Button

的Click事件里就可以了:

void __fastcall TForm1::Button1Click(TObject *Sender)

{

//获得CPU型号

SYSTEM_INFO systeminfo;

GetSystemInfo (&systeminfo);

Memo1→Lines→Add(撃 腃PU类型是:敚玈tring( systeminfo.dwProcessorType ));

}

运行它,点击Test试试,CPU型号出来了吧!

2.检测内存状态

获得内存状态的方法和CPU型号差不多,只是他用到的是另外一个API:GlobalMemoryStatus。

其中,成员dwTotalPhys用来获得物理内存总量,而dwAvailPhys顾名思义是有效物理内存的意思。

我们只要把下面几行代码加到上面程序的后面就可以了(不用重做,下同):

//获得内存状态

MEMORYSTATUS memory;

memory.dwLength =sizeof(memory); //初始化

GlobalMemoryStatus(&memory);

Memo1→Lines→Add(撃 奈锢砟诖媸?Mb):敚玈tring(int(memory.dwTotalPhys /1024/1024)));

Memo1→Lines→Add(撈渲锌捎媚诖媸?Kb):敚玈tring(int( memory. /1024)));

怎么样,看出点门道了么?两段程序的格式几乎一模一样,其实,GetSystemInfoGlobalMemoryStatus 还可以获得许多其他有关CPU和内存的信息,就按照上面的格式去套就行了,更详细的资料可以去看C

++Builder4的Help。

3. 检测可用硬盘空间

好了,经过前面两个简单问题的热身,我们来处理一个稍微复杂的问题:我们知道安装程序大都有一个检测硬盘空间的过程,那么这是怎么实现的呢?他用到的是API函数GetDiskFreeSpace,这个函数输入一个参数:目标盘的路径;返回四个参数,依次是每簇的扇区数、每扇区的字节数、空闲的簇数、总簇数。

假如我们需要检测C盘的总容量和可用容量,那么可以把以下代码加到上面的程序中:

//获得C盘可用空间

DWORD sector,byte,cluster,free;

long int freespace,totalspace;

GetDiskFreeSpace(揅:?&sector,&byte,&free,&cluster); //获得返回参数

totalspace=int(cluster)*int(byte)*int(sector)/1024/1024; //计算总容量

freespace=int(free)*int(byte)*int(sector)/1024/1024; //计算可用空间

Memo1→Lines→Add(揅盘总空间(Mb):敚玈tring(totalspace));

Memo1→Lines→Add(揅盘可用空间(Mb):敚玈tring(freespace));

怎么样?现在可以自己做安装程序了吧!

C++Builder如何响应消息及自定义消息

Inprise(Borland) C++Builder中,可以象在Delphi中一样响应消息,只是看起来要稍复杂一点。

对于系统已定义的消息,可以直接响应:

#define WM_MY_OPEN_CMDLINE_FILE (WM_USER+1) //进程间通讯的自定义消息#define WM_MY_SEARCH_NODE (WM_USER+2) //查找命令的自定义消息

class TSomeForm : public TForm

{

//...类中的其它代码

protected:

//消息的响应过程

void __fastcall OpenCmdLineFile(TMessage Message);

void __fastcall SearchDocumentNode(TMessage Message);

void __fastcall GetWindowMinMaxInfo(TWMGetMinMaxInfo Message);

//以下通过宏定义实现消息的正确响应

BEGIN_MESSAGE_MAP

MESSAGE_HANDLER(WM_MY_OPEN_CMDLINE_FILE, TMessage, OpenCmdLineFile)

MESSAGE_HANDLER(WM_MY_SEARCH_NODE, TMessage, SearchDocumentNode) MESSAGE_HANDLER(WM_GETMINMAXINFO , TWMGetMinMaxInfo, GetWindowMinMaxIn fo)

END_MESSAGE_MAP(TForm)

};//end class

//以下为实现代码

void __fastcall TSomeForm::OpenCmdLineFile(TMessage Message)

{//直接通过消息结构传递参数

LPSTR lpCmdLine=(LPSTR)Message.LParam;//从Message中取得参数

this->HandleCmdLineFile(lpCmdLine);//处理命令行的参数

return;

}

void __fastcall TSomeForm::SearchDocumentNode(TMessage Message)

{//响应查找消息

//Message中的参数在此处不需要。

this->SearchNode();

return;

}

void __fastcall TSomeForm::GetWindowMinMaxInfo(TWMGetMinMaxInfo Messag

e)

{//设置主窗口的最小尺寸

MINMAXINFO *MinMaxInfo=Message.MinMaxInfo;

MinMaxInfo->ptMinTrackSize.x=400;

MinMaxInfo->ptMinTrackSize.y=300;

return;

}

其中:TMessage和TWMGetMinMaxInfo类型的定义可参见:

C:\Program Files\Borland\CBuilder\inlucde\vcl\Messages.hpp;其它的消息

响应方法与此相同。

另外,可以为自定义的消息也定义一个对应的消息结构(如:TSearchNode_Mes

sage),至于如何定义消息结构, 可以参考:

C:\Program Files\Borland\CBuilder\inlucde\vcl\Messages.hpp

利用C++ Builder开发动画DLL

我们在Windows98环境下执行拷贝文件、查找文件或计算机等耗时比较长的操作时,Windows会显示一个小小的动画,指示正在进行的操作,与死板的静止图像相比增色不少。那么我们自己开发软件时,能否也显示一个这样的动画提示呢?我在开发一个外贸应用软件系统时,遇到的数据量很大,当通过复合条件查找时,因为不是数据库表的每个项目都有索引,所以很费时,系统也会表现出长时间停顿,用户感觉极为不爽。我经过一段时间的探索,开发了一个能够在采用的开发环境PowerBuilder下调用的动画DLL,由于采用多线程编程,PB调用的DLL函数能够及时将控制权交还为PB,不影响应用系统的运转。

用户能够看到一个东西在动,也就不会想到系统是不是停止响应了,感觉时间也似乎没那么久了。

代码与编译选项

(1) 在C++Builder的File菜单下选择New,在New Item对话框的New属性中选择DLL,C++Builder

就会创建一个空白的DLL项目。

(2) 在File菜单下选择New Form,C++Builder创建一个空白的Form,修改它的属性为

BorderStyle=bsDialog

BorderIcons的子属性均为False

FormStyle=fsStayOnTop

Position= poScreenCenter

Name=StatusForm

(3) 在Form上添加一个Win32下的Animate控件Animate1,修改它的属性为

Align=alTop

(4) 在Form上添加一个Standard下的Button控件Button_Cancel,再添加System下的Timer控件

Timer1,设置定时Interval时间位250,以较快的响应用户的取消请求。

因为PB应用系统与动画窗体代码分别属于两个线程,不能采用PB线程直接关闭动画窗体线程的窗口,否则会引起系统运行不正常,因此采用PB线程设置关闭标志,而动画线程采用Timer控件定时检查标志,一旦检测到关闭标志,就关闭窗口,清除线程标志,结束动画线程。

下面给出编码及编码原理:

1.DLL DLL主体代码:

/**********************************

* DLL主体代码

* 定义DLL公用变量

* g_CommonAVI

对Animate控件动画类型索引

* gi_Canceled

Button_Cancel按钮是否被选择过

* gi_AVIType

要显示的动画类型,由DLL输出函数做为参数输入

* gi_RequestClose

请求动画线程关闭标志

* gi_WindowActive

动画窗口所处的状态

* lpsWinTitle

动画窗体的标题,由DLL输出函数做为参数输入

*/

TCommonAVI g_CommonAVI[]={

aviNone, aviFindFolder,

aviFindFile, aviFindComputer,

aviCopyFiles, aviCopyFile,

aviRecycleFile, aviEmptyRecycle,

aviDeleteFile

};

int gi_Canceled=0,gi_AVIType=0;

int gi_RequestClose=0,gi_WindowActive=0;

char lpsWinTitle[256];

HWND hWndParent=NULL;

/* 定义DLL 输出函数*/

extern "C" __declspec(dllexport)

int pascal DllEntryPoint(HINSTANCE hinst,

unsigned long reason, void*);

extern "C" __declspec(dllexport) int

pascal ShowStatusWindow(int AVIType,

LPSTR WinTitle,long hWnd);

extern "C" __declspec(dllexport) int

pascal GetStatus(int ai_CloseWin);

extern "C" __declspec(dllexport) int

pascal CloseStatusWindow();

/*定义线程TformThread:*/

class TFormThread : public TThread{

public:// User declarations

__fastcall TFormThread(bool CreateSuspended);

void __fastcall Execute(void);

};

__fastcall TFormThread::

TFormThread(bool CreateSuspended):

TThread(CreateSuspended){

}

/* 动画线程执行代码,

动画窗体的定时器控件会关闭它,

清除窗体存在标志后结束线程的运行

*/

void __fastcall TFormThread::Execute(void){

gi_WindowActive=1;

StatusForm=new TStatusForm(NULL);

StatusForm- >Caption=lpsWinTitle;

StatusForm- >ShowModal();

gi_WindowActive=0;

delete StatusForm;

gi_RequestClose=0;

}

/* 定义一个线程实例指针*/

TFormThread *FormThread;

/**********************************************

* 输出函数代码实现部分

* DllEntryPoint 32位DLL入口

* ShowStatusWindow 显示动画窗口,它通过创建一个线程来创建窗口,避免由于窗口的MODAL属性而使控制权不能及时的返还给调用者

* GetStatus

取得撊∠麛状态,即用户有没有选择撊∠麛按钮* CloseStatusWindow 关闭动画窗口,

*/

__declspec(dllexport) int WINAPI DllEntryPoint (HINSTANCE hinst, unsigned long reason, void*)

{

return 1;

}

__declspec(dllexport) int pascal

ShowStatusWindow(int AVIType,LPSTR

WinTitle,long hWnd){

hWndParent=(HWND)hWnd;

memset(lpsWinTitle,0,sizeof(lpsWinTitle)); strncpy(lpsWinTitle,WinTitle,sizeof(lpsWinTitle)-1);

if (AVIType >0 && AVIType< =8)

gi_AVIType=AVIType;

FormThread=new TFormThread(true);

FormThread- >Priority = tpNormal;

FormThread- >Resume();

}

__declspec(dllexport) int pascal

GetStatus(int ai_CloseWin){

if (gi_Canceled)

if (gi_WindowActive){

gi_RequestClose=1;

while(gi_RequestClose);

}

return gi_Canceled;

}

__declspec(dllexport) int pascal

CloseStatusWindow(){

if (gi_WindowActive){

gi_RequestClose=1;

while(gi_RequestClose);

}

return gi_Canceled;

}

2.窗体StatusForm的代码:

TStatusForm *StatusForm;

//-----------------------------------

extern int gi_Canceled;

extern int gi_AVIType;

extern TCommonAVI g_CommonAVI[];

__fastcall TStatusForm::

TStatusForm(HWND ParentWindow)

: TForm(ParentWindow)

{

gi_Canceled=0;

}

//-----------------------------------

//取消按钮并不直接关闭窗体,

而指示设置取消标志,供调用者查看

void __fastcall TStatusForm::

Button_CancelClick(TObject *Sender)

gi_Canceled=1;

// ModalResult=mrCancel;

}

//-----------------------------------

// 激活动画,在FORMCREATE事件中

void __fastcall TStatusForm::

FormCreate(TObject *Sender)

{

Animate1- >CommonAVI=g_CommonAVI[gi_AVIType];

Animate1- >Active = true;

}

//-----------------------------------

extern int gi_RequestClose;

// 定时器事件检测到结束标志关闭窗体

void __fastcall TStatusForm::

Timer1Timer(TObject *Sender)

{

if (gi_RequestClose){

ModalResult=mrOk;

}

}

//-----------------------------------

(5) 设置编译选项:Project->Options打开Project Options对话框,清除Linker属性页中的Use Dynamic RTL标志,清除Packages属性页中的Build with runtime packages。这样只要单个DLL就可以运行了,而不必安装一些动态连接运行时间库。使用动画DLL

上面编译出DLL可以由其它任何开发语言调用,下面给出在PB中的使用方法。

(1) 定义:

//Declare - > Global External Functions

FUNCTION Long ShowStatusWindow(Long

AVIType,String WinTitle,long hWnd) &

LIBRARY "STATWIN.DLL" ALIAS FOR "ShowStatusWindow"

FUNCTION Long GetCancelStatus(Long CloseWindow) &

LIBRARY "STATWIN.DLL" ALIAS FOR "GetStatus"

FUNCTION Long CloseStatusWindow() &

LIBRARY "STATWIN.DLL" ALIAS FOR "CloseStatusWindow"

(2) 调用:

long ll_EndTime

//显示查找文件夹动画

ShowStatusWindow(2)

setpointer(HourGlass!)

ll_EndTime = Cpu() + 10 * 1000

DO

if GetCancelStatus(0)=1 then

end if

// 做想做的事情

LOOP UNTIL cpu() > ll_EndTime

CloseStatusWindow()

用C++ Builder 3制作屏幕保护程序

屏幕保护程序是以scr为扩展名的标准Windows可执行程序,在激活控制面板的显示器属性的"屏幕保护程序"页时,该模块会自动在Windows启动目录(Windows目录和系统目录)下查找扩展名是scr的基于Windows的可执行文件。使用屏幕保护程序,不仅可以延长显示器的使用寿命,还可以保护私人信

息。

编制屏幕保护程序不仅要涉及消息的处理,还要涉及命令行参数的处理。在WIN32SDK文档中描述了编制基于WIN32的标准的屏幕保护程序所必须遵守的严格标准。按照这些标准,屏幕保护程序必须要输出两个函数:ScreenSaverProc和ScreenSaverConfigureDialog,但是,在Windows系统中的很多屏幕保护程序并没有遵循这些标准(使用impdef或者tdump实用工具查看即可)。并且使用该文档中介绍的方法编写屏幕保护程序,不仅要使用资源编辑器,并且在链接时还要利用Scrsaver.lib文件(在C++Builder3环境下,不能成功连接)。不仅要涉及消息的处理,还要涉及命令行参数的处理。

C++Builder3是一种快速的应用程序开发工具,提供了许多类型的应用程序开发模板,但没有提供开发屏幕保护程序的模板,并且在其在线帮助中也没有提及如何开发这类应用程序。经过本人的研究,找到

了用C++Builder3编制屏幕保护程序的方法。

在控制面板的"显示器属性"项的"屏幕保护程序"页中进行设置时,要遇到三种类型的命令行参数,并且,各种情况下的屏幕保护程序的显示结果也各不相同,一般来讲,就需要三种类型的窗体(或两种,在随后的内容中讨论)。下面将分四步来具体地说明如何编制屏幕保护程序。

一、屏幕保护程序的选择

如果在标题为"屏幕保护程序"的下拉列表框中选中了某个保护程序时,系统会自动启动该程序,这个程序的显示范围是在这个页面上的显示器图形的屏幕范围,同时,会将两个命令行参数:一个是"/p";另一个是显示窗口的句柄,传递给这个被选中的程序。因此,这类程序首先应该能够处理命令行参数。在C++Builder3中,与命令行参数处理有关的函数是:ParamCount()和ParamStr(),具体的申明方式如下:

1.externPACKAGEint__fastcallParamCount(void);

该函数返回命令行参数的个数,但不包含应用程序本身。

2.externPACKAGEAnsiString__fastcallParamStr(intIndex);

该函数返回指定索引值的命令行参数。ParamStr(0)返回的是应用程序本身。

所以,在这以步骤中的参数判断的语句如下:

if(UpperCase(ParamStr(1))==

"-p"||UpperCase(ParamStr(i))=="/p")

{

//addthecodeinhere

}

在完成了参数判断后,就应该对显示窗口的处理,为能够使程序在显示器图形的屏幕区域内显示,就要重新设置程序的父窗口和显示区域。这要涉及到父窗口句柄的获得及父窗口的设置,以及API函数的调

用。这种环境下的父窗口句柄就是传递过来的第二个命令行参数;要设置父窗口,只需设置窗体的

ParentWindow属性即可。这段程序如下:

RECTrc;//Line1

HWNDhWnd=(HWND)

(atol(ParamStr(2).c_str()));//Line2

::GetClientRect(hWnd,&rc);//Line3

ParentWindow=hWnd;//Line4

Left=rc.left;//Line5

Top=rc.top;//Line6

Width=rc.right-rc.left;//Line7

Height=rc.bottom-rc.top;//Line8

在上面的程序片段中,第2行语句是将传递过来的第2个参数转换成窗口句柄;然后,第3行语句利用这个窗口句柄,调用API函数以获得该窗口的客户区域;第4行语句将选中的屏幕保护程序的父窗口设置为指定的窗口;余下的语句是将该程序的窗口大小设置成副窗口的客户区大小。这一程序片段的位置应

该是在窗体的OnCreate事件处理中。

需要说明的是,这种类型(包括第三步介绍的窗体)的窗体样式应是:

FormStyle=fsStayOnTop;

窗体边界的样式应为:

BorderStyle=bsNone;

当然,这时也不需要鼠标图形,因此,可以将鼠标的形状设为crNone:

Cursor=crNone;

二、初始化参数的设置

单击"显示器属性"模块的"屏幕保护程序"页面中的"设置"按钮时,系统会启动指定的保护程序的初始值设置对话框,这时传递过来的命令行参数是:"/c"或"-c"(参数的处理与前面介绍的相同)。通过该对话框,可以设置保护程序的一些初始参数,比如图形的变化快慢等。在这段程序中,还要涉及到初始化文件或注册表的读写,用以记录初始化参数,便于保护程序启动时使用。

三、预览及运行

预览的效果就是屏幕保护程序被激活后的显示。单击单击"显示器属性"模块的"屏幕保护程序"页面中的"预览"按钮,就可以观察保护程序运行的实际效果。这时,系统启动该程序时传递过来的命令行参数是:"/s"或"-s"。对于命令行参数的处理与前面的步骤相同,但在这一步中,还要对几个消息进行处理,这些消息是:WM_MOUSEMOVE,WM_LBUTTONDOWN,WM_MBUTTONDOWN,WM_RBUTTONDOWN,WM_KEYDOWN,WM_ACTIVATE。对WM_MOUSEMOVE和WM_ACTIVATE消息的处理形式如下:void__fastcallHandleSomeMessage(TMessage&Msg)

{

switch(Msg.Msg)

{//......

caseWM_ACTIVATE:if(Msg.WParamLo==WA_INACTIVE)

Close();

break;

caseWM_MOUSEMOVE:if(OldMouseX==-1&&OldMouseY==-1)

//Intheconstructor,OldMouseXand

OldMouseYmustbeinitializedby-1.

{OldMouseX=Msg.LParamLo;

OldMouseY=Msg.LParamHi;

}

elseif(OldMouseX!=Msg.LParamLo

||OldMouse!=Msg.LParamHi)

Close();

break;

......

}

}

对于其他的消息仅仅是调用Close()函数来关闭应用程序即可。应用这种消息处理方式时,必须要类定义时进行消息映射,不然的话,就要在相应的消息响应中进行处理(使用一定的布尔变量,就可以与第

一步合用一个窗体)。

与第一步类似,在该步骤中,也不需要具体的鼠标指针的形状,因此,将鼠标指针设为crNone:

Cursor=crNone;

四、修改项目源文件

在C++Builder3中,一个窗体也就是一个类,换句话说,具有某些特性的类也就是一个窗体,因此,编制屏幕保护程序时,也不需要什么主窗体,同时,也不用自动创建某些窗体了,这时就要修改项目源文件,下面所列出的程序就是笔者在编制某屏幕保护程序时使用的项目源文件,供读者参考。

WINAPIWinMain(HINSTANCE,HINSTANCE,LPSTR,int)

{

CreateMutex(NULL,true,"ScreenSaver");

if(GetLastError()!=ERROR_ALREADY_EXISTS)

{

try

{

Application->Initialize();

Application->Title="屏幕保护程序测试";

if(UpperCase(ParamStr(1))==

"/C"||UpperCase(ParamStr(1))=="-C"

||ParamCount()==0)

{TScrSaverConfiguerF*ScrCfg=

newTScrSaverConfiguerF(NULL);

ScrCfg->ShowModal();

deleteScrCfg;

return0;

}//单击"设置"按钮

elseif(UpperCase(ParamStr(1))==

"/P"||UpperCase(ParamStr(1))=="-P")

{TScrForP*ScrFP=newTScrForP(NULL);

ScrFP->ShowModal();

deleteScrFP;

return0;

}//在"屏幕保护程序"下拉列表框中选择一个程序

elseif(UpperCase(ParamStr(1))==

"/S"||UpperCase(ParamStr(1))=="-S")

{TScreenSaveF*ScreenSave=newTScreenSaveF(NULL);

ScreenSave->ShowModal();

deleteScreenSave;

return0;

}//单击"预览"按钮,及运行屏幕保护程序

else

return1;

}

catch(Exception&exception)

{

Application->ShowException(&exception);

}

}

return0;

}//theWinMainFunctionend

前面介绍了在C++Builder3下编制屏幕保护程序的方法.对于C++Builder3这种RAD工具来讲,开发这类程序也是相当方便的,按照前述的方法,可以在极短的时间开发出屏幕保护程序。对于屏幕保护程序,在本文中没有说明的就是如何设置口令的问题,这部分就由读者自己摸索吧。

TCP/IP头格式

一、先是常用的IP头格式。

IP头格式:

版本号(4位)

IP头长度(4位)

服务类型(8位)

数据包长度(16位)

标识段(16位)

标志段(16位)

生存时间(8位)

传输协议(8位)

头校验和(16位)

发送地址(16位)

目标地址(16位)

选项

填充

简单说明

============

1. IP头长度计算所用单位为32位字, 常用来计算数据开始偏移量

2. 数据包长度用字节表示, 包括头的长度, 因此最大长度为65535字节

3. 生存时间表示数据被丢失前保存在网络上的时间, 以秒计.

4. 头校验和的算法为取所有16位字的16位和的补码.

5. 选项长度是可变的, 填充区域随选项长度变化, 用于确保长度为整字节的倍数.

描述

============

struct iphdr {

BYTE versionihl;

BYTE tos;

WORD tot_len;

WORD id;

WORD frag_off;

BYTE ttl;

BYTE protocol;

WORD check;

DWORD saddr;

DWORD daddr;

/* Put options here. */

};

二、TCP头格式

TCP头格式:

源端口(16位)

目的端口(16位)

序号(32位)

确认号(32位)

数据偏移(4位)

保留(6位)

标志(6位)

窗口(16位)

校验和(16位)

紧急指针(16位)

选项

填充

简单说明

============

1. 数据偏移用于标识数据段的开始

2. 保留段6位必须为0

3. 标志包括紧急标志、确认标志、入栈标志、重置标志、同步标志等。

4. 校验和计算方式为将头与16位二进制反码和中的16位二进制反码加在一起。

5. 选项长度是可变的, 填充区域随选项长度变化, 用于确保长度为整字节的倍数.

6. 更详细的说明请参阅有关资料。

描述

============

struct tcphdr {

WORD SourPort;

WORD DestPort;

DWORD SeqNo;

DWORD AckNo;

BYTE HLen;

BYTE Flag;

WORD Window;

WORD ChkSum;

WORD UrgPtr;

/* Put options here. */

};

UDP

一、说明

使用UDP时,直接使用API代替控件。

第一个程序(ReadBufferUdp)使用来接收到缓存中。

"Destino"变量非常重要,如果你从其他地方接收数据到Buffer,你必须设置Destino = 0 并且在以后执行的时候赋值你将要发送的包的地址给它(after the execution it will have the address which send you the

packet.)。

如果你只想从一个指定的地址接收数据,你必须设置变量Destino =

.

"gvEncerrar" 用来中止处理过程。(gvEncerrar被设置为全局变量。)

超时时间设置。"Inicio + 12" = 12 sec of timeout.

第三个程序是用来准备WinSock程序。

二、代码

int ReadBufferUdp(unsigned long *Destino,void *T,int Size)

{

char Buffer[128];

SOCKADDR_IN SockAddr;

int LenSockAddr=sizeof(SOCKADDR_IN);

fd_set FdRead;

struct timeval t_val;

int Ret;

time_t Inicio = time(NULL);

Application->ProcessMessages();

if(gvEncerrar)

return false;

FD_ZERO(&FdRead);

FD_SET(gvSocket,&FdRead);

t_https://www.doczj.com/doc/8319129309.html,_sec=0;

t_https://www.doczj.com/doc/8319129309.html,_usec=0;

while((Ret=select(0,&FdRead,NULL,NULL,&t_val))!=1 && (Inicio + 12) >

time(NULL) && !gvEncerrar)

{

FD_ZERO(&FdRead);

FD_SET(gvSocket,&FdRead);

t_https://www.doczj.com/doc/8319129309.html,_sec=0;

t_https://www.doczj.com/doc/8319129309.html,_usec=0;

Application->ProcessMessages();

}

if(Ret != 1)

return false;

if(recvfrom(gvSocket,Buffer,Size,0,(LPSOCKADDR)&SockAddr,&LenSockAddr)!=Size)

return false;

if(*Destino == 0)

{

*Destino = SockAddr.sin_addr.s_addr;

}

else

if(*Destino != SockAddr.sin_addr.s_addr)

return false;

memcpy(T,Buffer,Size);

return true;

}

int WriteBufferUdp(unsigned long Destino,void *T,int Size)

{

SOCKADDR_IN SockAddr;

int Sent;

Application->ProcessMessages();

SockAddr.sin_family = AF_INET;

SockAddr.sin_port = gvPortUdp;

SockAddr.sin_addr.s_addr = Destino;

Sent = sendto(gvSocket,(char

*)T,Size,0,(LPSOCKADDR)&SockAddr,sizeof(SockAddr));

if(Sent != Size)

return false;

else

return true;

}

void InicializaTCPIP()

{

WORD wVersionRequested;

WSADATA wsaData;

IN_ADDR In;

PSERVENT PServent;

SOCKADDR_IN SockAddrIn;

wVersionRequested = MAKEWORD( 1, 1 );

if(WSAStartup( wVersionRequested, &wsaData ))

{

ShowMessage("Erro na inicializao do TCP/IP");

Application->Terminate();

return;

}

// Get the port on service file

if((PServent=getservbyname("your_service_name","udp"))==NULL)

{

ShowMessage("Erro obtendo port do servi transurb/udp");

Application->Terminate();

return;

}

gvPortUdp = PServent->s_port;

sprintf(StrAux,"Servi transurb/udp port:%d",ntohs(gvPortUdp));

Log(StrAux);

// Open de Socket

if((gvSocket = socket(AF_INET,SOCK_DGRAM,0))==INVALID_SOCKET)

{

ShowMessage("Erro na criao do socket");

Application->Terminate();

return;

}

Log("Socket criado com sucesso");

// Do the bind

SockAddrIn.sin_family = AF_INET;

SockAddrIn.sin_port = gvPortUdp;

SockAddrIn.sin_addr.s_addr = NULL;

if(bind(gvSocket,(LPSOCKADDR)&SockAddrIn,sizeof(SockAddrIn))==SOCKET_ERROR)

{

ShowMessage("Erro no bind do socket");

Application->Terminate();

return;

}

Log("Bind do socket com sucesso");

}

判断windows的Desktop及其它目录

使用API函数SHGetSpecialFolder。shlobj.h里有SHGetSpecialFolder的原型声明。这个函数可以帮我们找到windows的Desktop目录、启动目录、我的文档目录等。

SHGetSpecialFolder需要三个参数。第一个参数是HWND,它指定了"所有者窗口":在调用这个函数时可能出现的对话框或消息框。第二个参数是一个整数id,决定哪个目录是待查找目录,它的取值可能是:

CSIDL_BITBUCKET 回收站

CSIDL_CONTROLS 控制面板

CSIDL_DESKTOP Windows 桌面desktop

CSIDL_DESKTOPDIRECTORY desktop的目录

CSIDL_DRIVES 我的电脑

CSIDL_FONTS 字体目录

CSIDL_NETHOOD 网上邻居

CSIDL_NETWORK 网上邻居virtual folder

CSIDL_PERSONAL 我的文档

CSIDL_PRINTERS 打印机

CSIDL_PROGRAMS 程序组

CSIDL_RECENT 大多数最近打开的文档列一

CSIDL_SENDTO “发送到”菜单项

CSIDL_STARTMENU 任务条启动菜单项

CSIDL_STARTUP 启动目录

CSIDL_TEMPLATES 临时文档

最后一个参数是pidl地址。SHGetSpecialFolderLocation把地址写到pidl。

下面的代码演示了怎样使用SHGetSpecialFolderLocation:

//----------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

{

LPITEMIDLIST pidl;

LPMALLOC pShellMalloc;

char szDir[MAX_PATH];

if(SUCCEEDED(SHGetMalloc(&pShellMalloc)))

{

if(SUCCEEDED(SHGetSpecialFolderLocation(NULL,

CSIDL_DESKTOPDIRECTORY,

&pidl)))

{

// 如果成功返回true

if(SHGetPathFromIDList(pidl, szDir))

{

Label1->Caption = szDir;

}

pShellMalloc->Free(pidl);

}

pShellMalloc->Release();

}

}

//----------------------------------------------------------------------

注意: 有些目录是空的。有些特定的目录在这个文件系统上并没有一个相应的目录。

取得本地internet机器的名字及IP地址

一、下面的例子使用Winsock API 取得本地主机的名字及地址

void __fastcall TForm1::Button1Click(TObject *Sender)

{

hostent *p;

char s[128];

char *p2;

//Get the computer name

gethostname(s, 128);

p = gethostbyname(s);

Memo1->Lines->Add(p->h_name);

//Get the IpAddress

p2 = inet_ntoa(*((in_addr *)p->h_addr));

Memo1->Lines->Add(p2);

}

void __fastcall TForm1::FormCreate(TObject *Sender)

{

WORD wVersionRequested;

WSADATA wsaData;

//Start up WinSock

wVersionRequested = MAKEWORD(1, 1);

WSAStartup(wVersionRequested, &wsaData);

}

void __fastcall TForm1::FormDestroy(TObject *Sender)

{

WSACleanup();

}

用C++Builder创建数字签名

如果你在网络上传递一份数据,但却存在着种种不安全的因素,使你对数据能否原封不动地到达目的地而心存疑惑,这时,你就可以给数据加上数字签名,从而使对方可以通过验证签名来检查你所传过去的

数据是否已被他人修改。

一、程序原理

数字签名的工作原理还是比较简单的,它是根据你所提供的原始数据,经过复杂的算法,产生特定的数据签名,对方通过同样的过程也产生签名,如果数据已被修改,那么就不可能得到两份一模一样的签名,

C++ builder 中关于窗体的一些操作

C++ builder 中关于窗体的一些操作(总在最前,遍历控件...) 一、让窗口总是在最前面 Form 的FormStyle属性设置为fsStayOnTop值。 二、动态调用窗体Form 在缺省情况下,由File/New Form生成添加入项目文件中的窗体都具有"Auto Create"(自动创建)的特性。即只要程序运行,该窗体就存在于内存中了,不管当前它是否被调用。具有这种特性的窗体一般适用于窗体属性比较固定、经常被调用的情况。其优点是速度快,缺点是占用内存。在实际程序设计中,会遇见大量类似对话框功能的窗体,它们用于显示状态或输入信息,仅须在程序中调用一下,完成其功能就行了,无需常驻内存。这时可以通过选择Project/Options/Forms,将"Auto--Create forms " 栏中相应的窗体, 如Form1,用" >" 键移动到"Available forms"栏中,并在程序需调用该窗体处,加入下列语句:TForm1 *myform=new TForm1(this); myform- >ShowModal(); delete myform; 窗体Form1仅是在需要调用时才调入内存,调用完成后,即用delete清除出内存。这样可减少程序对内存资源的占用。 三、遍历窗体控件的方法 要访问或修改窗体上的控件,方法很简单,以TEdit为例子: Edit1- >Text=""; Edit2- >Text=""; 但如果窗体上有十来个像Edit1 这样的控件,需要进行相同的初始化,用上面的方法一个一个地进行,岂不麻烦!所以有必要掌握遍历窗体控件的方法。在介绍该方法之前,让我们先了解一下窗体Form 的Components 和Controls 属性。参见表一。

15个常用的Excel函数公式

15 个常用的Excel函数公式,拿来即用1、查找重复内容 =IF(COUNTIF(A:A,A2)>1," 重复","") 2、重复内容首次出现时不提示 =IF(COUNTIF(A$2:A2,A2)>1," 重复","") 3、重复内容首次出现时提示重复 =IF(COUNTIF(A2:A99,A2)>1," 重复","")

4、根据出生年月计算年龄 =DATEDIF(A2,TODAY(),"y") 5、根据身份证号码提取出生年月 =--TEXT(MID(A2,7,8),"0-00- 00") 6、根据身份证号码提取性别 =IF(MOD(MID(A2,15,3),2)," 男"," 女") 7、几个常用的汇总公式 A列求和:=SUM(A:A)

A列最小值: =MIN(A:A) A列最大值: =MAX (A:A) A列平均值: =AVERAGE(A:A) A列数值个数: =COUNT(A:A) 8、成绩排名 =RANK.EQ(A2,A$2:A$7) 9、中国式排名(相同成绩不占用名次) =SUMPRODUCT((B$2:B$7>B2)/COUNTIF(B$2:B$7,B$2:B$7))+1 10、90 分以上的人数

=COUNTIF(B1:B7,">90") 11、各分数段的人数 同时选中 E2:E5,输入以下公式,按 Shift+Ctrl+Enter =FREQUENCY(B2:B7,{70;80;90}) 12、按条件统计平均值 =AVERAGEIF(B2:B7,"男",C2:C7) 13、多条件统计平均值 =AVERAGEIFS(D2:D7,C2:C7,男"",B2:B7," 销售")

VB控件属性大全

1.01、窗体(FORM)的常用属性 属性说明 (Name)窗体的名称 ActiveControl返回焦点所在的控件,该属性设计阶段不可用,运行时只读。 Appearance 外观效果,取值为: 0 平面 1 3D(立体) AutoRedraw 是否自动刷新或重画窗体上所有图形[获得或设置从绘图(graphics)方法到一个持久性位图的输出],取值为: True False BackColor背景颜色,可从弹出的调色板选择。 BorderStyle 设置边界类型,取值为: 0 None(无边界框架) 1 FixedSingle(窗口大小固定不变的单线框架) 2 Sizable(窗口大小可变的标准双线框架) 3 FixedDialog(窗口大小固定的对话框窗体) 4 FixedToolWindow(窗口大小固定的工具箱窗体) 5 Sizable ToolWindow(窗口大小可变的工具箱窗体) Caption窗体的标题 ClipControls 决定Paint事件的graphics方法是重画整个对象,还是重画新显示的区域。取值为: True或False ControlBox 是或有控制框, 取值为:True 有 False 无 DrawMode 设定窗体上绘图(graphics方法),Shape,Line等控件的输出外观,有16种可选: 1 黑色 2 非或笔,设置值15的反相 3 与非笔,背景色以及画笔反相二者共有颜色的组合 4 非复制笔,设置值13的反相 5 与笔非,画笔以及显示色反相二者共有颜色的组合 6 反相,显示颜色反相 7 异或笔,画笔颜色以及显示颜色的异或 8 非与笔,设置值9的反相 9 与笔,画笔以及显示色二者共有颜色的组合

最常用函数公式大全

Excel函数公式大全工作中最常用Excel函数公式大全 一、数字处理 1、取绝对值 =ABS(数字) 2、取整 =INT(数字) 3、四舍五入 =ROUND(数字,小数位数) 二、判断公式 1、把公式产生的错误值显示为空 公式:C2 =IFERROR(A2/B2,"") 说明:如果是错误值则显示为空,否则正常显示。 ? 2、IF多条件判断返回值 公式:C2 =IF(AND(A2<500,B2="未到期"),"补款","") 说明:两个条件同时成立用AND,任一个成立用OR函数.

? 三、统计公式 1、统计两个表格重复的内容 公式:B2 =COUNTIF(Sheet15!A:A,A2) 说明:如果返回值大于0说明在另一个表中存在,0则不存在。 ? 2、统计不重复的总人数 公式:C2 =SUMPRODUCT(1/COUNTIF(A2:A8,A2:A8)) 说明:用COUNTIF统计出每人的出现次数,用1除的方式把出现次数变成分母,然后相加。

? 四、求和公式 1、隔列求和 公式:H3 =SUMIF($A$2:$G$2,H$2,A3:G3) 或 =SUMPRODUCT((MOD(COLUMN(B3:G3),2)=0)*B3:G3) 说明:如果标题行没有规则用第2个公式 ? 2、单条件求和 公式:F2 =SUMIF(A:A,E2,C:C) 说明:SUMIF函数的基本用法

? 3、单条件模糊求和 公式:详见下图 说明:如果需要进行模糊求和,就需要掌握通配符的使用,其中星号是表示任意多个字符,如"*A*"就表示a前和后有任意多个字符,即包含A。 ? 4、多条件模糊求和 公式:C11 =SUMIFS(C2:C7,A2:A7,A11&"*",B2:B7,B11) 说明:在sumifs中可以使用通配符*

C#控件属性大全

Control类中定义的基础控件属如下(注意属性名称并不完全一致): 1.AllowDrop属性:以确定控件是否接受用户的拖动。如果允许其属性值为true,否我false(默认值)。对于 RichTextBox控件,本属性中是为false。 2.Anchor属性:获取或设置控件是男个边缘停靠在容器的边缘。本属性的值为AnchorStyles枚举值之一。 3.BackColor属性:以获取或设置本控件的背景颜色。本属性为环境属性,因此中是返回非空值。 4.BackgroundImage属性:以获取或设置控件中显示的背景图片。 5.BindingContext属性:以获取或设置对象的BindingContext。控件BindingContext对象用于为其中包含的所有数据绑定控件返回一个BindingManagerBese对象。BindingManagerBase对象使绑定到同一数据源的所有控件保持同步。例如:设置该对象Position属性,可以指定所有数据绑定控件指向的底层类表现。(不懂用到再说,宽宽心里方不下啊)。 6.Bottom属性:以获取本控件下边缘以容器客户区上边缘之间的距离。本属性的值等于Top属性与Height属性值只和。 7.Bounds属性:以获取或设置本控件的边界矩形。 8.CanFocus属性:以确定控件是否能接收焦点。如能,其值为true,否则为false。要使控件能接收输入焦点,控件必须具有句柄,并且Visible和Enabled属性必须为true。 9.CanSelect属性:以确定本控件是否可被选择。如可以其值为true,否则为false。如果控件的ControlStyles.Selectable被设置为true,并且它的容器控件和所有的父控件都可见并且被启用,这本属性将返回true。下面给出的CanSelect属性为false的windows窗体控件:Panel、GroupBox、PictureBox、ProgressBar、Splitter、Label、LinkLabel(当控件不存在连接时)。需要注意的是,派生自这些控件的控件也不能被选择。 10.Capture属性:以确定控件是否被鼠标捕获。如是值为true,否值为false (默认)。如true,它将接受鼠标的输入,而无论光标是否处于它的边界内。

15个常用的Excel函数公式

15个常用的Excel函数公式,拿来即用 1、查找重复内容 =IF(COUNTIF(A:A,A2)>1,"重复","") 2、重复内容首次出现时不提示 =IF(COUNTIF(A$2:A2,A2)>1,"重复","") 3、重复内容首次出现时提示重复 =IF(COUNTIF(A2:A99,A2)>1,"重复","")

4、根据出生年月计算年龄 =DATEDIF(A2,TODAY(),"y") 5、根据身份证号码提取出生年月 =--TEXT(MID(A2,7,8),"0-00-00") 6、根据身份证号码提取性别 =IF(MOD(MID(A2,15,3),2),"男","女") 7、几个常用的汇总公式 A列求和:=SUM(A:A)

A列最小值:=MIN(A:A) A列最大值:=MAX (A:A) A列平均值:=AVERAGE(A:A) A列数值个数:=COUNT(A:A) 8、成绩排名 =RANK.EQ(A2,A$2:A$7) 9、中国式排名(相同成绩不占用名次) =SUMPRODUCT((B$2:B$7>B2)/COUNTIF(B$2:B$7,B$2:B$7))+1 10、90分以上的人数

=COUNTIF(B1:B7,">90") 11、各分数段的人数 同时选中E2:E5,输入以下公式,按Shift+Ctrl+Enter =FREQUENCY(B2:B7,{70;80;90}) 12、按条件统计平均值 =AVERAGEIF(B2:B7,"男",C2:C7) 13、多条件统计平均值 =AVERAGEIFS(D2:D7,C2:C7,"男",B2:B7,"销售")

所有控件都具有的属性

所有控件都具有的属性:1、Name: 表示在代码中用来标识一个控件的名字。 2、Enabled: 表示一个控件是否可以响应一个事件,即该控件可不可用。 值为true: 可以响应;值为false: 不可以看见。 3、Visible: 表示一个控件是否可见。值为true:可以看见;值为false: 不可以看见。 所有控件都具有的事件:1、KeyDown : 当用户按下键盘上一个键时发生的。 2、KeyUp : 在用户松开键盘上按下的键时发生的。 3、KeyPress : 在Key Down和Key Up事件之间发生。 4、MouseDown : 在鼠标被按下时触发的。 5、MouseUp :在用户松开鼠标键时发生的。 6、Click :在用户单击鼠标左键时发生的。 7、DblClick :在用户双击鼠标时发生的。 一、窗体 (Form)属性: 1、Caption: 表示窗体标题栏的文字。 2、BorderStyle: 一般情况下为默认值,若更改为下列值: 1)值为0:没有窗体标题栏 2)值为1:窗体运行之后不能改变大小 3、WindowState: 设置窗体的大小。 3)值为0:窗体正常大小 4)值为1:窗体最小化值为2:窗体最大化 4、BackColor: 表示窗体的背景颜色 事件 1、Initialize(初始化事件): 在窗体加载和显示之前触发,这个事件只触一次。 2、Load(加载事件): 用来完成窗体显示之前需要完成的动作。 3、Activate/Deactivate (激活/非激活事件):是用户在同一个应用程序的两个或多个窗体之间移动时触发的。 4、QueryUnload(条件卸载事件): 决定窗体是如何关闭的。 触发QueryUnload事件时Unload 的参数和因素有: 1)VbFormControlMenu值为0 :选中窗体控件菜单中的Close命令。 2)VbFormCode值为1 :从代码中调用Unload 语句。 3)VbAppWindows值为2 :终止当前的Windows操作系统。 4)VbFormMDIForm值为4 :因为终止MDI父窗体而导致MDI子窗体的终止。 5、Terminate(终止事件):在窗体的所有实例从内存中清除时发生,只触发一次。 方法: 1、Load:加载窗体,但不在屏幕上显示 2、Unload:卸载窗体,既从屏幕上也从内存中清除窗体。 3、Show:加载窗体并在屏幕上显示窗体。Show分为: 1)正常窗体:Form1.show 2)模式窗体(只能显示一个窗体):Form1.show.vbmodel 4、Hide:从屏幕上隐藏窗体,但是在内存中保存窗体的信息。 5、Move:移动窗体,必须有坐标值。 二、文本框(Text)属性: 1、Text:表示文本框里的文本。如:Text1.Text=”APPLE” 2、MaxLength:给定一个整数,表示文本框最多可以输入几个字符(英文与汉字长度一样,都占一个字节)。 3、PasswordChar: 显示密码时使用。 4、Locked: 值为True: 用户不可以编辑文本框中的文本。 False:文本框中的文本可以更改。 5、MultiLine: 值为True:文本可以显示在多行。 False:文本只能显示在一行。 6、BackColor:文本框的背景颜色。 7、BorderStyle:设置文本框的样式,有两个值(上机试一下)。 8、Font:设置文本中的字体。 9、ForeColor:设置文本框中字体的颜色。 事件 1、Click:点击文本框时发生。 2、Change:当文本框中的文本发生变化时发生。 3、LostFocus:当文本框失去焦点时发生。

工作中最常用的excel函数公式大全

工作中最常用的excel函数公式大全 一、数字处理 1、取绝对值=ABS(数字) 2、取整=INT(数字) 3、四舍五入=ROUND(数字,小数位数) 二、判断公式 1、把公式产生的错误值显示为空 公式:C2=IFERROR(A2/B2,"") 说明:如果是错误值则显示为空,否则正常显示。 2、IF多条件判断返回值公式: C2=IF(AND(A2<500,B2="未到期"),"补款","") 说明:两个条件同时成立用AND,任一个成立用OR函数。

1、统计两个表格重复的内容 公式:B2=COUNTIF(Sheet15!A:A,A2) 说明:如果返回值大于0说明在另一个表中存在,0则不存在。 2、统计不重复的总人数 公式:C2=SUMPRODUCT(1/COUNTIF(A2:A8,A2:A8)) 说明:用COUNTIF统计出每人的出现次数,用1除的方式把出现次数变成分母,然后相加。

1、隔列求和 公式:H3=SUMIF($A$2:$G$2,H$2,A3:G3) 或=SUMPRODUCT((MOD(COLUMN(B3:G3),2)=0)*B3:G3) 说明:如果标题行没有规则用第2个公式 2、单条件求和 公式:F2=SUMIF(A:A,E2,C:C) 说明:SUMIF函数的基本用法

3、单条件模糊求和 公式:详见下图 说明:如果需要进行模糊求和,就需要掌握通配符的使用,其中星号是表示任意多个字符,如"*A*"就表示a前和后有任意多个字符,即包含A。 4、多条件模糊求和 公式:C11=SUMIFS(C2:C7,A2:A7,A11&"*",B2:B7,B11) 说明:在sumifs中可以使用通配符*

数据库常用函数

数据库常用函数

一、基础 1、说明:创建数据库 CREATE DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份和还原 备份:exp dsscount/sa@dsscount owner=dsscount file=C:\dsscount_data_backup\dsscount.dmp log=C:\dsscount_data_backup\outputa.log 还原:imp dsscount/sa@dsscount file=C:\dsscount_data_backup\dsscount.dmp full=y ignore=y log=C:\dsscount_data_backup\dsscount.log statistics=none 4、说明:创建新表 create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) CREATE TABLE ceshi(id INT not null identity(1,1) PRIMARY KEY,NAME VARCHAR(50),age INT) id为主键,不为空,自增长 根据已有的表创建新表: A:create table tab_new like tab_old (使用旧表创建新表) B:create table tab_new as select col1,col2… from tab_old definition only 5、说明:删除新表 drop table tabname 6、说明:增加一个列 Alter table tabname add column col type 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。 7、说明:添加主键: Alter table tabname add primary key(col) 说明:删除主键: Alter table tabname drop primary key(col) 8、说明:创建索引:create [unique] index idxname on tabname(col….) 删除索引:drop index idxname 注:索引是不可更改的,想更改必须删除重新建。 9、说明:创建视图:create view viewname as select statement 删除视图:drop view viewname 10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1=value1 where 范围

C builder教程大全

BorlandC++Builder5.0是Interpries(Borland)公司推出的基于C++语言的快速应用程序开发(RapidApplicationDevelopment,RAD)工具,它是最先进的开发应用程序的组件思想和面向对象的高效语言C++融合的产物。C++Builder充分利用了已经发展成熟的Delphi的可视化组件库(VisualComponentLibrary,VCL),吸收了BorlandC++5.0这个优秀编译器的诸多优点。C++Builder结合了先进的基于组件的程序设计技术,成熟的可视化组件库和优秀编译器,调试器。发展到5.0版本,C++Builder已经成为一个非常成熟的可视化应用程序开发工具,功能强大而且效率高。 C++Builder的特色: 1.C++Builder是高性能的C++开发工具 C++Builder是基于C++的,它具有高速的编译,连接和执行速度。同时,C++Builder具有双编译器引擎,不仅可以编译C/C++程序,还能编译ObjectPascal语言程序。 2.C++Builder是优秀的可视化应用程序开发工具 C++Builder是一完善的可视化应用程序开发工具,使程序员从繁重的代码编写中解放出来,使他们能将注意力重点放在程序的设计上,而不是简单的重复的劳动中。同时,它提供的完全可视的程序界面开发工具,从而使程序员对开发工具的学习周期大大缩短。 3.C++Builder具有强大的数据库应用程序开发功能 C++Builder提供了强大的数据库处理功能,它使的程序员不用写一行代码就能开发出功能强大的数据库应用程序,这些主要依赖于C++Builder众多的数据库感知控件和底层的BDE数据库引擎。C++Builder除了支持Microsoft的ADO(ActiveDataObject)数据库连接技术,还提供了一种自己开发的成熟的数据库连接技术——BDE(BorlandDatabaseEngine)数据库引擎。

常用excel函数公式大全

常用的excel函数公式大全 一、数字处理 1、取绝对值 =ABS(数字) 2、取整 =INT(数字) 3、四舍五入 =ROUND(数字,小数位数) 二、判断公式 1、把公式产生的错误值显示为空 公式:C2 =IFERROR(A2/B2,"") 说明:如果是错误值则显示为空,否则正常显示。

2、IF多条件判断返回值 公式:C2 =IF(AND(A2<500,B2="未到期"),"补款","") 说明:两个条件同时成立用AND,任一个成立用OR函数。 三、统计公式 1、统计两个表格重复的内容 公式:B2 =COUNTIF(Sheet15!A:A,A2) 说明:如果返回值大于0说明在另一个表中存在,0则不存在。

2、统计不重复的总人数 公式:C2 =SUMPRODUCT(1/COUNTIF(A2:A8,A2:A8)) 说明:用COUNTIF统计出每人的出现次数,用1除的方式把出现次数变成分母,然后相加。 四、求和公式

1、隔列求和 公式:H3 =SUMIF($A$2:$G$2,H$2,A3:G3) 或 =SUMPRODUCT((MOD(COLUMN(B3:G3),2)=0)*B3:G3)说明:如果标题行没有规则用第2个公式 2、单条件求和 公式:F2 =SUMIF(A:A,E2,C:C) 说明:SUMIF函数的基本用法

3、单条件模糊求和 公式:详见下图 说明:如果需要进行模糊求和,就需要掌握通配符的使用,其中星号是表示任意多个字符,如"*A*"就表示a前和后有任意多个字符,即包含A。

4、多条件模糊求和 公式:C11 =SUMIFS(C2:C7,A2:A7,A11&"*",B2:B7,B11) 说明:在sumifs中可以使用通配符* 5、多表相同位置求和 公式:b2 =SUM(Sheet1:Sheet19!B2) 说明:在表中间删除或添加表后,公式结果会自动更新。 6、按日期和产品求和

窗体控件的属性

1. 窗体与控件 ● 窗体的重要属性 属性说明 Name窗体对象的名字,用于在代码中进行标示BackColor窗体的背景色 BackgroundImage窗体的背景图像 FormBorderStyle窗体的边框样式,有7个可选的值,默认是Sizable MaximizeBox确定窗体标题栏的右上角是否有最大化ShowInTaskbar确定窗体是否出现在Windows任务栏中StartPosition确定窗体第一次出现的位置 Text窗体标题栏中显示的文本 TopMost 只是窗体是否始终显示在此属性为TRUE的所有窗体之上,默认为False WindowState 确定窗体的初始化状态,包括Normal(普通),Maximized(最大化),Minimized(最小化) IsMiContatiner 设定窗体是否为父窗体 注: 子窗体.Mdiparent = this; 在菜单空间的MdiWindowListItem属性为窗口菜单项 事件 Load窗体加载事件MouseClick鼠标单击事件MouseDoubleClic k 鼠标双击事件MouseMove鼠标移动事件 KeyDown键盘按下事件 KeyUp键盘释放事件

●窗体方法 Close() 关闭窗口配合 Show() 显示窗口 ShowDialog() 模式化显示窗口 Hide() 隐藏窗体 ●标签的主要属性 Image 在标签上显示的图片 Text 在标签上显示的文本 ●文本框的主要属性 MaxLength 指定在文本框中输入的最大字符 Multiline 表示是否可在文本框中输入多行文本 PasswordChar 指定在做为密码框时,文本框中显示的字符,而不是实际输入的文本 ReadOniy 指定是否允许编辑文本框中的文本Text 与文本框关联的文本 ●组合框的主要属性 Items 组合框中的选项 DropDownStyle 定义组合框的风格,指示是否显示列表框部分,是否允许用户编辑文本框部分 Text 与组合框关联的文本 SelectedIndex 当前选定项目的索引号,列表框中的每个项都有一个索引号,从0开始 SelectedItem 获取当前选定的项●按钮的主要属性和事件 Enabe 布尔值,表示控件是否可用。True表示可用,False表示不可用,如果控件不可用,运行后显示为灰色 Text 按钮上显示的文本TextAlign 按钮上文本显示对齐方式

16种常用数据分析方法66337

一、描述统计 描述性统计是指运用制表和分类,图形以及计筠概括性数据来描述数据的集中趋势、离散趋势、偏度、峰度。 1、缺失值填充:常用方法:剔除法、均值法、最小邻居法、比率回归法、决策树法。 2、正态性检验:很多统计方法都要求数值服从或近似服从正态分布,所以之前需要进行正态性检验。常用方法:非参数检验的K-量检验、P-P图、Q-Q图、W检验、动差法。 二、假设检验 1、参数检验 参数检验是在已知总体分布的条件下(一股要求总体服从正态分布)对一些主要的参数(如均值、百分数、方差、相关系数等)进行的检验。 1)U验使用条件:当样本含量n较大时,样本值符合正态分布 2)T检验使用条件:当样本含量n较小时,样本值符合正态分布 A 单样本t检验:推断该样本来自的总体均数μ与已知的某一总体均数μ0 (常为理论值或标准值)有无差别; B 配对样本t检验:当总体均数未知时,且两个样本可以配对,同对中的两者在可能会影响处理效果的各种条件方面扱为相似; C 两独立样本t检验:无法找到在各方面极为相似的两样本作配对比较时使用。 2、非参数检验 非参数检验则不考虑总体分布是否已知,常常也不是针对总体参数,而是针对总体的某些一股性假设(如总体分布的位罝是否相同,总体分布是否正态)进行检验。 适用情况:顺序类型的数据资料,这类数据的分布形态一般是未知的。

A 虽然是连续数据,但总体分布形态未知或者非正态; B 体分布虽然正态,数据也是连续类型,但样本容量极小,如10以下; 主要方法包括:卡方检验、秩和检验、二项检验、游程检验、K-量检验等。 三、信度分析 检査测量的可信度,例如调查问卷的真实性。 分类: 1、外在信度:不同时间测量时量表的一致性程度,常用方法重测信度 2、内在信度;每个量表是否测量到单一的概念,同时组成两表的内在体项一致性如 何,常用方法分半信度。 四、列联表分析 用于分析离散变量或定型变量之间是否存在相关。 对于二维表,可进行卡方检验,对于三维表,可作Mentel-Hanszel分层分析。列联表分析还包括配对计数资料的卡方检验、行列均为顺序变量的相关检验。 五、相关分析 研究现象之间是否存在某种依存关系,对具体有依存关系的现象探讨相关方向及相关程度。 1、单相关:两个因素之间的相关关系叫单相关,即研究时只涉及一个自变量和一个因变量; 2、复相关:三个或三个以上因素的相关关系叫复相关,即研究时涉及两个或两个以上的自变量和因变量相关; 3、偏相关:在某一现象与多种现象相关的场合,当假定其他变量不变时,其中两个变量之间的相关关系称为偏相关。 六、方差分析

cbuilder常用函数汇总

c b u i l d e r常用函数汇总 The Standardization Office was revised on the afternoon o f December 13, 2020

c++ builder 常用函数汇总 对话框类函数 打开对话框: if(OpenDialog1->Execute()) { Memo1->Lines->LoadFromFile(OpenDialog1->FileName); } 保存对话框: if(SaveDialog1->Execute()) { Memo1->Lines->SaveToFile(SaveDialog1->FileName); } 其它常用函数 ShowMessage(s);_str(); ShowMessage(s); } //--------------------------------------------------------------------------- SubString(index,count)//字符串裁减函数 Index为字符串的序号,从1开始,count为要裁减的长度,如:String s=Edit1->Text; ShowMessage(1,2)); IntToHex(n1,n2)//十进制转16进制,n1为要转换的数, n2为转换的16进制的位数,如: int i=255; ShowMessage(IntToHex(i,2)); StrToInt(s)//字符串转数字,如: String s="1234";

int i=4321 + StrToInt(s); ShowMessage(i); IntToStr(n)//数字转字符串,如: int i=4321; String s="1234" + IntToStr(i); ShowMessage(s);

Microsoft Visual FoxPro 9.0控件属性详解

VFP表单及控件属性一览表 引用于:https://www.doczj.com/doc/8319129309.html,/club/showpost.asp?id=133720&t=o 本文引用以上网站的内容,经整理和制作成此Word文档,希望对各位有所帮助! A Activate Event 当表单集、表单或页对象激活时、或显示工具栏对象时发生。 ActiveControl 引用一个对象上的活动控件。 ActiveForm 引用表单集或_SCREEN对象中的活动表单对象。 Addobject 在运行时向容器对象中添加一个对象。 AddProperty 向对象添加新属性。 Alignment 控件上正文水平对齐方式。 AlwaysOnBottom 防止其他窗口被表单窗口覆盖。 AlwaysOnTop 防止其他窗口遮挡表单。 Autocenter 指定Form对象在首次显示时,是否自动在VFP主窗口内居中。 AutoSize 控件是否根据正文自动调整大小。

BackColor 指定对象内文本和图形的背景色。 BackStyle 设置背景风格。 BaseClass 指定VFP基类的类名,被引用对象由此基类派生得到。 BorderStyle 指定对象的边框样式。 Box 在表单对象上绘制矩形。 BufferMode 指定记录是保守式更新还是开放式更新。 C Caption 指定对象标题文本。 Circle 在表单上绘制圆或弧。 Class 返回派生对象的类的类名。 ClassLibrary 指定用户自定义类库的文件名,该类库包含对象的类。 Click Event 当用户在一个对象上按下并释放鼠标按钮时,或用编程方式触发该事件时发生ClipControls 指定在Paint事件中,图形方法程序是否会重画整个对象,并且是否创建将非图形控件排除在外的剪切区域。 Closable 指定能否通过双击窗口菜单图标来关闭表单。 Cls 清除表单中的图形和文本。 Color Source 指定控件颜色的设置方式。 Comment 存储对象的有关信息。 ContinuousScroll 指定表单是平滑地滚动还是只在释放滚动框后才重绘。 ControlBox 指定在运行时刻表单或工具栏的左上角是否显示菜单图标。 ControlCount 指定容器对象中控件的数目。 Controls 用于存取容器对象中控件的数组。 CurrentX 指定下一个绘图方法程序的水平坐标。 CurrentY 指定下一个绘图方法程序的垂直坐标。 D DataSession 指定表单、表单集或工具栏能否在自己的数据工作期中运行,并拥有独立的数据环境。 DataSessionID 返回数据工作期标识,该标识用于识别表单集、表单或工具栏的私有数据工作期Dblclick Event 当用户连续快速地按住并释放左(主)鼠标按钮时发生。 Deactivate Event 当一个容器对象如表单,由于其所含对象没有焦点而不再活动时发生。DefoleLCID 指定在此表单上创建的ActiveX控件和可插入对象的默认本地ID,如果该值为零,SYS(3004)将指定默认的本地ID。 Desktop 指定表单是否包含在VFP主窗口中。 Destroy Event 释放一个对象时发生。 DragDrop Event 当拖放操作完成时发生。 DragOver Event 当拖动到一个控件到目标对象上时发生。 Draw 重新绘制表单对象。 DrawMocle 与颜色属性共同指定形状或线条在屏幕上的显示方式。 DrawStyle 指定用图形方法程序绘制时使用的线条样式。 DrawWidth 指定用图形方法程序输出的线条宽度。

15个常用EXCEL函数,数据分析新人必备

15个常用EXCEL函数,数据分析新人必备 本文实际涵盖了15个Excel常用函数,但是按照分类只分了十类。 很难说哪十个函数就绝对最常用,但这么多年来人们的经验总结,一些函数总是会重复出现的。 这些函数是最基本的,但应用面却非常广,学会这些基本函数可以让工作事半功倍。 SUM 加法是最基本的数学运算之一。函数SUM就是用来承担这个任务的。SUM的参数可以是单个数字、一组数字,因此SUM的加法运算功能十分强大。 统计一个单元格区域: =sum(A1:A12) 统计多个单元格区域: =sum(A1:A12,B1:B12) AVERAGE 虽然Average是一个统计函数,但使用如此频繁,应在十大中占有一席之位。 我们都对平均数感兴趣。平均分是多少?平均工资是多少?平均高度是多少?看电视的平均小时是多少?

Average参数可以是数字,或者单元格区域。 使用一个单元格区域的语法结构: =AVERAGE(A1:A12) 使用多个单元格区域的语法结构: =AVERAGE(A1:A12,B1:B12) COUNT COUNT函数计算含有数字的单元格的个数。 注意COUNT函数不会将数字相加,而只是计算总共有多少个数字。因此含有10个数字的列表,COUNT函数返回的结果是10,不管这些数字的实际总和是多少。 COUNT函数参数可以是单元格、单元格引用,甚或数字本身。 COUNT函数会忽略非数字的值。例如,如果A1:A10是COUNT函数的参数,但是其中只有两个单元格含有数字,那么COUNT函数返回的值是2。 也可以使用单元格区域作为参数,如: =COUNT(A1:A12) 甚至是多个单元格区域,如: =COUNT(A1:A12,B1:B12) INT和ROUND INT函数和ROUND函数都是将一个数字的小数部分删除,两者的区别是如何删除小数部分。

ODBC_API常用函数介绍

ODBC API 常用函数诠释
作者: moonbreak, 出处:blog, 责任编辑: 唐小若,
2008-09-03 10:03
ODBC API 是一套复杂的函数集,可提供一些通用的接口,以便访问各种后台数据库。本 文详细介绍了 ODBC API 的常用十四个函数并列出在 PowerBuilder 中外部函数引用声明。 以下为 ODBC API 的常用十四个函数,先列出在 PowerBuilder 中外部函数引用声明:
nv(ref long phenv) library "odbc32.dll"
v(long henv) library "odbc32.dll"
ources(long henv,int fdirection,ref string szdsn,&
er pcbdsn,ref string szdescription,integer cbdescriptionmax,ref integer pcbdescription)library "odbc32.dll"
onnect(long henv,ref long hdbc)library "odbc32.dll"
ct (long hstmt,ref string szdsn,integer dsnlen,ref string
ng szpwd,integer pwdlen) library "odbc32.dll"
nect (long hdbc) library "odbc32.dll"
mt(long hdbc,ref long hstmt)library "odbc32.dll"
long hstmt,ref string sztablequalifier,integer tablequalifierlen,ref string szowner,integer owerlen,ref string szname,integ
pelen)library "odbc32.dll"
ns(long hstmt,ref string sztablequalifier,integer tablequalifierlen,ref string szowner,integer owerlen,ref string szname,in
pelen)library "odbc32.dll"
ol(long hstmt,integer colnum,integer datatype,ref string name,long maxlen,ref long actlen) library "odbc32.dll"
ong hstmt)library "odbc32.dll"
lenv,long hdbc,long hstmt,ref string sqlstate,ref long nativeerror,ref string errormsg,integer errormsgmax,ref integer e
mt(long hstmt,integer Options)library "odbc32.dll" 1、function integer SQLAllocEnv(ref long phenv) library "odbc32.dll" 、 参数: long phenv 引用传递的 long 类型参数, ref 保存该函数返回的 OBDC 环境的句柄。 存放在 phenv 中的值成为以后 OBDC API 函数调用的唯一标识符。 返回值:integer 成功时,返回 0,失败返回值小于 0。 函数功能:获取 ODBC 环境句柄。 2、function integer SQLAllocStmt(long hdbc,ref long hstmt)library 、 "odbc32.dll"

各个控件的属性

常用控件的属性和事件: 一、窗体form 1、name 2、caption 窗体的标题 3、height、width、left、top 窗体的大小和位置 4、backcolor 背景颜色 5、forecolor 前景色 6、font 文字的字体、字号和字形 7、enabled 对象是否有效 8、visible 对象是否可见 9、picture 背景图片 10、controlbox 是否显示窗体的控制菜单框 11、maxbuttom/minbuttom 窗体的最大/最小化按钮属性 12、borderstyle 决定窗体的边框样式6个属性值 13、icon 用于设置窗体左上角的图标??? 二、一般类控件的使用 1、命令按钮Command style 0 or 1 是否能显示背景色或图片 picture 显示按钮的背景图片 default 和cancel 一个设置默认按钮,一个设置取消按钮 caption 2、标签Label alignment 对齐方式 autosize 自动改变大小 caption backstyle 背景是否透明 borderstyle 决定标签的边框类型 3、文本框Textbox text Multiline 是否能输入或显示多行文本 Scrollbars 设置文本框是否具有滚动条只有在Multiline 为ture 才有效Locked 文本是否允许编辑 Passwordchar 用于设置文本框的替代显示字符。 三、选择类控件 1、框架Frame caption enabled visible forecolor backcolor 2、单选按钮和复选框Optionbuttom Checkbox value style

R数据分析常用包与函数

【收藏】R数据分析常用包与函数 2016-09-26 R语言作为入门槛较低的解释性编程语言,受到从事数据分析,数据挖掘工作人员的喜爱,在行业排名中一直保持较高的名次(经常排名第一),下面列出了可用于数据分析、挖掘的R包和函数的集合。 1、聚类 常用的包:fpc,cluster,pvclust,mclust 基于划分的方法: kmeans, pam, pamk, clara 基于层次的方法: hclust, pvclust, agnes, diana 基于模型的方法: mclust 基于密度的方法: dbscan 基于画图的方法: plotcluster, plot.hclust 基于验证的方法: cluster.stats 2、分类 常用的包: rpart,party,randomForest,rpartOrdinal,tree,marginTree, maptree,survival 决策树: rpart, ctree 随机森林: cforest, randomForest 回归, Logistic回归, Poisson回归: glm, predict, residuals 生存分析: survfit, survdiff, coxph 3、关联规则与频繁项集 常用的包: arules:支持挖掘频繁项集,最大频繁项集,频繁闭项目集和关联规则 DRM:回归和分类数据的重复关联模型 APRIORI算法,广度RST算法:apriori, drm ECLAT算法:采用等价类,RST深度搜索和集合的交集:eclat 4、序列模式 常用的包:arulesSequences SPADE算法:cSPADE 5、时间序列 常用的包:timsac 时间序列构建函数:ts 成分分解: decomp, decompose, stl, tsr 6、统计 常用的包:Base R, nlme 方差分析: aov, anova 假设检验: t.test, prop.test, anova, aov

相关主题
文本预览
相关文档 最新文档