posts - 131, comments - 12, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

一、对话框中显示对话框的方法:
1、首先创建要在对话框里显示的那个对话框,命名为:IDD_INNER。
设置这个对话框的属性:
1)、“Style”选择“Child”;中文版“样式”选择“下层”。
2)、“Border”为“None”;中文版“边框”选择“无”。
 
2、为了显示时能够准确定位,我们可以在右边要显示对话框的地方放入一个Pic控件,命名为:IDC_STATIC_RECT,Visible属性去掉。
 
3、得到Pic控件客户区坐标
//CDlgParent.cpp ——OnInitDialog()
CRect rect;
GetDlgItem_r(IDC_STATIC_RECT)-> GetWindowRect_r(&rect);
ScreenToClient(&rect);   //千万注意别用成ClientToScreen(&rect);
 
4、创建并显示对话框
方式一:
//CDlgParent.h
CDialog m_InnerDlg;
//CDlgParent.cpp——OnInitDialog()
m_InnerDlg.Create(IDD_INNER, this);
m_InnerDlg.MoveWindow(rect.left, rect.top, rect.Width(), rect.Height());
m_InnerDlg.ShowWindow( SW_SHOW );
 
方式二:
//CDlgParent.h
CDialog *m_pInnerDlg;
 
//CDlgParent.cpp——OnInitDialog()
m_pInnerDlg = new CDialog();
m_pInnerDlg->Create(IDD_INNER, this);
m_pInnerDlg->MoveWindow(rect.left, rect.top, rect.Width(), rect.Height());
m_pInnerDlg->ShowWindow( SW_SHOW );
 
//CDlgParent.cpp——OnCancel()
delete m_pInnerDlg;
 
二、注意事项:
1、子对话框可以为“堆变量”或“父对话框成员”,但不能为OnInitDialog()内的局部变量(栈内变量),否则在退出OnInitDialog时,子对话框的析构函数会销毁窗口。
2、因为在一个界面里同时有两个甚至多个对话框,所以Tab Order必定存在冲突,这就导致:
如果Radio Button的Tab Order存在冲突,在点击Radio Button时,系统将不能根据Tab Order找到与其同组的其它Radio Button,这会导致程序崩溃。
注释:如果是想在子窗口中添加控件或者画图的话,就应该为子窗口添加一个类,则在初始化对象时应用该类初始化。如:CClidDlg m_pInnerDlg;

posted @ 2012-11-13 15:16 盛胜 阅读(576) | 评论 (0)编辑 收藏

第一步,新建对话框资源C****Dlg
第二步,右键该新建的C****Dlg视图给它添加C****Dlg类,类型CDialog
第三步,在原来的对话框 cpp文件中添加新类的头文件
第四步,在原来的对话框中添加button,在button的单击事件中添加代码

         C****Dlg  ***dlg;//创建类的对象
         CDialog::OnCancel();//关闭当前窗口
***dlg.DoModal();//打开新的对话框

posted @ 2012-11-13 10:57 盛胜 阅读(369) | 评论 (0)编辑 收藏

@ECHO 正在安装数据库....
copy "****.sql" "C:\Program Files\MySQL\MySQL Server 5.5\bin\****.sql"
cd C:\Program Files\MySQL\MySQL Server 5.5\bin
mysql   -f   -h   localhost   -u   root   -proot   test   <****.sql> c:\db.log
@ECHO 安装完毕 
pause

posted @ 2012-11-12 11:57 盛胜 阅读(199) | 评论 (0)编辑 收藏

     摘要: 现在正做一个接口,通过不同的连接字符串操作不同的数据库。要用到mysql数据库,以前没用过这个数据库,用access和sql server比较多。通过网上的一些资料和自己的摸索,大致清楚了C++连接mysql的方法。可以通过2种方法实现。第一种方法是利用ADO连接,第二种方法是利用mysql自己的api函数进行连接。第一种方法可以实现我当前的需求,通过连接不同的字符串来连接不同的数据库。暂时只连接...  阅读全文

posted @ 2012-11-12 09:44 盛胜 阅读(423) | 评论 (1)编辑 收藏

ShellExecute(   
hWnd: HWND;     {指定父窗口句柄}
Operation: PChar;  {指定动作, 譬如: open、print}  
FileName: PChar;  {指定要打开的文件或程序}  
Parameters: PChar; {给要打开的程序指定参数; 如果打开的是文件这里应该是 nil}  
Directory: PChar;  {缺省目录}  
ShowCmd: Integer  {打开选项}
): HINST;  {执行成功会返回应用程序句柄; 如果这个值 <= 32, 表示执行错误} //返回值可能的错误有:
= 0  {内存不足} ERROR_FILE_NOT_FOUND 
= 2;  {文件名错误} ERROR_PATH_NOT_FOUND 
= 3;  {路径名错误} ERROR_BAD_FORMAT     
= 11; {EXE 文件无效} SE_ERR_SHARE         
= 26; {发生共享错误} SE_ERR_ASSOCINCOMPLETE
= 27; {文件名不完全或无效} SE_ERR_DDETIMEOUT     
= 28; {超时} SE_ERR_DDEFAIL       
= 29; {DDE 事务失败} SE_ERR_DDEBUSY       
= 30; {正在处理其他 DDE 事务而不能完成该 DDE 事务} SE_ERR_NOASSOC       
= 31; {没有相关联的应用程序}
//ShowCmd 参数可选值:
SW_HIDE = 0;  {隐藏}
SW_SHOWNORMAL = 1; {用最近的大小和位置显示, 激活}
SW_NORMAL          = 1;  {同 SW_SHOWNORMAL}
SW_SHOWMINIMIZED  = 2;  {最小化, 激活}
SW_SHOWMAXIMIZED  = 3;  {最大化, 激活}
SW_MAXIMIZE        = 3;  {同 SW_SHOWMAXIMIZED}
SW_SHOWNOACTIVATE  = 4;  {用最近的大小和位置显示, 不激活}
SW_SHOW            = 5;  {同 SW_SHOWNORMAL}
SW_MINIMIZE        = 6;  {最小化, 不激活}
SW_SHOWMINNOACTIVE = 7;  {同 SW_MINIMIZE}
SW_SHOWNA          = 8;  {同 SW_SHOWNOACTIVATE}
SW_RESTORE        = 9;  {同 SW_SHOWNORMAL}
SW_SHOWDEFAULT    = 10; {同 SW_SHOWNORMAL}
SW_MAX            = 10; {同 SW_SHOWNORMAL}
//举例说明更多问题(别忘了 uses ShellAPI;): {譬如用记事本打开一个文件} begin   ShellExecute(Handle, 'open', 'notepad.exe', 'C:\WINDOWS\SchedLgU.Txt', nil, SW_SHOWNORMAL); end;
{第一个参数是用来当作错误提示窗口的父窗口的, 不能是 nil, 可以是 0(也就是桌面窗口)} begin   ShellExecute(0, 'open', 'notepad.exe', 'C:\WINDOWS\SchedLgU.Txt', nil, SW_SHOWNORMAL); end;
{第二个参数如果是 nil, 也会默认位 open} begin   ShellExecute(0, nil, 'notepad.exe', 'C:\WINDOWS\SchedLgU.Txt', nil, SW_SHOWNORMAL); end;
{文件路径可以放在参数五} begin   ShellExecute(0, nil, 'notepad.exe', 'SchedLgU.Txt', 'C:\WINDOWS', SW_SHOWNORMAL); end;
{把参数三直接指定为要打开的文件, 文件将用对应默认程序打开; 次数参数四应为 nil} begin   ShellExecute(0, nil, 'SchedLgU.Txt', nil, 'C:\WINDOWS', SW_SHOWNORMAL); end;
{如果文件在: 程序目录/当前目录/System32/Windows/PATH环境变量中, 参数五也可以 nil} begin   ShellExecute(0, nil, 'SchedLgU.Txt', nil, nil, SW_SHOWNORMAL); end;
{如果参数三是个文件, 可以用参数二命令打印} begin   ShellExecute(0, 'print', 'SchedLgU.Txt', nil, nil, 1); end;
{用 IE 打开网页} begin   ShellExecute(Handle, 'open', 'IExplore.EXE', 'about:blank', nil, SW_SHOWNORMAL); end;
{用火狐打开网页} begin   ShellExecute(Handle, 'open', 'firefox.exe', 'about:blank', nil, SW_SHOWNORMAL); end;
{用默认浏览器打开网页} begin   ShellExecute(Handle, 'open', 'Explorer.exe', 'about:blank', nil, SW_SHOWNORMAL); end;
{还是用默认浏览器打开网页} begin   ShellExecute(0, nil, 'http://del.cnblogs.com', nil, nil, 1); end;

posted @ 2012-11-09 15:16 盛胜 阅读(312) | 评论 (0)编辑 收藏

步骤

1. 开始

   网上说一般的打包工程选择Basic MSI Project,如果需要对界面需要进行很高的定制就需要选择InstallScript MSI Project。

由于我只需要打包,已经执行部分脚本因此我选择了Basic MSI Project。输入Project Name,选择Location后点击OK,新建工程。

进入到下图界面,此时我们可以选择两种打包方式(红框处选择)

1.Project Assistant   可以进行简单的类似向导类的配置即可进行打包工作,如果选择这种方式,Visual Studio自带的工具也能轻松实现

2.Installation Designer 完全自由化的配置,自我定制程度最高。

根据需求情况,我自然选择第二种方式

2.配置

点选Installation Designer,进入如下界面

image

红框处就是需要选择配置的区域了。

 

2.1 General Information

在Installation Information中选择General Information,在这里配置软件的基本信息

image

红线处你可以写上你的大名,你是这个Project的作者

下面的Setup Langueages可以选择安装语言,我这里只考虑了简体中文,故未更改设置。

R0(NKEJLG6%FKR7[GF~[6EI

红框里填写上你公司的名字和网址,我举个例子才写的这两个

image

在Product Properties中填入软件的信息,软件的名字、版本什么的。

INSTALLDIR是指安装目录,图中的配置方法默认是指这个路径: C:/Program Files/Transformers/Demo

 

2.2 Files

003 File and Folders

右边的区域被分成了四块,上面两块是本地计算机,下面两块是目标计算机

总的思路跟资源管理一样,这里你就可以按照你自己的思路来定制了

举个列子,我随便找点东西打包

在Destination computer’s folders中把树展开,选中Demo[INSTALLDIR],这是什么东西相信看看就明白了,如果不明白的话那就需要再学习下基础知识了。

从Source computer‘s files(本地计算机)中拖动一些文件到Destination computer’s files中,就会弹出如下提示

image

你需要创建一个Feature,什么是Feature我不太清楚,我把它理解成一个文件的集合。输入名字,我输入的是Main,点击OK

image

(如果你看不到上图中左边红框内的东西,就在那里的树状结构任意节点点击右键,勾选Show Components就能看到了)

当你把你想打包的东西添加进入过后,一个最基本的包就打好了,已经可以编译执行尝试安装了。

image

工具栏上的图标编译跟执行跟VC++6.0的图标是一样的吧,第三个红圈就是卸载

 

当然只做到这一步是不能满足我的需求的,我还需要添加一个数据库文件夹,在Demo[INSTALLDIR]上点击右键——选择New Folder——命名为Database

进行图中操作

image

直接点击下一步,到第二步,按图中操作

image

再下一步,将数据库相关文件都添加进去,当然你可以先添加一个文件(夹)进去,其余的在“Files and Folders”中继续添加。

至此,数据库文件也添加到了安装包内,不过默认的安装流程中只有选择主程序的安装路径没有选择数据库的路径,因此需要手动添加。

方法见2.3

 

2.3 Sequences

大家应该都安装过软件,最菜的人也知道一路点击“下一步”来安装程序。这部分就讲一下如何定制安装的顺序,就是“上一步”与“下一步”的跳转。

image

最左边选择Custom Actions and Sequences后,在中间的树中如图操作,User Interface上点击右键——Insert…

image

点击OK后Sequences树中多了个DatabaseFolder,可以拖动他到想要的位置。

当然Sequences的编辑还没那么简单,貌似通过拖动无法实现,需要对每个窗体进行编辑。

image

如图所示,图中的意思就是在选择DatabaseFolder的路径的对话框中,点击“上一步”按钮会跳转到CustomerInformation这个对话框中

就是这样编辑,工作量也不小,或者是有其他什么简便方法,可是我不知道

 

2.4 动态修改XML或者INI文件

在这个项目中,我需要将项目的安装路径写在安装目录下的一个ini文件中,这个ini文件是需要打包在项目中的。

image

首先确保ini文件已经添加进入打包工程。

image

在INI File Changes中新建一个与欲改写的ini文件同名的ini文件——my.ini

在my.ini文件下建立欲改写的section(我的例子是installdir)以及keyword(例子中是dir),编辑keword

在Data Value中写入系统变量[INSTALLDIR],这个就表示程序的安装目录。如果要获取数据库的安装目录就可以写入[DATABASEDIR]

XML的修改跟这个类似,相信都可以融会贯通。

在我的实际项目中,遇到个问题。

my.ini是mysql要用到的东西,是放在数据库目录中的,安装上面的方法略加修改就可以实现。

但是mysql需要的路径类似于C:/MyDataBase/MySql/

而通过我上面方法[DATABASEDIR]获得的路径是Windows标准的 C:/MyDataBase/MySql/

因此我必须要把这个斜线给反过来,我不知道怎么反。只知道可能通过脚本来修改(如果有高人知道简便方法,请指点)

脚本见2.5

 

2.5 InstallScript

 

刚刚接触,我连在哪里写脚本都不知道,跟别说如何写脚本了,虽然我现在也不会写脚本~~(求教啊)

虽然还不会写脚本,还是先把在哪里写以及如何运行脚本写出来,希望有跟我有同样问题的朋友看到。

image

然后出现下图

image

右边是编辑区,用于写脚本。有编程经验的话这个不难理解

脚本的执行回到Custom Actions and Sequences,在中间的列表中的Custom Actions上点击右键,选择Custom Actions Wizard

在Action Type中选择Run InstallScript code,在Insert into Sequence中的Install Execute Sequence处选择何时执行,其余按向导提示操作。


#include "ifx.h"
  
    export prototype ProcessAfterDataMove(HWND);  
    export prototype STRING ReplaceStr(STRING);    
    export prototype RunBat(STRING);

function ProcessAfterDataMove(hMSI)  
   STRING P_Dir,DB_Dir; // P_Dir是主程序目录下ini文件的路径,DB_Dir是数据库的路径
begin            
   P_Dir = TARGETDIR "temp.ini"//TARGETDIR是系统变量,存放安装路径
   //GetProfString()函数是系统函数,用于读取ini文件中的信息
   //第一个参数指定文件所在路径
   //第二个参数指定section名
   //第三个参数指定keyword名
   //最后一个参数用于 返回 前面指定的keyword的值。注意:是返回!  
   GetProfString (P_Dir, "temp""dir", DB_Dir);
   //ReplaceProfString()函数是系统函数,用于修改ini文件中keyword的值
   //第一个参数指定文件所在路径
   //第二个参数指定section名
   //第三个参数指定keyword名
   //第四个参数指定keyword原值
   //第五个参数指定keyword的新值
   //只有前面4个条件完全匹配时,原值才会被第五个参数中的新值替换                                                                                         
   ReplaceProfString (DB_Dir + "my.ini""mysqld""basedir""/"" + DB_Dir + "/"""/"" + ReplaceStr(DB_Dir) + "/"");
   ReplaceProfString (DB_Dir + "my.ini""mysqld", "datadir""/"" + DB_Dir + "Data/"", "/"" + ReplaceStr(DB_Dir + "Data") + "/"");
   //执行批处理
   RunBat(DB_Dir);
end;  
       
function STRING ReplaceStr(Str)
LIST StrList;
STRING temp,path;
begin
//创建List存放Tokens
   StrList = ListCreate(STRINGLIST);
//分解出Token存入List
   StrGetTokens( StrList, Str, "//");
   //取出TokenList的头节点
   ListGetFirstString(StrList, temp);
   //头节点后加入 “/”
   path = temp + "/";
   //循环 取出所有的节点 后面加入“/”
   while(ListGetNextString(StrList, temp) = 0)
       path = path + temp + "/";
   endwhile;
return path;   
end;       
       
       
function RunBat(DB_Dir)     //执行批处理     
STRING dir;              
begin
dir = DB_Dir + "bin//exec.bat" ;
//调用其他程序
//第一个参数是调用程序的位置
//第二个参数是调用程序运行所需参数
//WAIT表示等到执行完毕这个程序,安装再继续进行
LaunchAppAndWait(dir, "",WAIT);
end;

posted @ 2012-11-07 14:54 盛胜 阅读(306) | 评论 (0)编辑 收藏


创建文本插入符(MFC单文档),在OnCreate(LPCREATESTRUCT lpCreateStruct)函数中创建
      //下面调用的gettextmetrics成员函数是在CClienDC类中的
CClientDC dc(this);
//TEXTMETRIC结构体包含设备描述表中当前字体的度量信息
TEXTMETRIC tm;
//Gettextmetrics成员函数可以得到设备描述表中当前字体的度量信息
dc.GetTextMetrics(&tm);
CreateSolidCaret(tm.tmAveCharWidth/1,tm.tmHeight);
ShowCaret();

要在OnCreate()函数的头文件中添加
private:
CBitmap bitmap;

再在OnCreate()函数中添加
bitmap.LoadBitmap(IDB_BITMAP1);
CreateCaret(&bitmap);
ShowCaret();

posted @ 2012-11-06 11:05 盛胜 阅读(449) | 评论 (0)编辑 收藏

MYSQL数据库中有字段类型为bigint(20);
MFC中定义该字段类型时用__int64

posted @ 2012-11-01 15:21 盛胜 阅读(114) | 评论 (0)编辑 收藏

vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
为了可以使用vector,必须在你的头文件中包含下面的代码:
#include <vector>
vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:
using std::vector;
vector<int> vInts;
 或者连在一起,使用全名:
std::vector<int> vInts;
 
   建议使用全局的命名域方式:usingnamespace std;     
函数 
表述   
c.assign(beg,end)
c.assign(n,elem) 将[beg; end)区间中的数据赋值给c。
将n个elem的拷贝赋值给c。   
c.at(idx) 传回索引idx所指的数据,如果idx越界,抛出out_of_range。   
c.back() 传回最后一个数据,不检查这个数据是否存在。   
c.begin() 传回迭代器中的第一个数据地址。   
c.capacity() 返回容器中数据个数。   
c.clear() 移除容器中所有数据。   
c.empty() 判断容器是否为空。   
c.end() 指向迭代器中的最后一个数据地址。   
c.erase(pos)
c.erase(beg,end) 删除pos位置的数据,传回下一个数据的位置。
删除[beg,end)区间的数据,传回下一个数据的位置。   
c.front() 传回第一个数据。   
get_allocator 使用构造函数返回一个拷贝。   
c.insert(pos,elem) 
c.insert(pos,n,elem)
c.insert(pos,beg,end) 在pos位置插入一个elem拷贝,传回新数据位置。
在pos位置插入n个elem数据。无返回值。
在pos位置插入在[beg,end)区间的数据。无返回值。   
c.max_size() 返回容器中最大数据的数量。   
c.pop_back() 删除最后一个数据。   
c.push_back(elem) 在尾部加入一个数据。   
c.rbegin() 传回一个逆向队列的第一个数据。   
c.rend() 传回一个逆向队列的最后一个数据的下一个位置。   
c.resize(num) 重新指定队列的长度。   
c.reserve() 保留适当的容量。   
c.size() 返回容器中实际数据的个数。   
c1.swap(c2) 
swap(c1,c2) 将c1和c2元素互换。
同上操作。   
vector<Elem> c
vector<Elem> c1(c2)
vector <Elem> c(n)
vector <Elem> c(n, elem)
vector <Elem> c(beg,end)
c.~ vector <Elem>() 创建一个空的vector。
复制一个vector。
创建一个vector,含有n个数据,数据均已缺省构造产生。
创建一个含有n个elem拷贝的vector。
创建一个以[beg;end)区间的vector。
销毁所有数据,释放内存。   
  operator[] 返回容器中指定位置的一个引用。     
 

 
创建一个vector
vector容器提供了多种创建方法,下面介绍几种常用的。
创建一个Widget类型的空的vector对象:
vector<Widget> vWidgets;

创建一个包含500个Widget类型数据的vector:
vector<Widget> vWidgets(500);

 创建一个包含500个Widget类型数据的vector,并且都初始化为0:
vector<Widget> vWidgets(500, Widget(0));

 创建一个Widget的拷贝:
vector<Widget> vWidgetsFromAnother(vWidgets);

 
向vector添加一个数据
vector添加数据的缺省方法是push_back()。push_back()函数表示将数据添加到vector的尾部,并按需要来分配内存。例如:向vector<Widget>中添加10个数据,需要如下编写代码:
for(int i= 0;i<10; i++)
    vWidgets.push_back(Widget(i));

获取vector中制定位置的数据
vector里面的数据是动态分配的,使用push_back()的一系列分配空间常常决定于文件或一些数据源。如果想知道vector存放了多少数据,可以使用empty()。获取vector的大小,可以使用size()。例如,如果想获取一个vector v的大小,但不知道它是否为空,或者已经包含了数据,如果为空想设置为-1,你可以使用下面的代码实现:
int nSize = v.empty() ? -1 : static_cast<int>(v.size());

 
访问vector中的数据
使用两种方法来访问vector。
1、   vector::at()
2、   vector::operator[]
operator[]主要是为了与C语言进行兼容。它可以像C语言数组一样操作。但at()是我们的首选,因为at()进行了边界检查,如果访问超过了vector的范围,将抛出一个例外。由于operator[]容易造成一些错误,所有我们很少用它,下面进行验证一下:
分析下面的代码:
vector<int> v;
v.reserve(10);
 
for(int i=0; i<7; i++)
    v.push_back(i);
 
try
{
 int iVal1 = v[7]; // not bounds checked - will not throw
 int iVal2 = v.at(7); // bounds checked - will throw if out of range
}
catch(const exception& e)
{
 cout << e.what();
}

 
删除vector中的数据
vector能够非常容易地添加数据,也能很方便地取出数据,同样vector提供了erase(),pop_back(),clear()来删除数据,当删除数据时,应该知道要删除尾部的数据,或者是删除所有数据,还是个别的数据。
Remove_if()算法 如果要使用remove_if(),需要在头文件中包含如下代码::
#include <algorithm>

     Remove_if()有三个参数:
1、   iterator _First:指向第一个数据的迭代指针。
2、   iterator _Last:指向最后一个数据的迭代指针。
3、   predicate _Pred:一个可以对迭代操作的条件函数。
条件函数 条件函数是一个按照用户定义的条件返回是或否的结果,是最基本的函数指针,或是一个函数对象。这个函数对象需要支持所有的函数调用操作,重载operator()()操作。remove_if()是通过unary_function继承下来的,允许传递数据作为条件。
例如,假如想从一个vector<CString>中删除匹配的数据,如果字串中包含了一个值,从这个值开始,从这个值结束。首先应该建立一个数据结构来包含这些数据,类似代码如下:
#include <functional>
enum findmodes 
{
 FM_INVALID = 0,
 FM_IS,
 FM_STARTSWITH,
 FM_ENDSWITH,
 FM_CONTAINS
};
typedefstruct tagFindStr
{
 UINT iMode;
 CString szMatchStr;
} FindStr;
typedef FindStr* LPFINDSTR;

 
然后处理条件判断:
class FindMatchingString 
    : public std::unary_function<CString, bool> 
{
    
public: 
 FindMatchingString(const LPFINDSTR lpFS) : m_lpFS(lpFS) {} 
    
 bool operator()(CString& szStringToCompare) const
 { 
     bool retVal = false;
 
     switch(m_lpFS->iMode) 
     {
     case FM_IS: 
       { 
         retVal = (szStringToCompare == m_lpFDD->szMatchStr); 
         break;
       }
     case FM_STARTSWITH: 
       { 
         retVal = (szStringToCompare.Left(m_lpFDD->szMatchStr.GetLength())
               == m_lpFDD->szWindowTitle);
         break;
       } 
     case FM_ENDSWITH: 
       {
         retVal = (szStringToCompare.Right(m_lpFDD->szMatchStr.GetLength()) 
               == m_lpFDD->szMatchStr);
         break; 
       } 
     case FM_CONTAINS: 
       {
         retVal = (szStringToCompare.Find(m_lpFDD->szMatchStr) != -1);
         break; 
       }
     }
        
     return retVal;
 }
        
private: 
    LPFINDSTR m_lpFS;
};

 
通过这个操作你可以从vector中有效地删除数据:
FindStr fs;
fs.iMode = FM_CONTAINS;
fs.szMatchStr = szRemove;
 
vs.erase(std::remove_if(vs.begin(), vs.end(), FindMatchingString(&fs)), vs.end());

    Remove(),remove_if()等所有的移出操作都是建立在一个迭代范围上的,不能操作容器中的数据。所以在使用remove_if(),实际上操作的时容器里数据的上面的。
 
看到remove_if()实际上是根据条件对迭代地址进行了修改,在数据的后面存在一些残余的数据,那些需要删除的数据。剩下的数据的位置可能不是原来的数据,但他们是不知道的。
调用erase()来删除那些残余的数据。注意上面例子中通过erase()删除remove_if()的结果和vs.enc()范围的数据。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/willoj/archive/2008/04/05/2252543.aspx

posted @ 2012-10-31 10:19 盛胜 阅读(231) | 评论 (0)编辑 收藏

CString cdatetime;
CTime theCurrentTime=CTime::GetCurrentTime(); 
cdatetime=theCurrentTime.Format("%Y/%m/%d %H:%M:%S"); 

posted @ 2012-10-30 16:20 盛胜 阅读(143) | 评论 (0)编辑 收藏

仅列出标题
共14页: First 4 5 6 7 8 9 10 11 12 Last