转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
发送电子邮件         ★★★★

发送电子邮件

作者:闵涛 文章来源:闵涛的学习笔记 点击数:2829 更新时间:2009/4/23 18:35:31
其为-1时表示第二个域起作用。第二个域用字符串表示进度信息,其格式为<String><:><Value>,比如:RecordsCopied:125
本文主要在回调函数中完成两个工作:
1)显示数据拷贝(BatchMove)进度
2)提供让用户终止长时间拷贝的机制
显示拷贝进度的代码如下:
CBRType__stdcallApiCallBackFun(
CBTypeecbType,  //Callbacktype
Int iClientData, //Clientcallbackdata
void*pCbInfo //Callbackinfo/Client
) {
AnsiString str;
if(ecbType==cbGENPROGRESS){
intj=StrToInt(((CBPROGRESSDesc*)pCbInfo)->iPercentDone);
if(j<0) { //如果iPercentDone为-1,则分析szMsg的信息
str=((CBPROGRESSDesc*)pCbInfo)->szMsg;intpos=str.AnsiPos(":")+1; //提取出拷贝的记录数
//下面的代码用来在一个Form中显示拷贝进度及拷贝数量Form1->Label2->Caption=str.SubString(pos,100);
Form1->Label2->Update();
Form1->ProgressBar1->Position=int((str.SubString(pos,100).ToDouble()/Form1->TransNum)*100);
Form1->ProgressBar1->Update();
}else{
Form1->ProgressBar1->Position=j;Form1->ProgressBar1->Update();
}
return  cbrCONTINUE;
//必须返回cbrCONTINUE以便让BatchMove继续,若返回cbrABORT则终止拷贝
}
}
一切完成以后,每当调用长时间BDE操作(比如BatchMove1->Exectue())时都会触发该回调函数,注意在不需要时应"注销"这个回调函数。
如果批量传送数据时间很长,则必须为用户提供终止该操作的机会,前面提到,若回调函数返回cbrABORT,则BatchMove过程立即终止。可以在Form上加上一个"停止"按钮和一个全局布尔变量isContinue,当开始拷贝时设该变量为true,当按钮按下后,设该变量为false,每次调用回调函数时检查isContinue的值,若为true则回调函数返回cbrCONTINUE让拷贝继续,否则返回cbrABORT终止拷贝。但是问题在于一旦拷贝过程开始,该进程内所有消息将被阻塞,应用程序在拷贝结束之前没有机会响应键盘、鼠标等一切消息,连屏幕刷新都不能完成,因此必须找到一种避免消息阻塞的方法。
大家知道,Windows是靠事件(消息)驱动的,在WIN32系统中有两种消息队列:系统队列和应用程序队列,当一个程序进行一个长时间操作时,系统分配给该程序的时间片将完全用于处理该操作,换句话说,应用程序没有从它的应用程序队列中取出消息并处理的机会,这样该程序将停止一切对外部事件的响应直到该操作完成为止。具体到本文中就是程序必须等到BatchMove1->Execute()执行完毕后才能响应用户操作,因此用户将完全没有机会终止拷贝过程。
解决的办法是:在回调函数中取出消息队列中的消息,并后台处理它们,这样用户将有机会按下终止按钮。实现的代码很简单,在回调函数中最后加入以下代码即可
CBRType__stdcallApiCallBackFun(…){
……MSGamsg;
while(PeekMessage(&amsg,NULL,0,0,PM_REMOVE)) {//从队列中取消息
TranslateMessage(&amsg);//翻译消息
DispatchMessage(&amsg);//分发消息
}
if(isContinue)
return cbrCONTINUE;
else
returncbrABORT;
}

软件封面的实现

1.先设置两个窗体Form1 Form2其中Form1为主窗体,Form2为动态调用窗体
在工程文件Project1.cpp中加入如下代码: 
#include <vcl.h>
#include "Unit2.h"
#pragma hdrstop

USERES("Project1.res");
USEFORM("Unit1.cpp", Form1);
USEFORM("Unit2.cpp", Form2);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try{
Application->Initialize();
Form2 = new TForm2(Application);
Form2->Show();
Form2->Update();
Application->CreateForm(__classid(TForm1), &Form1);
delete Form2;
Application->Run();
}
catch (Exception &exception){
Application->ShowException(&exception);
}
return 0;
}
2.然后在主窗体unit1.cpp中加入下面代码:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
unsigned long CurTime;
unsigned long DelayTime;
// 设置延迟时间为5秒
DelayTime = 5000;
CurTime = GetTickCount();
// 在这儿可以加上应用程序的初始化过程
unsigned long Inter;
do{
Inter = GetTickCount()-CurTime;
Form2->ProgressBar1->Position = Inter*100.0/DelayTime;
} while( Inter<DelayTime );
}

在BCB中显示2000新式对话框

我自己测试了一下,在2000和xp下能显示新式对话框,不过不能使用bcb中的组件,只能自己调用api函数,再一次说明了api函数的强大.我的程序如下,希望大家指教.
//main.h
//---------------------------------------------------------------------------
#ifndef mainH
#define mainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Dialogs.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
  TButton *Button1;
  TPanel *Panel1;
  TMemo *Memo1;
  TPanel *Panel2;
  TGroupBox *GroupBox1;
  TCheckBox *CheckBox1;
  TButton *Button2;
  void __fastcall Button1Click(TObject *Sender);
  void __fastcall FormCreate(TObject *Sender);
  void __fastcall FormDestroy(TObject *Sender);
  void __fastcall Button2Click(TObject *Sender);
  void __fastcall CheckBox1Click(TObject *Sender);
private: // User declarations
public: // User declarations
  LPOPENFILENAMEA   pOpenFile;
   BYTE         *pBuf;
  __fastcall TForm1(TComponent* Owner);
  void __fastcall DisplayInMemo(String str);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
 
//main.c
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  String str;
  BOOL  bReturn = GetOpenFileName(pOpenFile);
  if(bReturn)
  {
     str.sprintf("您选择的文件为%s",pOpenFile->lpstrFile);
    DisplayInMemo(str);
  }else{
    str.sprintf("您没有选择的文件");
    DisplayInMemo(str);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  String str;
  pBuf =(BYTE *)malloc(1024);
  memset(pBuf,0,1024);
  pBuf = "*.txt";
  pOpenFile = (LPOPENFILENAMEA)malloc(sizeof(OPENFILENAMEA));
  memset(pOpenFile,0,sizeof(OPENFILENAMEA));
  pOpenFile->lStructSize = sizeof(OPENFILENAMEA);
  pOpenFile->hwndOwner = Handle;
  pOpenFile->hInstance = HInstance;
  pOpenFile->lpstrFilter = "文本文件(*.txt)";
  pOpenFile->nFilterIndex = 0;
  pOpenFile->nMaxFile = 255;
  pOpenFile->Flags = OFN_EXPLORER;
  pOpenFile->lpstrFile = pBuf;
  pOpenFile->lpstrTitle = "我的文件对话框";
  pOpenFile->lpstrInitialDir = ".\\";
  //pOpenFile->
  str.sprintf("显示2000样式对话框演示");
  DisplayInMemo(str);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
  free((void *)pOpenFile);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DisplayInMemo(String str)
{
  if(Memo1->Lines->Count > 100){
     Memo1->Lines->Clear();
  }
  Memo1->Text = str + char(13) + char(10) + Memo1->Text;
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  Close();  
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CheckBox1Click(TObject *Sender)
{
  if(CheckBox1->Checked){
    pOpenFile->Flags |= OFN_READONLY;
  }else{
    pOpenFile->Flags &= !OFN_READONLY;
  }
}
//---------------------------------------------------------------------------
在bcb5测试通过.

如何屏蔽系统ALT+F4

第一步:在你的密码窗口的头文件的 public部分加上以下两段代码:
//这是自定义响应消息的函数:
void __fastcall OnCloseForm(TMessage Message);
//定义一个消息域:
BEGIN_MESSAGE_MAP
 MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, OnCloseForm)
END_MESSAGE_MAP(TForm)
第二步:在密码窗口的代码中增加此函数的实现:(注 TfWelcome 是密码窗口的名字,改成你自己的密码窗口名称)
void __fastcall TfWelcome::OnCloseForm(TMessage Message)
{
if(Message.WParam==SC_CLOSE){
   //此消息拦截是为了防止用户关闭登录窗口 。
   if(Application->MessageBox(" 您确实要关闭本系统?”。","金浪软件提醒",48|1)==1){
   Application->Terminate();//如果用户选择“是”,就关闭整个程序。
  }
}
}
说明:这样用户无论如何都关不了你的密码窗口了,要关就把整个程序关了。

调用API函数NetBios来获得网卡物理地址

本程序是调用API函数NetBios来获得网卡物理地址的。

//Get MAC Address
//Proto: bool MAC(char *Mac);
//return: true if success and Mac is MAC address,
// false if fail.
//
bool MAC(char *Mac)
{
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, *PASTAT;

ASTAT Adapter;

NCB ncb;
UCHAR uRetCode;
char tmp[40];
Mac[0]=''''\0'''';
memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = 0;
uRetCode = Netbios( &ncb );
if (uRetCode!=0)
  {
  strcat(Mac,"Init Error!");
  return false;
  }
memset(&ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = 0;
strcpy((char *)ncb.ncb_callname, "* " );//这个"*"代表获

上一页  [1] [2] [3] [4]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台