<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>舵手</title>
	<atom:link href="http://wincn.org/feed" rel="self" type="application/rss+xml" />
	<link>http://wincn.org</link>
	<description>Enjoy Coding, Enjoy Life</description>
	<lastBuildDate>Thu, 20 Oct 2011 01:59:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>位、字节、字、进制</title>
		<link>http://wincn.org/post/376.html</link>
		<comments>http://wincn.org/post/376.html#comments</comments>
		<pubDate>Thu, 20 Oct 2011 01:59:15 +0000</pubDate>
		<dc:creator>舵手</dc:creator>
				<category><![CDATA[程序人生]]></category>

		<guid isPermaLink="false">http://wincn.org/post/376.html</guid>
		<description><![CDATA[位：“位(bit)”是电子计算机中最小的数据单位。每一位的状态只能是0或1。 字节：8个二进制位构成1个“字节(Byte)”，它是存储空间的基本计量单位。1个字节可以储存1个英文字母或者半个汉字，换句话说：1个汉字占据2个字节的存储空间。 字：“字”由若干个字节构成，字的位数叫做字长，不同档次的机器有不同的字长。例如一台8位机，它的1个字就等于1个字节，字长为8位。如果是一台16位机，那么，它的1个字就由2个字节构成，字长为16位。同理32位机，是有四个字节构成一个字。现在一般都是32位机。字是计算机进行数据处理和运算的单位。 KB：K表示1024，也就是2的10次方。1KB表示1K个Byte，也就是1024个字节。 MB：1MB = 1024KB = 1048576Bytes 进制也就是进位制，是人们规定的一种进位方法。 对于任何一种进制&#8212;X进制，就表示某一位置上的数运算时是逢X进一位。 十进制是逢十进一，十六进制是逢十六进一，二进制就是逢二进一。]]></description>
			<content:encoded><![CDATA[<p>位：“位(bit)”是电子计算机中最小的数据单位。每一位的状态只能是0或1。</p>
<p>字节：8个二进制位构成1个“字节(Byte)”，它是存储空间的基本计量单位。1个字节可以储存1个英文字母或者半个汉字，换句话说：1个汉字占据2个字节的存储空间。 </p>
<p>字：“字”由若干个字节构成，字的位数叫做字长，不同档次的机器有不同的字长。例如一台8位机，它的1个字就等于1个字节，字长为8位。如果是一台16位机，那么，它的1个字就由2个字节构成，字长为16位。同理32位机，是有四个字节构成一个字。现在一般都是32位机。字是计算机进行数据处理和运算的单位。</p>
<p>KB：K表示1024，也就是2的10次方。1KB表示1K个Byte，也就是1024个字节。   <br />MB：1MB = 1024KB = 1048576Bytes</p>
<p>进制也就是进位制，是人们规定的一种进位方法。 对于任何一种进制&#8212;X进制，就表示某一位置上的数运算时是逢X进一位。 十进制是逢十进一，十六进制是逢十六进一，二进制就是逢二进一。</p>
]]></content:encoded>
			<wfw:commentRss>http://wincn.org/post/376.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Unicode下CString转char*</title>
		<link>http://wincn.org/post/372.html</link>
		<comments>http://wincn.org/post/372.html#comments</comments>
		<pubDate>Tue, 27 Sep 2011 10:08:18 +0000</pubDate>
		<dc:creator>舵手</dc:creator>
				<category><![CDATA[程序人生]]></category>
		<category><![CDATA[CString]]></category>
		<category><![CDATA[unicode]]></category>
		<category><![CDATA[VC]]></category>

		<guid isPermaLink="false">http://wincn.org/post/372.html</guid>
		<description><![CDATA[失败的情况： //====================================== &#160;&#160;&#160;&#160;&#160;&#160;&#160; // CString fileName = file.GetPathName(); &#160;&#160;&#160;&#160;&#160;&#160;&#160; //测试1 &#160;&#160;&#160;&#160;&#160;&#160;&#160; //char* pChar; &#160;&#160;&#160;&#160;&#160;&#160;&#160; //pChar = (char *)fileName.GetBuffer(); &#160;&#160;&#160;&#160;&#160;&#160;&#160; ////pChar = fileName.GetBuffer(); &#160;&#160;&#160;&#160;&#160;&#160;&#160; //fileName.ReleaseBuffer();&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160; //测试2 &#160;&#160;&#160;&#160;&#160;&#160; /* char pChar[1024]; &#160;&#160;&#160;&#160;&#160;&#160;&#160; memcpy(pChar,fileName,fileName.);*/ &#160;&#160;&#160;&#160;&#160;&#160;&#160; //测试3 &#160;&#160;&#160;&#160;&#160;&#160; /* char pChar[1024]; &#160;&#160;&#160;&#160;&#160;&#160;&#160; int nIndex = fileName.GetLength(); &#160;&#160;&#160;&#160;&#160;&#160;&#160; for(int i=0;i&#60;nIndex;i++) &#160;&#160;&#160;&#160;&#160;&#160;&#160; { &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; pChar[i] = fileName[i]; &#160;&#160;&#160;&#160;&#160;&#160;&#160; } &#160;&#160;&#160;&#160;&#160;&#160;&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>失败的情况：    </p>
<p>//======================================     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; // CString fileName = file.GetPathName(); </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; //测试1    <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; //char* pChar;     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; //pChar = (char *)fileName.GetBuffer();     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; ////pChar = fileName.GetBuffer();     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; //fileName.ReleaseBuffer();&#160;&#160; </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; //测试2    <br />&#160;&#160;&#160;&#160;&#160;&#160; /* char pChar[1024];     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; memcpy(pChar,fileName,fileName.);*/ </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; //测试3    <br />&#160;&#160;&#160;&#160;&#160;&#160; /* char pChar[1024];     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; int nIndex = fileName.GetLength();     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(int i=0;i&lt;nIndex;i++)     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; {     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; pChar[i] = fileName[i];     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }     <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; pChar[nIndex] = 0;*/     <br />//==========================================     </p>
<p><span id="more-372"></span>
<p>正确的做法如下：    <br />&#160;&#160;&#160;&#160; WideCharToMultiByte(CP_ACP, 0, fileName, -1, pChar,&#160; MAX_PATH, NULL, NULL);     </p>
<p>WideCharToMultiByte 函数原型：    <br />================================================     <br />函数功能：该函数映射一个unicode字符串到一个多字节字符串。 </p>
<p>函数原型：int WideCharToMultiByte(UINT <b>CodePage</b>, DWORD <b>dwFlags</b>, LPWSTR <b>lpWideCharStr</b>, int <b>cchWideChar</b>, LPCSTR <b>lpMultiByteStr</b>, int <b>cchMultiByte</b>, LPCSTR <b>lpDefaultChar</b>, PBOOL <b>pfUsedDefaultChar</b> ); </p>
<p>参数： </p>
<p><b>CodePage</b>：指定执行转换的代码页，这个参数可以为系统已安装或有效的任何代码页所给定的值。你也可以指定其为下面的任意一值： </p>
<p>CP_ACP：ANSI代码页；CP_MACCP：Macintosh代码页；CP_OEMCP：OEM代码页； </p>
<p>CP_SYMBOL：符号代码页（42）；CP_THREAD_ACP：当前线索ANSI代码页； </p>
<p>CP_UTF7：使用UTF-7转换；CP_UTF8：使用UTF-8转换。    </p>
<p><strong>dwFlags：</strong>一组位标记用以指出是否未转换成预作或宽字符（若组合形式存在），是否使用象形文字替代控制字符，以及如何处理无效字符。你可以指定下面是标记常量的组合，含义如下：</p>
<p>MB_PRECOMPOSED：通常使用预作字符——就是说，由一个基本字符和一个非空字符组成的字符只有一个单一的字符值。这是缺省的转换选择。不能与</p>
<p>MB_COMPOSITE值一起使用。</p>
<p>MB_COMPOSITE：通常使用组合字符——就是说，由一个基本字符和一个非空字符组成的字符分别有不同的字符值。这是缺省的转换选择。不能与MB_PRECOMPOSED值一起使用。</p>
<p>MB_ERR_INVALID_CHARS：如果函数遇到无效的输入字符，它将运行失败，且GetLastErro返回ERROR_NO_UNICODE_TRANSLATION值。</p>
<p>MB_USEGLYPHCHARS：使用象形文字替代控制字符。</p>
<p>组合字符由一个基础字符和一个非空字符构成，每一个都有不同的字符值。每个预作字符都有单一的字符值给基础/非空字符的组成。在字符è中，e就是基础字符，而重音符标记就是非空字符。</p>
<p>函数的缺省动作是转换成预作的形式。如果预作的形式不存在，函数将尝试转换成组合形式。</p>
<p>标记MB_PRECOMPOSED和MB_COMPOSITE是互斥的，而标记MB_USEGLYPHCHARS和MB_ERR_INVALID_CHARS则不管其它标记如何都可以设置。</p>
<p><strong>lpMultiByteStr：</strong>指向将被转换字符串的字符。</p>
<p><strong>cchMultiByte：</strong>指定由参数lpMultiByteStr指向的字符串中字节的个数。如果这个值为C1，字符串将被设定为以NULL为结束符的字符串，并且自动计算长度。</p>
<p><strong>lpWideCharStr：</strong>指向接收被转换字符串的缓冲区。</p>
<p><strong>cchWideChar：</strong>指定由参数lpWideCharStr指向的缓冲区的字节个数。若此值为零，函数返回缓冲区所必需的宽字符数，在这种情况下，lpWideCharStr中的缓冲区不被使用。</p>
<p>返回值：如果函数运行成功，并且cchWideChar不为零，返回值是由lpWideCharStr指向的缓冲区中写入的宽字符数；如果函数运行成功，并且cchMultiByte为零，返回值是接收到待转换字符串的缓冲区所需求的宽字符数大小。如果函数运行失败，返回值为零。若想获得更多错误信息，请调用GetLastError函数。它可以返回下面所列错误代码：</p>
<p>ERROR_INSUFFICIENT_BJFFER；ERROR_INVALID_FLAGS；</p>
<p>ERROR_INVALID_PARAMETER；ERROR_NO_UNICODE_TRANSLATION。</p>
<p>注意：指针lpMultiByteStr和lpWideCharStr必须不一样。如果一样，函数将失败，GetLastError将返回ERROR_INVALID_PARAMETER的值。</p>
<p>如果MB_ERR_INVALID_CHARS被设置并且在资源字符串中遇到无效的字符时，函数将失败。如果MB_ERR_INVALID_CHARS不被设置，或是DBCS串中发现了头字节而没有有效的尾字节，无效字符将转换为缺省字符，但不是资源字符串中的缺省字符。当无效字符被发现，且MB_ERR_INVALID_CHARS值被设置，函数返回零，GetLastErro显示ERROR_NO_UNICODE_TRANSLATION的出错信息。</p>
<p>Windows CE：不支持参数CodePage中的CP_UTF7和CP_UTF8的值，以及参数dwFlags中的WC_NO_BEST_FIT_CHARS值。    <br />==================================================    <br />参考：<a href="http://www.cppblog.com/shongbee2/archive/2009/04/28/81349.aspx">http://www.cppblog.com/shongbee2/archive/2009/04/28/81349.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://wincn.org/post/372.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>水晶大全</title>
		<link>http://wincn.org/post/371.html</link>
		<comments>http://wincn.org/post/371.html#comments</comments>
		<pubDate>Tue, 27 Sep 2011 05:40:48 +0000</pubDate>
		<dc:creator>舵手</dc:creator>
				<category><![CDATA[精彩网文]]></category>
		<category><![CDATA[水晶]]></category>

		<guid isPermaLink="false">http://wincn.org/post/371.html</guid>
		<description><![CDATA[水晶大全,各式各样的水晶包括白水晶、黄水晶、茶晶、粉晶、紫晶、白幽灵、绿幽灵等等，并详细介绍各种水晶的作用。]]></description>
			<content:encoded><![CDATA[<p>水晶大全,各式各样的水晶包括白水晶、黄水晶、茶晶、粉晶、紫晶、白幽灵、绿幽灵等等，并详细介绍各种水晶的作用。</p>
<p><embed src="http://www.docin.com/DocinViewer-24933215-144.swf" width="480" height="400" type="application/x-shockwave-flash" ALLOWFULLSCREEN="true" ALLOWSCRIPTACCESS="always"></embed></p>
]]></content:encoded>
			<wfw:commentRss>http://wincn.org/post/371.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C/C++ 内存管理</title>
		<link>http://wincn.org/post/368.html</link>
		<comments>http://wincn.org/post/368.html#comments</comments>
		<pubDate>Thu, 22 Sep 2011 10:09:37 +0000</pubDate>
		<dc:creator>舵手</dc:creator>
				<category><![CDATA[程序人生]]></category>

		<guid isPermaLink="false">http://wincn.org/post/368.html</guid>
		<description><![CDATA[1、内存分配方式 内存分配方式有三种： （1）从静态存储区域分配。内存在程序编译的时候就已经分配好，这块内存在程序的整个运行期间都存在。例如全局变量，static变量。 （2）在栈上创建。在执行函数时，函数内局部变量的存储单元都可以在栈上创建，函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中，效率很高，但是分配的内存容量有限。 （3） 从堆上分配，亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存，程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定，使用非常灵活，但问题也最多。 2、常见的内存错误及其对策 发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误，通常是在程序运行时才能捕捉到。而这些错误大多没有明显的症状，时隐时现，增加了改错的难度。有时用户怒气冲冲地把你找来，程序却没有发生任何问题，你一走，错误又发作了。 常见的内存错误及其对策如下： * 内存分配未成功，却使用了它。 编程新手常犯这种错误，因为他们没有意识到内存分配会不成功。常用解决办法是，在使用内存之前检查指针是否为NULL。如果指针p是函数的参数，那么在函数的入口处用assert(p!=NULL)进行 检查。如果是用malloc或new来申请内存，应该用if(p==NULL) 或if(p!=NULL)进行防错处理。 * 内存分配虽然成功，但是尚未初始化就引用它。 犯这种错误主要有两个起因：一是没有初始化的观念；二是误以为内存的缺省初值全为零，导致引用初值错误（例如数组）。内存的缺省初值究竟是什么并没有统一的标准，尽管有些时候为零值，我们宁可信其无不可信其有。所以无论用何种方式创建数组，都别忘了赋初值，即便是赋零值也不可省略，不要嫌麻烦。 * 内存分配成功并且已经初始化，但操作越过了内存的边界。 例如在使用数组时经常发生下标“多1”或者“少1”的操作。特别是在for循环语句中，循环次数很容易搞错，导致数组操作越界。 * 忘记了释放内存，造成内存泄露。 含有这种错误的函数每被调用一次就丢失一块内存。刚开始时系统的内存充足，你看不到错误。终有一次程序突然死掉，系统出现提示：内存耗尽。 动态内存的申请与释放必须配对，程序中malloc与free的使用次数一定要相同，否则肯定有错误（new/delete同理）。 * 释放了内存却继续使用它。 有三种情况： （1）程序中的对象调用关系过于复杂，实在难以搞清楚某个对象究竟是否已经释放了内存，此时应该重新设计数据结构，从根本上解决对象管理的混乱局面。 （2）函数的return语句写错了，注意不要返回指向“栈内存”的“指针”或者“引用”，因为该内存在函数体结束时被自动销毁。 （3）使用free或delete释放了内存后，没有将指针设置为NULL。导致产生“野指针”。 【规则1】用malloc或new申请内存之后，应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。 【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。 【规则3】避免数组或指针的下标越界，特别要当心发生“多1”或者“少1”操作。 【规则4】动态内存的申请与释放必须配对，防止内存泄漏。 【规则5】用free或delete释放了内存之后，立即将指针设置为NULL，防止产生“野指针”。 3、指针与数组的对比 C++/C程序中，指针和数组在不少地方可以相互替换着用，让人产生一种错觉，以为两者是等价的。 数组要么在静态存储区被创建（如全局数组），要么在栈上被创建。数组名对应着（而不是指向）一块内存，其地址与容量在生命期内保持不变，只有数组的内容可以改变。 指针可以随时指向任意类型的内存块，它的特征是“可变”，所以我们常用指针来操作动态内存。指针远比数组灵活，但也更危险。 下面以字符串为例比较指针与数组的特性。 3.1 修改内容 示例3-1中，字符数组a的容量是6个字符，其内容为hello。a的内容可以改变，如a[0]= &#8216;X’。指针p指向常量字符串“world”（位于静态存储区，内容为world），常量字符串的内容是不可以被修改的。从语法上看，编译器并不觉得语句 p[0]= &#8216;X’有什么不妥，但是该语句企图修改常量字符串的内容而导致运行错误。 char a[] = “hello”; a[0] = &#8216;X’; cout &#60;&#60; [...]]]></description>
			<content:encoded><![CDATA[<p><strong>1、内存分配方式 </strong></p>
<p>内存分配方式有三种： </p>
<p>（1）从静态存储区域分配。内存在程序编译的时候就已经分配好，这块内存在程序的整个运行期间都存在。例如全局变量，static变量。 </p>
<p>（2）在栈上创建。在执行函数时，函数内局部变量的存储单元都可以在栈上创建，函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中，效率很高，但是分配的内存容量有限。 </p>
<p>（3） 从堆上分配，亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存，程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定，使用非常灵活，但问题也最多。 </p>
<p><strong>2、常见的内存错误及其对策 </strong></p>
<p>发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误，通常是在程序运行时才能捕捉到。而这些错误大多没有明显的症状，时隐时现，增加了改错的难度。有时用户怒气冲冲地把你找来，程序却没有发生任何问题，你一走，错误又发作了。 常见的内存错误及其对策如下： </p>
<p>* 内存分配未成功，却使用了它。</p>
<p><span id="more-368"></span>
</p>
<p>编程新手常犯这种错误，因为他们没有意识到内存分配会不成功。常用解决办法是，在使用内存之前检查指针是否为NULL。如果指针p是函数的参数，那么在函数的入口处用assert(p!=NULL)进行 </p>
<p>检查。如果是用malloc或new来申请内存，应该用if(p==NULL) 或if(p!=NULL)进行防错处理。 </p>
<p>* 内存分配虽然成功，但是尚未初始化就引用它。 </p>
<p>犯这种错误主要有两个起因：一是没有初始化的观念；二是误以为内存的缺省初值全为零，导致引用初值错误（例如数组）。内存的缺省初值究竟是什么并没有统一的标准，尽管有些时候为零值，我们宁可信其无不可信其有。所以无论用何种方式创建数组，都别忘了赋初值，即便是赋零值也不可省略，不要嫌麻烦。 </p>
<p>* 内存分配成功并且已经初始化，但操作越过了内存的边界。 </p>
<p>例如在使用数组时经常发生下标“多1”或者“少1”的操作。特别是在for循环语句中，循环次数很容易搞错，导致数组操作越界。 </p>
<p>* 忘记了释放内存，造成内存泄露。 </p>
<p>含有这种错误的函数每被调用一次就丢失一块内存。刚开始时系统的内存充足，你看不到错误。终有一次程序突然死掉，系统出现提示：内存耗尽。 </p>
<p>动态内存的申请与释放必须配对，程序中malloc与free的使用次数一定要相同，否则肯定有错误（new/delete同理）。 </p>
<p>* 释放了内存却继续使用它。    <br />有三种情况： </p>
<p>（1）程序中的对象调用关系过于复杂，实在难以搞清楚某个对象究竟是否已经释放了内存，此时应该重新设计数据结构，从根本上解决对象管理的混乱局面。 </p>
<p>（2）函数的return语句写错了，注意不要返回指向“栈内存”的“指针”或者“引用”，因为该内存在函数体结束时被自动销毁。 </p>
<p>（3）使用free或delete释放了内存后，没有将指针设置为NULL。导致产生“野指针”。 </p>
<p><font color="#ff0000"><strong></strong>【规则1】用malloc或new申请内存之后，应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。 </font></p>
<p><font color="#ff0000">【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。 </font></p>
<p><font color="#ff0000">【规则3】避免数组或指针的下标越界，特别要当心发生“多1”或者“少1”操作。 </font></p>
<p><font color="#ff0000">【规则4】动态内存的申请与释放必须配对，防止内存泄漏。 </font></p>
<p><font color="#ff0000">【规则5】用free或delete释放了内存之后，立即将指针设置为NULL，防止产生“野指针”。 </font></p>
<p><strong>3、指针与数组的对比 </strong></p>
<p>C++/C程序中，指针和数组在不少地方可以相互替换着用，让人产生一种错觉，以为两者是等价的。 </p>
<p>数组要么在静态存储区被创建（如全局数组），要么在栈上被创建。数组名对应着（而不是指向）一块内存，其地址与容量在生命期内保持不变，只有数组的内容可以改变。 </p>
<p>指针可以随时指向任意类型的内存块，它的特征是“可变”，所以我们常用指针来操作动态内存。指针远比数组灵活，但也更危险。 </p>
<p>下面以字符串为例比较指针与数组的特性。 </p>
<p><strong>3.1 修改内容 </strong></p>
<p>示例3-1中，字符数组a的容量是6个字符，其内容为hello。a的内容可以改变，如a[0]= &#8216;X’。指针p指向常量字符串“world”（位于静态存储区，内容为world），常量字符串的内容是不可以被修改的。从语法上看，编译器并不觉得语句 p[0]= &#8216;X’有什么不妥，但是该语句企图修改常量字符串的内容而导致运行错误。 </p>
<p>char a[] = “hello”;    <br />a[0] = &#8216;X’;     <br />cout &lt;&lt; a &lt;&lt; endl;     <br />char *p = “world”; // 注意p指向常量字符串     <br />p[0] = &#8216;X’; // 编译器不能发现该错误     <br />cout &lt;&lt; p &lt;&lt; endl; 示例3.1 修改数组和指针的内容 </p>
<p><strong>3.2 内容复制与比较 </strong></p>
<p>不能对数组名进行直接复制与比较。示例7-3-2中，若想把数组a的内容复制给数组b，不能用语句 b = a ，否则将产生编译错误。应该用标准库函数strcpy进行复制。同理，比较b和a的内容是否相同，不能用if(b==a) 来判断，应该用标准库函数strcmp进行比较。 </p>
<p>语句p = a 并不能把a的内容复制指针p，而是把a的地址赋给了p。要想复制a的内容，可以先用库函数malloc为p申请一块容量为strlen(a)+1个字符的内存，再用strcpy进行字符串复制。同理，语句if(p==a) 比较的不是内容而是地址，应该用库函数strcmp来比较。 </p>
<p>// 数组…    <br />char a[] = &quot;hello&quot;;     <br />char b[10];     <br />strcpy(b, a); // 不能用 b = a;     <br />if(strcmp(b, a) == 0) // 不能用 if (b == a)     <br />…     <br />// 指针…     <br />int len = strlen(a);     <br />char *p = (char *)malloc(sizeof(char)*(len+1));     <br />strcpy(p,a); // 不要用 p = a;     <br />if(strcmp(p, a) == 0) // 不要用 if (p == a)     <br />… 示例3.2 数组和指针的内容复制与比较 </p>
<p><strong>3.3 计算内存容量 </strong></p>
<p>用运算符sizeof可以计算出数组的容量（字节数）。示例7-3-3（a）中，sizeof(a)的值是12（注意别忘了’’）。指针p指向a，但是 sizeof(p)的值却是4。这是因为sizeof(p)得到的是一个指针变量的字节数，相当于sizeof(char*)，而不是p所指的内存容量。 C++/C语言没有办法知道指针所指的内存容量，除非在申请内存时记住它。 </p>
<p>注意当数组作为函数的参数进行传递时，该数组自动退化为同类型的指针。示例7-3-3（b）中，不论数组a的容量是多少，sizeof(a)始终等于sizeof(char *)。 </p>
<p>char a[] = &quot;hello world&quot;;    <br />char *p = a;     <br />cout&lt;&lt; sizeof(a) &lt;&lt; endl; // 12字节     <br />cout&lt;&lt; sizeof(p) &lt;&lt; endl; // 4字节 示例3.3（a） 计算数组和指针的内存容量 </p>
<p>void Func(char a[100])    <br />{     <br />cout&lt;&lt; sizeof(a) &lt;&lt; endl; // 4字节而不是100字节     <br />} </p>
<p>示例3.3（b） 数组退化为指针 </p>
<p><strong>4、指针参数是如何传递内存的？ </strong></p>
<p>如果函数的参数是一个指针，不要指望用该指针去申请动态内存。示例7-4-1中，Test函数的语句GetMemory(str, 200)并没有使str获得期望的内存，str依旧是NULL，为什么？ </p>
<p>void GetMemory(char *p, int num)    <br />{     <br />p = (char *)malloc(sizeof(char) * num);     <br />}     <br />void Test(void)     <br />{     <br />char *str = NULL;     <br />GetMemory(str, 100); // str 仍然为 NULL     <br />strcpy(str, &quot;hello&quot;); // 运行错误     <br />} 示例4.1 试图用指针参数申请动态内存 </p>
<p>毛病出在函数GetMemory中。编译器总是要为函数的每个参数制作临时副本，指针参数p的副本是 _p，编译器使 _p = p。如果函数体内的程序修改了_p的内容，就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中，_p申请了新的内存，只是把 _p所指的内存地址改变了，但是p丝毫未变。所以函数GetMemory并不能输出任何东西。事实上，每执行一次GetMemory就会泄露一块内存，因为没有用free释放内存。 </p>
<p>如果非得要用指针参数去申请内存，那么应该改用“指向指针的指针”，见示例4.2。 </p>
<p>void GetMemory2(char **p, int num)    <br />{     <br />*p = (char *)malloc(sizeof(char) * num);     <br />}     <br />void Test2(void)     <br />{     <br />char *str = NULL;     <br />GetMemory2(&amp;str, 100); // 注意参数是 &amp;str，而不是str     <br />strcpy(str, &quot;hello&quot;);     <br />cout&lt;&lt; str &lt;&lt; endl;     <br />free(str);     <br />} 示例4.2用指向指针的指针申请动态内存 </p>
<p>由于“指向指针的指针”这个概念不容易理解，我们可以用函数返回值来传递动态内存。这种方法更加简单，见示例4.3。 </p>
<p>char *GetMemory3(int num)    <br />{     <br />char *p = (char *)malloc(sizeof(char) * num);     <br />return p;     <br />}     <br />void Test3(void)     <br />{     <br />char *str = NULL;     <br />str = GetMemory3(100);     <br />strcpy(str, &quot;hello&quot;);     <br />cout&lt;&lt; str &lt;&lt; endl;     <br />free(str);     <br />} 示例4.3 用函数返回值来传递动态内存 </p>
<p>用函数返回值来传递动态内存这种方法虽然好用，但是常常有人把return语句用错了。这里强调不要用return语句返回指向“栈内存”的指针，因为该内存在函数结束时自动消亡，见示例4.4。 </p>
<p>char *GetString(void)    <br />{     <br />char p[] = &quot;hello world&quot;;     <br />return p; // 编译器将提出警告     <br />}     <br />void Test4(void)     <br />{     <br />char *str = NULL;     <br />str = GetString(); // str 的内容是垃圾     <br />cout&lt;&lt; str &lt;&lt; endl;     <br />} 示例4.4 return语句返回指向“栈内存”的指针 </p>
<p>用调试器逐步跟踪Test4，发现执行str = GetString语句后str不再是NULL指针，但是str的内容不是“hello world”而是垃圾。    <br />如果把示例4.4改写成示例4.5，会怎么样？ </p>
<p>char *GetString2(void)    <br />{     <br />char *p = &quot;hello world&quot;;     <br />return p;     <br />}     <br />void Test5(void)     <br />{     <br />char *str = NULL;     <br />str = GetString2();     <br />cout&lt;&lt; str &lt;&lt; endl;     <br />} 示例4.5 return语句返回常量字符串 </p>
<p>函数Test5运行虽然不会出错，但是函数GetString2的设计概念却是错误的。因为GetString2内的“hello world”是常量字符串，位于静态存储区，它在程序生命期内恒定不变。无论什么时候调用GetString2，它返回的始终是同一个“只读”的内存块。 </p>
<p><strong>5、杜绝“野指针” </strong></p>
<p>“野指针”不是NULL指针，是指向“垃圾”内存的指针。人们一般不会错用NULL指针，因为用if语句很容易判断。但是“野指针”是很危险的，if语句对它不起作用。 “野指针”的成因主要有两种： </p>
<p>（1）指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针，它的缺省值是随机的，它会乱指一气。所以，指针变量在创建的同时应当被初始化，要么将指针设置为NULL，要么让它指向合法的内存。例如 </p>
<p>char *p = NULL;    <br />char *str = (char *) malloc(100);     <br />（2）指针p被free或者delete之后，没有置为NULL，让人误以为p是个合法的指针。 </p>
<p>（3）指针操作超越了变量的作用范围。这种情况让人防不胜防，示例程序如下： </p>
<p>class A    <br />{     <br />public:     <br />void Func(void){ cout &lt;&lt; “Func of class A” &lt;&lt; endl; }     <br />};     <br />void Test(void)     <br />{     <br />A *p;     <br />{     <br />A a;     <br />p = &amp;a; // 注意 a 的生命期     <br />}     <br />p-&gt;Func(); // p是“野指针”     <br />} </p>
<p>函数Test在执行语句p-&gt;Func()时，对象a已经消失，而p是指向a的，所以p就成了“野指针”。但奇怪的是我运行这个程序时居然没有出错，这可能与编译器有关。 </p>
<p><strong>6、有了malloc/free为什么还要new/delete？ </strong></p>
<p>malloc与free是C++/C语言的标准库函数，new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。 </p>
<p>对于非内部数据类型的对象而言，光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数，对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符，不在编译器控制权限之内，不能够把执行构造函数和析构函数的任务强加于malloc/free。 </p>
<p>因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new，以及一个能完成清理与释放内存工作的运算符delete。注意 new/delete不是库函数。我们先看一看malloc/free和new/delete如何实现对象的动态内存管理，见示例6。 </p>
<p>class Obj    <br />{     <br />public :     <br />Obj(void){ cout &lt;&lt; “Initialization” &lt;&lt; endl; }     <br />~Obj(void){ cout &lt;&lt; “Destroy” &lt;&lt; endl; }     <br />void Initialize(void){ cout &lt;&lt; “Initialization” &lt;&lt; endl; }     <br />void Destroy(void){ cout &lt;&lt; “Destroy” &lt;&lt; endl; }     <br />};     <br />void UseMallocFree(void)     <br />{     <br />Obj *a = (obj *)malloc(sizeof(obj)); // 申请动态内存     <br />a-&gt;Initialize(); // 初始化     <br />//…     <br />a-&gt;Destroy(); // 清除工作     <br />free(a); // 释放内存     <br />}     <br />void UseNewDelete(void)     <br />{     <br />Obj *a = new Obj; // 申请动态内存并且初始化     <br />//…     <br />delete a; // 清除并且释放内存     <br />} 示例6 用malloc/free和new/delete如何实现对象的动态内存管理 </p>
<p>类Obj的函数Initialize模拟了构造函数的功能，函数Destroy模拟了析构函数的功能。函数UseMallocFree中，由于 malloc/free不能执行构造函数与析构函数，必须调用成员函数Initialize和Destroy来完成初始化与清除工作。函数 UseNewDelete则简单得多。 </p>
<p>所以我们不要企图用malloc/free来完成动态对象的内存管理，应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程，对它们而言malloc/free和new/delete是等价的。 </p>
<p>既然new/delete的功能完全覆盖了malloc/free，为什么C++不把malloc/free淘汰出局呢？这是因为C++程序经常要调用C函数，而C程序只能用malloc/free管理动态内存。 </p>
<p>如果用free释放“new创建的动态对象”，那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存 ”，理论上讲程序不会出错，但是该程序的可读性很差。所以new/delete必须配对使用，malloc/free也一样。 </p>
<p><strong>7、内存耗尽怎么办？ </strong></p>
<p>如果在申请动态内存时找不到足够大的内存块，malloc和new将返回NULL指针，宣告内存申请失败。通常有三种方式处理“内存耗尽”问题。 </p>
<p>（1）判断指针是否为NULL，如果是则马上用return语句终止本函数。例如： </p>
<p>void Func(void)    <br />{     <br />A *a = new A;     <br />if(a == NULL)     <br />{     <br />return;     <br />}     <br />…     <br />}     <br />（2）判断指针是否为NULL，如果是则马上用exit(1)终止整个程序的运行。例如： </p>
<p>void Func(void)    <br />{     <br />A *a = new A;     <br />if(a == NULL)     <br />{     <br />cout &lt;&lt; “Memory Exhausted” &lt;&lt; endl;     <br />exit(1);     <br />}     <br />…     <br />}     <br />（3）为new和malloc设置异常处理函数。例如Visual C++可以用_set_new_hander函数为new设置用户自己定义的异常处理函数，也可以让malloc享用与new相同的异常处理函数。详细内容请参考C++使用手册。 </p>
<p>上述（1）（2）方式使用最普遍。如果一个函数内有多处需要申请动态内存，那么方式（1）就显得力不从心（释放内存很麻烦），应该用方式（2）来处理。 </p>
<p>很多人不忍心用exit(1)，问：“不编写出错处理程序，让操作系统自己解决行不行？” </p>
<p>不行。如果发生“内存耗尽”这样的事情，一般说来应用程序已经无药可救。如果不用exit(1) 把坏程序杀死，它可能会害死操作系统。道理如同：如果不把歹徒击毙，歹徒在老死之前会犯下更多的罪。 </p>
<p>有一个很重要的现象要告诉大家。对于32位以上的应用程序而言，无论怎样使用malloc与new，几乎不可能导致“内存耗尽”。我在Windows 98下用Visual C++编写了测试程序，见示例7。这个程序会无休止地运行下去，根本不会终止。因为32位操作系统支持“虚存”，内存用完了，自动用硬盘空间顶替。我只听到硬盘嘎吱嘎吱地响，Window 98已经累得对键盘、鼠标毫无反应。 </p>
<p>我可以得出这么一个结论：对于32位以上的应用程序，“内存耗尽”错误处理程序毫无用处。这下可把Unix和Windows程序员们乐坏了：反正错误处理程序不起作用，我就不写了，省了很多麻烦。 </p>
<p>我不想误导读者，必须强调：不加错误处理将导致程序的质量很差，千万不可因小失大。 </p>
<p>void main(void)    <br />{     <br />float *p = NULL;     <br />while(TRUE)     <br />{     <br />p = new float[1000000];     <br />cout &lt;&lt; “eat memory” &lt;&lt; endl;     <br />if(p==NULL)     <br />exit(1);     <br />}     <br />} </p>
<p>示例7试图耗尽操作系统的内存 </p>
<p><strong>8、malloc/free 的使用要点 </strong></p>
<p>函数malloc的原型如下： </p>
<p>void * malloc(size_t size);    <br />用malloc申请一块长度为length的整数类型的内存，程序如下： </p>
<p>int *p = (int *) malloc(sizeof(int) * length);    <br />我们应当把注意力集中在两个要素上：“类型转换”和“sizeof”。 </p>
<p>* malloc返回值的类型是void *，所以在调用malloc时要显式地进行类型转换，将void * 转换成所需要的指针类型。 </p>
<p>* malloc函数本身并不识别要申请的内存是什么类型，它只关心内存的总字节数。我们通常记不住int, float等数据类型的变量的确切字节数。例如int变量在16位系统下是2个字节，在32位下是4个字节；而float变量在16位系统下是4个字节，在32位下也是4个字节。最好用以下程序作一次测试： </p>
<p>cout &lt;&lt; sizeof(char) &lt;&lt; endl;    <br />cout &lt;&lt; sizeof(int) &lt;&lt; endl;     <br />cout &lt;&lt; sizeof(unsigned int) &lt;&lt; endl;     <br />cout &lt;&lt; sizeof(long) &lt;&lt; endl;     <br />cout &lt;&lt; sizeof(unsigned long) &lt;&lt; endl;     <br />cout &lt;&lt; sizeof(float) &lt;&lt; endl;     <br />cout &lt;&lt; sizeof(double) &lt;&lt; endl;     <br />cout &lt;&lt; sizeof(void *) &lt;&lt; endl;     <br />在malloc的“()”中使用sizeof运算符是良好的风格，但要当心有时我们会昏了头，写出 p = malloc(sizeof(p))这样的程序来。 </p>
<p>* 函数free的原型如下： </p>
<p>void free( void * memblock );    <br />为什么free函数不象malloc函数那样复杂呢？这是因为指针p的类型以及它所指的内存的容量事先都是知道的，语句free(p)能正确地释放内存。如果p是NULL指针，那么free对p无论操作多少次都不会出问题。如果p不是NULL指针，那么free对p连续操作两次就会导致程序运行错误。 </p>
<p><strong>9、new/delete 的使用要点 </strong></p>
<p>运算符new使用起来要比函数malloc简单得多，例如： </p>
<p>int *p1 = (int *)malloc(sizeof(int) * length);    <br />int *p2 = new int[length];     <br />这是因为new内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言，new在创建动态对象的同时完成了初始化工作。如果对象有多个构造函数，那么new的语句也可以有多种形式。例如 </p>
<p>class Obj    <br />{     <br />public :     <br />Obj(void); // 无参数的构造函数     <br />Obj(int x); // 带一个参数的构造函数     <br />…     <br />}     <br />void Test(void)     <br />{     <br />Obj *a = new Obj;     <br />Obj *b = new Obj(1); // 初值为1     <br />…     <br />delete a;     <br />delete b;     <br />}     <br />如果用new创建对象数组，那么只能使用对象的无参数构造函数。例如 </p>
<p>Obj *objects = new Obj[100]; // 创建100个动态对象    <br />不能写成 </p>
<p>Obj *objects = new Obj[100](1);// 创建100个动态对象的同时赋初值1    <br />在用delete释放对象数组时，留意不要丢了符号&#8217;[]’。例如 </p>
<p>delete []objects; // 正确的用法    <br />delete objects; // 错误的用法     <br />后者相当于delete objects[0]，漏掉了另外99个对象。 </p>
<p><strong>10、一些心得体会 </strong></p>
<p>我认识不少技术不错的C++/C程序员，很少有人能拍拍胸脯说通晓指针与内存管理（包括我自己）。我最初学习C语言时特别怕指针，导致我开发第一个应用软件（约1万行C代码）时没有使用一个指针，全用数组来顶替指针，实在蠢笨得过分。躲避指针不是办法，后来我改写了这个软件，代码量缩小到原先的一半。 </p>
<p>我的经验教训是： </p>
<p>（1）越是怕指针，就越要使用指针。不会正确使用指针，肯定算不上是合格的程序员。 </p>
<p>（2）必须养成“使用调试器逐步跟踪程序”的习惯，只有这样才能发现问题的本质。 </p>
<p> 摘自：<a href="http://blog.csdn.net/lejuo/article/details/2269571">http://blog.csdn.net/lejuo/article/details/2269571</a></p>
]]></content:encoded>
			<wfw:commentRss>http://wincn.org/post/368.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>日子有多单薄</title>
		<link>http://wincn.org/post/358.html</link>
		<comments>http://wincn.org/post/358.html#comments</comments>
		<pubDate>Fri, 29 Apr 2011 06:57:52 +0000</pubDate>
		<dc:creator>舵手</dc:creator>
				<category><![CDATA[闲言碎语]]></category>
		<category><![CDATA[网文]]></category>

		<guid isPermaLink="false">http://wincn.org/?p=358</guid>
		<description><![CDATA[人永远都这样，吃苦奋斗的过程中感到漫无边际，似乎时间过得无比慢。等一切尘埃落定回首往事的时候，才发现当初度日如年的艰难也不过就一瞬间。这大概就是为什么诗里感叹”去日苦多”，只有过去的才发现匆匆。虽然回忆的时候明白要珍惜，但大多数人一回到现实又忘了，还是和往常一样按部就班地过。 也许，我们应该经常提醒自己，时光的逝去很简单，漫漫几十年的故事在一分钟内就可以回忆完。换言之，当岁月流走后，就很难再次握在手中，留下的不过是一些飘忽不定的影踪。无论我们多么渴望牢牢抓住，最后还是发现两手空空。日子，就是这样单薄，薄得用几页纸就足以记录。想到这一切，不应该珍惜手边的每一秒钟，珍惜生命中的每一个人吗？]]></description>
			<content:encoded><![CDATA[<p>人永远都这样，吃苦奋斗的过程中感到漫无边际，似乎时间过得无比慢。等一切尘埃落定回首往事的时候，才发现当初度日如年的艰难也不过就一瞬间。这大概就是为什么诗里感叹”去日苦多”，只有过去的才发现匆匆。虽然回忆的时候明白要珍惜，但大多数人一回到现实又忘了，还是和往常一样按部就班地过。<br />
也许，我们应该经常提醒自己，时光的逝去很简单，漫漫几十年的故事在一分钟内就可以回忆完。换言之，当岁月流走后，就很难再次握在手中，留下的不过是一些飘忽不定的影踪。无论我们多么渴望牢牢抓住，最后还是发现两手空空。日子，就是这样单薄，薄得用几页纸就足以记录。想到这一切，不应该珍惜手边的每一秒钟，珍惜生命中的每一个人吗？</p>
]]></content:encoded>
			<wfw:commentRss>http://wincn.org/post/358.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>gmail邮件正文过多会被自动截取</title>
		<link>http://wincn.org/post/353.html</link>
		<comments>http://wincn.org/post/353.html#comments</comments>
		<pubDate>Thu, 17 Feb 2011 09:21:26 +0000</pubDate>
		<dc:creator>舵手</dc:creator>
				<category><![CDATA[解决方案]]></category>
		<category><![CDATA[gmail]]></category>

		<guid isPermaLink="false">http://wincn.org/?p=353</guid>
		<description><![CDATA[最近发现用gmail订阅的杂志，老是正文显示不完整，刚开始以为是杂志发送方的问题，就发邮件咨询了下，一直没有回复，今天在网上搜了下，才知道这个是gmail的问题。 这个问题就是如果gmail邮件正文内容过多他会自动截断（具体多长会截断不清楚），其实邮件的内容还是完整的，只是没有把截断的内容显示出来。当然只要内容还在邮件中就有办法查看，一种解决办法就是点击邮箱右上方的”打印”功能就可以显示全文，当然这个不用真的打印，只是为了看完整的邮件内容。另一种解决办法就是点击显示完整邮件，但是这样操作后看见的是base64编码后的邮件，完全不可阅读。纳闷的是gmail开发团队没有给个官方的解决办法。]]></description>
			<content:encoded><![CDATA[<p>最近发现用gmail订阅的杂志，老是正文显示不完整，刚开始以为是杂志发送方的问题，就发邮件咨询了下，一直没有回复，今天在网上搜了下，才知道这个是gmail的问题。</p>
<p>这个问题就是如果gmail邮件正文内容过多他会自动截断（具体多长会截断不清楚），其实邮件的内容还是完整的，只是没有把截断的内容显示出来。当然只要内容还在邮件中就有办法查看，一种解决办法就是点击邮箱右上方的”打印”功能就可以显示全文，当然这个不用真的打印，只是为了看完整的邮件内容。另一种解决办法就是点击显示完整邮件，但是这样操作后看见的是base64编码后的邮件，完全不可阅读。纳闷的是gmail开发团队没有给个官方的解决办法。</p>
]]></content:encoded>
			<wfw:commentRss>http://wincn.org/post/353.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle中decode 函数用法及实例</title>
		<link>http://wincn.org/post/350.html</link>
		<comments>http://wincn.org/post/350.html#comments</comments>
		<pubDate>Thu, 10 Feb 2011 09:06:33 +0000</pubDate>
		<dc:creator>舵手</dc:creator>
				<category><![CDATA[程序人生]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://wincn.org/?p=350</guid>
		<description><![CDATA[用法1： decode(条件,值1,返回值1,值2,返回值2,&#8230;值n,返回值n,缺省值) 该函数的含义如下： IF 条件=值1 THEN 　　　　RETURN(返回值1) ELSIF 条件=值2 THEN 　　　　RETURN(返回值2) 　　　　&#8230;&#8230; ELSIF 条件=值n THEN 　　　　RETURN(返回值n) ELSE 　　　　RETURN(缺省值) END IF 用法2： decode(字段或字段的运算，值1，值2，值3） 这个函数运行的结果是，当字段或字段的运算等于值1时，返回值2，否则返回值3 当然值1，值2，值3也可以是表达式，这个函数使得某些sql语句简单了许多 示例1、比较大小 select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; &#8211;取较小值 sign()函数根据某个值是0、正数还是负数，分别返回0、1、-1 例如： 变量1=10，变量2=20 则sign(变量1-变量2)返回-1，decode解码结果为“变量1”，达到了取较小值的目的。 示例2、把值为1的变成0，为0的变成1 select decode(colName,1,0,1) from Table 示例3、查询某班男生和女生的数量分别是多少? 通常我们这么写: select count(*) from 表 where sex ＝ 男； select count(*) from 表 where sex [...]]]></description>
			<content:encoded><![CDATA[<p><strong><span style="color: #ff0000;">用法1：<br />
</span></strong>decode(条件,值1,返回值1,值2,返回值2,&#8230;值n,返回值n,缺省值)</p>
<p>该函数的含义如下：<br />
IF 条件=值1 THEN<br />
　　　　RETURN(返回值1)<br />
ELSIF 条件=值2 THEN<br />
　　　　RETURN(返回值2)<br />
　　　　&#8230;&#8230;<br />
ELSIF 条件=值n THEN<br />
　　　　RETURN(返回值n)<br />
ELSE<br />
　　　　RETURN(缺省值)<br />
END IF</p>
<p><span style="color: #ff0000;"><strong>用法2：<br />
</strong></span>decode(字段或字段的运算，值1，值2，值3）</p>
<p>这个函数运行的结果是，当字段或字段的运算等于值1时，返回值2，否则返回值3<br />
当然值1，值2，值3也可以是表达式，这个函数使得某些sql语句简单了许多</p>
<p><span id="more-350"></span><br />
<span style="color: #ff0000;"><strong><span style="color: #ff0000;">示例1、比较大小<br />
</span></strong></span>select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; &#8211;取较小值<br />
sign()函数根据某个值是0、正数还是负数，分别返回0、1、-1<br />
例如：<br />
变量1=10，变量2=20<br />
则sign(变量1-变量2)返回-1，decode解码结果为“变量1”，达到了取较小值的目的。</p>
<p><strong><span style="color: #ff0000;">示例2、把值为1的变成0，为0的变成1<br />
</span></strong>select decode(colName,1,0,1) from Table</p>
<p><span style="color: #ff0000;"><strong>示例3、查询某班男生和女生的数量分别是多少?<br />
</strong></span>通常我们这么写:<br />
select count(*) from 表 where sex ＝ 男；<br />
select count(*) from 表 where sex ＝ 女；<br />
要想显示到一起还要union一下，太麻烦了</p>
<p>用decode呢，只需要一句话<br />
SELECT sum(decode(sex, 男, 1, 0)), sum(decode(sex, 女, 1, 0)) FROM 表</p>
]]></content:encoded>
			<wfw:commentRss>http://wincn.org/post/350.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>妈妈，你的故事成真了</title>
		<link>http://wincn.org/post/349.html</link>
		<comments>http://wincn.org/post/349.html#comments</comments>
		<pubDate>Mon, 24 Jan 2011 10:05:28 +0000</pubDate>
		<dc:creator>舵手</dc:creator>
				<category><![CDATA[精彩网文]]></category>
		<category><![CDATA[哲理]]></category>

		<guid isPermaLink="false">http://wincn.org/?p=349</guid>
		<description><![CDATA[麦太教训麦兜：“有个小朋友，他不听话，第二天——他死了。” 妈妈这样教育他：“有个小朋友，他太骄傲，后来，他成乞丐。” 在许多年前，他不知道有麦兜的存在，就像他无法预知妈妈如此犀利的判定到底是对是错。 他只知道——好孩子，应该很谦虚，如果别人讲：“小P，你很优秀啊，书念得那么好，还会背那么多唐诗。”妈妈一定会说：“哪有，这孩子笨得很呢，每天还需要人叫起床。” 妈妈的人生哲学就是谦逊和忍让。小事忍，大事当然更要忍。忍来忍去，把自己变成忍者，却末见得得到什么好处。 他不相信妈妈的理论，却拗不过母亲每日潜移默化的暗示。 妈妈时刻耳提面命地教育他做人要低调，要韬光养晦。他太小了，还不懂什么叫韬光养晦，妈妈有点不耐烦，就是别乱说话！ 他有点似懂非懂，只好无奈委屈地成为一个“谦虚”的孩子，坐在沙发上听着妈妈对来访的亲友说：“这孩子就是内向，打个招呼都害羞呢！”他唯唯诺诺地应承着：“呵呵，我就是不太会跟人交流呢！”为了躲避来访亲友探询的目光，他甚至在外面有点潮湿的地面上睡了一晚。次日他重感冒发烧，母亲此后的口头禅变成了：“唉，这孩子，内向得见了生人都不敢回家。” 他只好整天闷在房间里埋头看书，一路谦虚着到大学毕业。 毕业招聘大会，他优秀的成绩单被摆在某家五百强企业人力资源经理面前。结果令大家都很意外，他被淘汰了！ 只有他自己知道发生了什么。“我的长处不多，经验也不多——”他这样谦虚着。 他的爱情也如求职道路一般异常地艰难。 没有工作，没有爱情，甚至连朋友都没有的博士，大家看他的眼神越来越古怪。母亲开始帮他策划一场场相亲，每次一到现场，他如临大敌，通常的情况是：往往还等不及女孩坐下，母亲就抢着掩饰，我这儿子，缺点就是内向。他有种说不出来的奇异感觉，母亲的语气里居然还带着那么一丝不容易察觉的优越感和骄傲。 第一堂课，他习惯了在众人面前谦逊地说自己的不足，手上的教案不到十分钟，他就念完了，然后和同学们面面相觑。等到大家反应过来，一阵哄堂大笑后，他沮丧悲哀地想：或许他跨不过去母亲的那句预言了，他真的无可救药。 不到一年，学校机构调整人员大裁减，科室里学历最高的他，赫然排在裁员名单的第一个。 那天晚上，他破天荒第一次喝醉了。他想起了一个故事，有个新媳妇初嫁，算命的告诉她要留心存点私房钱，当心将来被婆家休掉。她果真那么做了，一次次被抓到现行。婆婆很生气，既然留不住心，留住人何用？新媳妇不知道，预言真会成为诅咒。 写给妈妈的遗书上，他说：妈妈，你的故事成真了。]]></description>
			<content:encoded><![CDATA[<p>麦太教训麦兜：“有个小朋友，他不听话，第二天——他死了。”<br />
妈妈这样教育他：“有个小朋友，他太骄傲，后来，他成乞丐。”<br />
在许多年前，他不知道有麦兜的存在，就像他无法预知妈妈如此犀利的判定到底是对是错。<br />
他只知道——好孩子，应该很谦虚，如果别人讲：“小P，你很优秀啊，书念得那么好，还会背那么多唐诗。”妈妈一定会说：“哪有，这孩子笨得很呢，每天还需要人叫起床。”<br />
妈妈的人生哲学就是谦逊和忍让。小事忍，大事当然更要忍。忍来忍去，把自己变成忍者，却末见得得到什么好处。<br />
他不相信妈妈的理论，却拗不过母亲每日潜移默化的暗示。<br />
妈妈时刻耳提面命地教育他做人要低调，要韬光养晦。他太小了，还不懂什么叫韬光养晦，妈妈有点不耐烦，就是别乱说话！<br />
<span id="more-349"></span>他有点似懂非懂，只好无奈委屈地成为一个“谦虚”的孩子，坐在沙发上听着妈妈对来访的亲友说：“这孩子就是内向，打个招呼都害羞呢！”他唯唯诺诺地应承着：“呵呵，我就是不太会跟人交流呢！”为了躲避来访亲友探询的目光，他甚至在外面有点潮湿的地面上睡了一晚。次日他重感冒发烧，母亲此后的口头禅变成了：“唉，这孩子，内向得见了生人都不敢回家。”<br />
他只好整天闷在房间里埋头看书，一路谦虚着到大学毕业。<br />
毕业招聘大会，他优秀的成绩单被摆在某家五百强企业人力资源经理面前。结果令大家都很意外，他被淘汰了！<br />
只有他自己知道发生了什么。“我的长处不多，经验也不多——”他这样谦虚着。<br />
他的爱情也如求职道路一般异常地艰难。<br />
没有工作，没有爱情，甚至连朋友都没有的博士，大家看他的眼神越来越古怪。母亲开始帮他策划一场场相亲，每次一到现场，他如临大敌，通常的情况是：往往还等不及女孩坐下，母亲就抢着掩饰，我这儿子，缺点就是内向。他有种说不出来的奇异感觉，母亲的语气里居然还带着那么一丝不容易察觉的优越感和骄傲。<br />
第一堂课，他习惯了在众人面前谦逊地说自己的不足，手上的教案不到十分钟，他就念完了，然后和同学们面面相觑。等到大家反应过来，一阵哄堂大笑后，他沮丧悲哀地想：或许他跨不过去母亲的那句预言了，他真的无可救药。<br />
不到一年，学校机构调整人员大裁减，科室里学历最高的他，赫然排在裁员名单的第一个。<br />
那天晚上，他破天荒第一次喝醉了。他想起了一个故事，有个新媳妇初嫁，算命的告诉她要留心存点私房钱，当心将来被婆家休掉。她果真那么做了，一次次被抓到现行。婆婆很生气，既然留不住心，留住人何用？新媳妇不知道，预言真会成为诅咒。<br />
写给妈妈的遗书上，他说：妈妈，你的故事成真了。</p>
]]></content:encoded>
			<wfw:commentRss>http://wincn.org/post/349.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>天机不可泄露</title>
		<link>http://wincn.org/post/347.html</link>
		<comments>http://wincn.org/post/347.html#comments</comments>
		<pubDate>Thu, 30 Dec 2010 09:12:45 +0000</pubDate>
		<dc:creator>舵手</dc:creator>
				<category><![CDATA[精彩网文]]></category>
		<category><![CDATA[哲理]]></category>

		<guid isPermaLink="false">http://wincn.org/?p=347</guid>
		<description><![CDATA[周末晚带着女儿去欣赏一场大提琴独奏会，因为演奏家颇具知名度，当晚的卖座情况相当不错，但在开演前几分钟，前面仍有几个空位，等待主人的到来。 不久，舞台上的灯光通亮，观众席逐渐罩下昏黄的微光。在一片静阒的等待中，仍听得一些骚动，原来，有人开始从后面往前挪位了。因为整个场子不大，所以在我们面前所发生的种种，就是一幕幕的实境秀，显得格外的逼真。开演几分钟后，座位的主人来了，”鸠占鹊巢”者似乎不愿起身，就指着一旁的位子要他们将就着坐下。中场休息过后，空位又发生一些变化，在后座虎视眈眈者，等到表演一开始，又是勇往直前，神情自若的坐在没有主人的位子上。 隔日在餐桌上，与女儿和先生提及此事，也顺便告诉女儿，那些买较低票价却坐在高价票座位上的人，自以为拣到了便宜，殊不知在整个过程中，他们已经丧失了欣赏音乐的乐趣，一颗心悬在别人的空位上，起起伏伏，不得安宁。 原本以为女儿对这事也是看在眼里，了然于心，岂知她竟回答说，她完全不知道我所描述的事情……；先生此时也悠悠的说：把它看作一场戏，你就不会动心了……。 “不动心”！？是啊，我把这一切看得这么钜细靡遗( jù xì mǐ yí)，我的心不是动得更厉害吗？因为”动心”，随之而来便是”起念”，用自己的观念去品头论足，如此，便容易掉入是非中，还自以为站在正的一方。女儿的”浑然不知”，是因为她没有成人的观念，所以不会用一些条条框框去套住别人，胡乱给别人贴标签。 餐桌上的”道德训诲”，那是一层理，在人世间需要这一层理来维系纲纪秩序，然而，我更向往的是那”不动心”的境界。那会是什么样的状态？是”视而不见”？是”船过水无痕”的波涛不惊？不在那个层次是体味不出那种况味，如果硬要说什么，都只是落入言诠。 “不动心”，那是要透过如实的修炼过程才能渐次达到的境界，智者告诉我们，要扎扎实实的往上修，”师父领进门，修行在个人”，无所求而自得之。对修者而言，这是何等的”天机”！然而，”天机不可泄”，人间没有语言文字来描绘”天机”，人又无此等聪慧来领略，”天机”，又如何能说呢！？ 周末晚带着女儿去欣赏一场大提琴独奏会，因为演奏家颇具知名度，当晚的卖座情况相当不错，但在开演前几分钟，前面仍有几个空位，等待主人的到来。不久，舞台上的灯光通亮，观众席逐渐罩下昏黄的微光。在一片静阒的等待中，仍听得一些骚动，原来，有人开始从后面往前挪位了。因为整个场子不大，所以在我们面前所发生的种种，就是一幕幕的实境秀，显得格外的逼真。开演几分钟后，座位的主人来了，”鸠占鹊巢”者似乎不愿起身，就指着一旁的位子要他们将就着坐下。中场休息过后，空位又发生一些变化，在后座虎视眈眈者，等到表演一开始，又是勇往直前，神情自若的坐在没有主人的位子上。隔日在餐桌上，与女儿和先生提及此事，也顺便告诉女儿，那些买较低票价却坐在高价票座位上的人，自以为拣到了便宜，殊不知在整个过程中，他们已经丧失了欣赏音乐的乐趣，一颗心悬在别人的空位上，起起伏伏，不得安宁。原本以为女儿对这事也是看在眼里，了然于心，岂知她竟回答说，她完全不知道我所描述的事情……；先生此时也悠悠的说：把它看作一场戏，你就不会动心了……。”不动心”！？是啊，我把这一切看得这么钜细靡遗( jù xì mǐ yí)，我的心不是动得更厉害吗？因为”动心”，随之而来便是”起念”，用自己的观念去品头论足，如此，便容易掉入是非中，还自以为站在正的一方。女儿的”浑然不知”，是因为她没有成人的观念，所以不会用一些条条框框去套住别人，胡乱给别人贴标签。餐桌上的”道德训诲”，那是一层理，在人世间需要这一层理来维系纲纪秩序，然而，我更向往的是那”不动心”的境界。那会是什么样的状态？是”视而不见”？是”船过水无痕”的波涛不惊？不在那个层次是体味不出那种况味，如果硬要说什么，都只是落入言诠。”不动心”，那是要透过如实的修炼过程才能渐次达到的境界，智者告诉我们，要扎扎实实的往上修，”师父领进门，修行在个人”，无所求而自得之。对修者而言，这是何等的”天机”！然而，”天机不可泄”，人间没有语言文字来描绘”天机”，人又无此等聪慧来领略，”天机”，又如何能说呢！？]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste">周末晚带着女儿去欣赏一场大提琴独奏会，因为演奏家颇具知名度，当晚的卖座情况相当不错，但在开演前几分钟，前面仍有几个空位，等待主人的到来。</div>
<div id="_mcePaste">不久，舞台上的灯光通亮，观众席逐渐罩下昏黄的微光。在一片静阒的等待中，仍听得一些骚动，原来，有人开始从后面往前挪位了。因为整个场子不大，所以在我们面前所发生的种种，就是一幕幕的实境秀，显得格外的逼真。开演几分钟后，座位的主人来了，”鸠占鹊巢”者似乎不愿起身，就指着一旁的位子要他们将就着坐下。中场休息过后，空位又发生一些变化，在后座虎视眈眈者，等到表演一开始，又是勇往直前，神情自若的坐在没有主人的位子上。<span id="more-347"></span></div>
<div id="_mcePaste">隔日在餐桌上，与女儿和先生提及此事，也顺便告诉女儿，那些买较低票价却坐在高价票座位上的人，自以为拣到了便宜，殊不知在整个过程中，他们已经丧失了欣赏音乐的乐趣，一颗心悬在别人的空位上，起起伏伏，不得安宁。</div>
<div id="_mcePaste">原本以为女儿对这事也是看在眼里，了然于心，岂知她竟回答说，她完全不知道我所描述的事情……；先生此时也悠悠的说：把它看作一场戏，你就不会动心了……。</div>
<div id="_mcePaste">“不动心”！？是啊，我把这一切看得这么钜细靡遗( jù xì mǐ yí)，我的心不是动得更厉害吗？因为”动心”，随之而来便是”起念”，用自己的观念去品头论足，如此，便容易掉入是非中，还自以为站在正的一方。女儿的”浑然不知”，是因为她没有成人的观念，所以不会用一些条条框框去套住别人，胡乱给别人贴标签。</div>
<div id="_mcePaste">餐桌上的”道德训诲”，那是一层理，在人世间需要这一层理来维系纲纪秩序，然而，我更向往的是那”不动心”的境界。那会是什么样的状态？是”视而不见”？是”船过水无痕”的波涛不惊？不在那个层次是体味不出那种况味，如果硬要说什么，都只是落入言诠。</div>
<div id="_mcePaste">“不动心”，那是要透过如实的修炼过程才能渐次达到的境界，智者告诉我们，要扎扎实实的往上修，”师父领进门，修行在个人”，无所求而自得之。对修者而言，这是何等的”天机”！然而，”天机不可泄”，人间没有语言文字来描绘”天机”，人又无此等聪慧来领略，”天机”，又如何能说呢！？</div>
<p>周末晚带着女儿去欣赏一场大提琴独奏会，因为演奏家颇具知名度，当晚的卖座情况相当不错，但在开演前几分钟，前面仍有几个空位，等待主人的到来。不久，舞台上的灯光通亮，观众席逐渐罩下昏黄的微光。在一片静阒的等待中，仍听得一些骚动，原来，有人开始从后面往前挪位了。因为整个场子不大，所以在我们面前所发生的种种，就是一幕幕的实境秀，显得格外的逼真。开演几分钟后，座位的主人来了，”鸠占鹊巢”者似乎不愿起身，就指着一旁的位子要他们将就着坐下。中场休息过后，空位又发生一些变化，在后座虎视眈眈者，等到表演一开始，又是勇往直前，神情自若的坐在没有主人的位子上。隔日在餐桌上，与女儿和先生提及此事，也顺便告诉女儿，那些买较低票价却坐在高价票座位上的人，自以为拣到了便宜，殊不知在整个过程中，他们已经丧失了欣赏音乐的乐趣，一颗心悬在别人的空位上，起起伏伏，不得安宁。原本以为女儿对这事也是看在眼里，了然于心，岂知她竟回答说，她完全不知道我所描述的事情……；先生此时也悠悠的说：把它看作一场戏，你就不会动心了……。”不动心”！？是啊，我把这一切看得这么钜细靡遗( jù xì mǐ yí)，我的心不是动得更厉害吗？因为”动心”，随之而来便是”起念”，用自己的观念去品头论足，如此，便容易掉入是非中，还自以为站在正的一方。女儿的”浑然不知”，是因为她没有成人的观念，所以不会用一些条条框框去套住别人，胡乱给别人贴标签。餐桌上的”道德训诲”，那是一层理，在人世间需要这一层理来维系纲纪秩序，然而，我更向往的是那”不动心”的境界。那会是什么样的状态？是”视而不见”？是”船过水无痕”的波涛不惊？不在那个层次是体味不出那种况味，如果硬要说什么，都只是落入言诠。”不动心”，那是要透过如实的修炼过程才能渐次达到的境界，智者告诉我们，要扎扎实实的往上修，”师父领进门，修行在个人”，无所求而自得之。对修者而言，这是何等的”天机”！然而，”天机不可泄”，人间没有语言文字来描绘”天机”，人又无此等聪慧来领略，”天机”，又如何能说呢！？</p>
]]></content:encoded>
			<wfw:commentRss>http://wincn.org/post/347.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>silverlight控件焦点问题</title>
		<link>http://wincn.org/post/346.html</link>
		<comments>http://wincn.org/post/346.html#comments</comments>
		<pubDate>Tue, 14 Dec 2010 03:19:40 +0000</pubDate>
		<dc:creator>舵手</dc:creator>
				<category><![CDATA[程序人生]]></category>
		<category><![CDATA[silverlight]]></category>
		<category><![CDATA[焦点]]></category>

		<guid isPermaLink="false">http://wincn.org/?p=346</guid>
		<description><![CDATA[1：获取当前页面上具有焦点的控件 FocusManager.GetFocusedElement(); 2：如何实现按回车切换焦点 在网上溜达了下，主流思路是先把页面上的所有控件按照TabIndex的大小，添加到一个List中，然后获取到当前具有焦点的控件，然后找到其在List中索引，索引加1便得到 下一个控件，最后调用Focus()函数，使其具有焦点。 关键代码： controls = new List&#60;Control&#62;(); public void GetControls(Grid layoutRoot) { foreach (UIElement uie in layoutRoot.Children) { controls.Add((Control)uie); } controls.Sort(delegate(Control c1, Control c2) { return c1.TabIndex.CompareTo(c2.TabIndex); }); } public void SelectNextControl(Control activeControl, bool forward) { Control cnt = null; int aCntidx = controls.LastIndexOf(activeControl); if (forward &#38;&#38; aCntidx !=controls.Count &#8211; 1) cnt [...]]]></description>
			<content:encoded><![CDATA[<div><strong></p>
<div id="_mcePaste">1：获取当前页面上具有焦点的控件</div>
<div id="_mcePaste"><span style="font-weight: normal;">FocusManager.GetFocusedElement();</p>
<p></span></div>
<div id="_mcePaste"><span style="font-weight: normal;"><strong>2：如何实现按回车切换焦点 </strong><br />
在网上溜达了下，主流思路是先把页面上的所有控件按照TabIndex的大小，添加到一个List中，然后获取到当前具有焦点的控件，然后找到其在List中索引，索引加1便得到</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">下一个控件，最后调用Focus()函数，使其具有焦点。</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">关键代码：<span id="more-346"></span><br />
</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">controls = new List&lt;Control&gt;();</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">public void GetControls(Grid layoutRoot) {</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">foreach (UIElement uie in layoutRoot.Children)</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">{</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">controls.Add((Control)uie);</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">}</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">controls.Sort(delegate(Control c1, Control c2)</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">{</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">return c1.TabIndex.CompareTo(c2.TabIndex);</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">});</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">}</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">public void SelectNextControl(Control activeControl, bool forward)</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">{</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">Control cnt = null;</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">int aCntidx = controls.LastIndexOf(activeControl);</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">if (forward &amp;&amp; aCntidx !=controls.Count &#8211; 1)</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">cnt = controls.ElementAt(aCntidx + 1);</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">else if (!forward &amp;&amp; aCntidx!= 0)</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">cnt = controls.ElementAt(aCntidx &#8211; 1);</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">cnt.Focus();</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">}</span></div>
<div id="_mcePaste"><span style="font-weight: normal;"><span style="color: #ff0000;">注意：</span></span></div>
<div id="_mcePaste"><span style="font-weight: normal;"><span style="color: #ff0000;">如果焦点没有设置成功，请看下Focus()的返回值，因为只有其返回值为true的时候，才表明焦点设置成功。</span></span></div>
<div id="_mcePaste"><span style="font-weight: normal;"><span style="color: #ff0000;">为了能够设置焦点，必须满足以下4个条件：</span></span></div>
<div id="_mcePaste"><span style="font-weight: normal;"><span style="color: #ff0000;">Visibility 设置为 Visible。</span></span></div>
<div id="_mcePaste"><span style="font-weight: normal;"><span style="color: #ff0000;">IsTabStop 设置为 true。</span></span></div>
<div id="_mcePaste"><span style="font-weight: normal;"><span style="color: #ff0000;">IsEnabled 设置为 true。</span></span></div>
<div id="_mcePaste"><span style="font-weight: normal;"><span style="color: #ff0000;">控件必须在树中实例化（已激发 Loaded 事件，并且控件连接到作为 Silverlight 插件内容的根对象）。</span></span></div>
<div id="_mcePaste"><span style="font-weight: normal;">在调试程序的时候，发现如果其背景色为NULL，焦点也会设置不成功，或许这就是上面四点种的最后一个要求吧。<br />
</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">有什么问题欢迎大家交流，一起研究研究下。</p>
<p></span></div>
<div id="_mcePaste"><span style="font-weight: normal;">参考连接：http://betaforums.silverlight.net/forums/p/212221/501227.aspx</span></div>
<div id="_mcePaste"><span style="font-weight: normal;">http://msdn.microsoft.com/zh-cn/library/system.windows.controls.control.focus(VS.95).aspx</span></div>
<p></strong></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://wincn.org/post/346.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

