C#中XML和二进制的序列化

看书的时候,看到的。然后感觉书上的写的不清楚,于是自己写了一下。还真的有问题。 要进行序列化和反序列化,首先要定义一个可以序列化的类,方法是在类的声明前加上特性 [Serializable] 定义了一个简单的用户类,需要注意的是私有字段是不能序列化的,只有公有字段和公有属性才可以。如下 [Serializable] //特性,可以序列化 public class UserData { public string Name; public int Age; private string sex; public string Sex { set{sex=value;} get{return sex;} } public UserData() { } public UserData(string name, int age, string sex) { Name = name; Age = age; Sex = sex; } } 注意,书上有个例子没有给出默认的构造函数,实际测试时如果没有默认构造函数,是不能执行xml序列化的。注意。 然后就导入需要的命名空间。 需要导入 using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Xml.Serialization; 分贝对应文件操作,二进制序列化和xml序列化 为了方便,我封装了四个静态函数,用于实现序列化和反序列化。 //封装二进制序列化方法 public static void BinarySerialize(UserData user) { FileStream fs = new FileStream("user.bin", FileMode.Create); BinaryFormatter formater = new BinaryFormatter(); //执行序列化 formater.Serialize(fs, user); fs.Close(); } //封装二进制反序列化方法 public static UserData BinaryDeserialize() { FileStream fs = new FileStream("user.bin", FileMode.Open, FileAccess.Read, FileShare.Read); BinaryFormatter formater = new BinaryFormatter(); UserData user = formater.Deserialize(fs) as UserData; fs.Close(); return user; } //封装xml序列化方法 public static void XmlSerialize(UserData user) { XmlSerializer serializer = new XmlSerializer(typeof(UserData)); FileStream fs = new FileStream("user.xml", FileMode.Create); serializer.Serialize(fs, user); fs.Close(); } //封装xml反序列化方法 public static UserData XmlDeserialize() { XmlSerializer serializer = new XmlSerializer(typeof(UserData)); FileStream fs = new FileStream("user.xml", FileMode.Open); UserData user = serializer.Deserialize(fs) as UserData; fs.Close(); return user; } 代码比较简单。 最后是一个简单的测试。 ...

2012-07-07 · 1 min · bystander

Unable to read file Data_EGCITest解决方法

 今天做的是使用matlab进行协整检验,好吧。。听起来似乎很厉害的样子,其实,我也不太清楚协整到底是干嘛呢。不过经管的各位很给力。 想来协整检验matlab是可以做的。所以就去查matlab是不是有这个函数,结果是有的。egcitest,但是具体的参数还是景观的朋友看懂的。 早上3点多起床,看matlab的书,然后早上看完了。基本上熟悉了matlab的操作。然后就开始写这个。大致的流程和昨天的那篇文章是一致的。但是matlab生成的dll文件在C#里面调用始终会提示这样一个错误。: MWMCR::EvaluateFunction error ... Error using ==> load Unable to read file Data_EGCITest: No such file or directory. Error in => test.m 组合了几个关键字进行搜索,发现了这篇文章,翻译过来很简单。 错误提示说的那个Data_EGCITest是一个名为Data_EGCITest.mat的文件,位于$MATLABROOT/toolbox/econ/econ/Data_EGCITest.mat目录下,$MATLABROOT指的是你matlab的安装路径。在你build 工程的时候,在下图中,记得添加这个文件。 然后build生成的dll文件就可以正常在C#里使用了。 中间走了很多弯路。因为我想既然matlab都编译生成了dll,那么dll应该没问题。然后我就把精力放在了C#那边。。结果后来折腾了很长时间,才发现是这边的问题。。坑爹。。 协整检验的代码就不发了。和题目没关系。。 参考: http://www.mathworks.cn/help/toolbox/econ/egcitest.html

2012-07-03 · 1 min · bystander

C#调用MatLab实现N阶幻方

 MatLab的计算能力太强大了。最近需要通过C#来调用MatLab来进行一些计算,可是MatLab没用过。安装文件在我硬盘里躺了整整一年。 我们希望的是由外部程序调用MatLab函数。所以。希望可以完全脱离MATLAB环境,实现软件的快速开发。为此需要先介绍一下MCR。 MCR简介 MCR的全称是MATLAB Compiler Runtime,即MATLAB编译器运行时。是一个由MATLAB共享类库构成的执行引擎,他能够使MATLAB文件在没有MATLAB的机器上运行。这一点和.NET Framework相对于.NET程序一样,即为程序的运行提供了底层支持。当发布程序的时候,需要将MCR也打包进来,这样没有MATLAB的机器上也能执行,MCR随MATLAB软件一同发布,可以在MATLAB中输入命令“mcr”或者“mcrinstaller”获取其保存路径: >> mcr The WIN32 MCR Installer, version 7.15, is: D:\Program Files\MATLAB\R2011a\toolbox\compiler\deploy\win32\MCRInstaller.exe MCR installers for other platforms are located in: D:\Program Files\MATLAB\R2011a\toolbox\compiler\deploy\<ARCH> <ARCH> is the value of COMPUTER('arch') on the target machine. Full list of available MCR installers: D:\Program Files\MATLAB\R2011a\toolbox\compiler\deploy\win32\MCRInstaller.exe For more information, read your local MCR Installer help. Or see the online documentation at MathWorks' web site. (Page may load slowly.) 根据上面的运行结果,可知该文件的完整路径是: D:\Program Files\MATLAB\R2011a\toolbox\compiler\deploy\win32\MCRInstaller.exe MWArray API简介 MCR包含了文件MWArray.dll,该文件中的API承担了用户程序和MCR之间数据交换的任务,因此,每一个独立文件都需要包含对该文件的引用,否则程序就不能使用MATLAB中的函数,为使用该文件,需要先使用上一步找到的安装MCR,我安装在D:\Program Files\MATLAB\MATLAB Compiler Runtime目录,然后该dll该文件在安装完MCR后位于: D:\Program Files\MATLAB\MATLAB Compiler Runtime\v715\toolbox\dotnetbuilder\bin\win32\v2.0,名字是MWArray.dll, 另外,该文件中有两个重要的命名空间,MathWorks.MATLAB.NET.Arrays和MathWorks.MATLAB.NET.Utility,Arrays命名空间下的类提供从其他任何兼容CLS(Common Language Specification) 语言访问MATLAB中数组的功能,这些类支持数组格式化、类型的特定索引和错误处理的功能。而Utility命名空间下的类提供了对MWArray类架构和MATLAB公共运行时的托管API的通用支持。 实施 为了将MATLAB中的程序作为组件提供给其他.NET程序使用,需要做两方面的工作: 1.将M文件打包为与.NET兼容的程序集 2.在外部程序中添加对程序集的引用 MATLAB端的工作 以我这个功能为例。打开MatLab,然后File->New->Deployment Project.然后在Type里选择.net Assembly,Ok即可。我选择的工程名是test,注意,这个test就会生成一个名为test.dll的程序集,所以起个好名字,,我没起好。如图1 然后在图2的视图中定位到你选择的工程目录,并依次点击。 添加一个test.m的文件。图3 这个名称随意。但是要注意,这个名字必须和你里面将要写的那个函数名称一致,这个很好理解。好了以后,双击test.m就会打开。输入 function m=test(n) m=magic(n); end 创建一个test方法。该方法在C#调用的时候要用到,接受一个参数,然后输出一个幻方。保存关闭m文件,然后回到上图,双击test.prj也就是工程文件。 来到图4 点击Add Class,就是向test.dll的程序集中添加类。我添加了一个类叫做Func1.这个类用来在C#中创建一个对象,然后调用test(n)这个函数,然后出现Add Files,点击打开浏览框,把刚才写好的test.m选上。就可以了 最后看窗口右上角,,点击那个build图标就ok,等个几分钟,就会在目录里生成test.dll文件了。图5 VS端的代码 现在,打开vs,创建C#工程,添加两个引用,分别是MWArray.dll和test.dll,添加引用的方法就是在解决方案资源管理器中,的引用上,点击,然后添加引用->浏览->找到这两个dll,为了方便,我一般会把这两个dll复制到我的C#工程目录里,然后添加引用,如前面所说,MWArray.dll里有两个命名空间,我们使用using语句都添加上。也包括生成的test.dll using test; using MathWorks.MATLAB.NET.Arrays; using MathWorks.MATLAB.NET.Utility; 然后设计C#界面,很简单的拖一个界面,图6 然后单击事件代码: Func1 f = new Func1(); MWNumericArray na = null; MWArray[] ansArray = null; int i = Convert.ToInt16(textBox1.Text); ansArray = f.test(1, i); na = (MWNumericArray)ansArray[0];//只有一个数组返回 MessageBox.Show(na.ToString()); 看到test有两个参数,第一个参数是指返回结果书,我们只需要一个就好了。所以为1,后面那个是阶数了。运行结果如图7: ...

2012-07-02 · 1 min · bystander

C#中的is和as

is和as都是用作类型转换的,类型转换包括显示转换和隐式转换,在.NET中类型转换的基本规则如下: 基本规则 任何类型都可以安全的转换为其基类类型,可以由隐式转换来完成; 任何类型转换为其派生类型时,必须进行显示转换,转换的规则是:(类型名)对象名; 使用GetType可以取得任何对象的精确类型; 基本类型可以使用Covert类实现类型转换; 除了string以外的其他类型都有Parse方法,用于将字符串类型转换为对应的基本类型; 值类型和引用类型的转换机制称为装箱(boxing)和拆箱(unboxing)。 is和as操作符,是C#中用于类型转换的,提供了对类型兼容性的判断,从而使得类型转换控制在安全的范畴,提供了灵活的类型转换控制。 is的模式如下: 检查对象类型的兼容性,并返回结果,true或者false; 不会抛出异常; 如果对象为null,则返回值永远为false。 使用很简单,用于条件判断中. 举例: object o=new object(); if(o is ISSsample) { //转换 ISSample a =(ISSample)o; } as的模式如下: 检查对象类型的兼容性,并返回转换结果,如果不兼容就返回null; 不会抛出异常; 如果结果判断为空,则强制执行类型转换将抛出NullReferenceException异常。 as必须和引用类型一起使用 举例: object o =new object(); ASSample a=o as ASSample; if(a!=null) //do some work 参考:http://www.cnblogs.com/anytao/archive/2007/04/07/must_net_01.html

2012-07-01 · 1 min · bystander

C#中的Class和Struct

 什么是class? class(类)是面向对象编程的基本概念,是一种自定义数据结构类型,通常包含字段、属性、方法、属性、构造函数、索引器、操作符等。.NET中,所有的类都最终继承自System.Object类,因此是一种引用类型,也就是说,new一个类的实例时,对象保存了该实例实际数据的引用地址,而对象的值保存在托管堆(managed heap)中。 什么是struct? struct(结构)是一种值类型,用于将一组相关的信息变量组织为一个单一的变量实体 。所有的结构都继承自System.ValueType类,因此是一种值类型,也就是说,struct实例分配在线程的堆栈(stack)上,它本身存储了值,而不包含指向该值的指针。所以在使用struct时,我们可以将其当作int、char这样的基本类型类对待。 比较: 相同点:语法类似。 不同点: class是引用类型,继承自System.Object类;struct是值类型,继承自System.ValueType类,因此不具多态性。但是注意,System.ValueType是个引用类型。 从职能观点来看,class更多表现为行为;而struct常用于存储数据。 class支持继承,可以继承自类和接口;而struct没有继承性,struct不能从class继承,也不能作为class的基类,但struct支持接口继承 class可以声明无参构造函数,可以声明析构函数;而struct只能声明带参数构造函数,且不能声明析构函数。因此,struct没有自定义的默认无参构造函数,默认无参构造器只是简单地把所有值初始化为它们的0等价值 实例化时,class要使用new关键字;而struct可以不使用new关键字,如果不以new来实例化struct,则其所有的字段将处于未分配状态,直到所有字段完成初始化,否则引用未赋值的字段会导致编译错误。 class可以是抽象类(abstract),可以声明抽象函数;而struct不能为抽象,也不能声明抽象函数。 class可以声明protected成员、virtual成员、sealed成员和override成员;而struct不可以,struct可以重载System.Object的3个虚方法,Equals()、ToString()和GetHashTable()。 class的对象复制分为浅拷贝和深拷贝,必须经过特别的方法来完成复制;而struct创建的对象复制简单,可以直接以等号连接即可。 class实例由垃圾回收机制来保证内存的回收处理;而struct变量使用完后立即自动解除内存分配。 作为参数传递时,class变量是以按址方式传递;而struct变量是以按值方式传递的。 我们可以简单的理解,class是一个可以动的机器,有行为,有多态,有继承;而struct就是个零件箱,组合了不同结构的零件。其实,class和struct最本质的区别就在于class是引用类型,内存分配于托管堆;而struct是值类型,内存分配于线程的堆栈上。由此差异,导致了上述所有的不同点,虽然在某些方面struct有性能方面的优势,但是在面向对象编程里,基本是class横行的天下。 那么,既然class几乎可以完全替代struct来实现所有的功能,那么struct还有存在的必要吗?答案是,至少在以下情况下,鉴于性能上的考虑,我们应该考虑使用struct来代替class: 实现一个主要用于存储数据的结构时,可以考虑struct。 struct变量占有堆栈的空间,因此只适用于数据量相对小的场合。 结构数组具有更高的效率。 提供某些和非托管代码通信的兼容性。

2012-06-29 · 1 min · bystander

C#中的const和readonly

 本文来自《你必须知道的.NET》这本书,是我看书过程中的笔记整理。 不变的量是程序设计中的平衡剂,是系统中恒定不变的量,在.NET中提供哦你了两种方式来实现,const和readonly。其中,const是静态常量,readonly是动态常量。 const,readonly和static readonly定义的常量,一旦初始值指定,(包括在构造函数内指定初始值),将不可更改,可读不可写。 const必须在声明的时候指定初始值,而readonly和static readonly在在声明时可以指定,也可以不指定初始值,同时也可以在构造函数中指定初始值,如果同时在声明时和构造函数中指定了初始值,以构造函数内指定的值为准。 const和static readonly定义的常量是静态的,只能由类型来访问,不能和static同时使用,否则可能出现编译错误,而readonly定义的常量是非静态的,只能由实例对象来访问。可以显式使用static定义静态成员 static readonly常量,如果在构造函数内指定初始值,那么必须是在静态无参构造函数中。不同的构造函数可以为readonly常量实现不同的初始值。 const可以用于定义局部常量和字段常量,而readonly和static readonly不能定义局部变量,只能定义字段常量,实际上,readonly应该被称之为只读字段,因此局限于定义字段,而const才是常量,可以定义字段和局部量。 const常量编译后保存在模块的元数据中,无需在托管堆中分配内存,并且const常量只能是百年机器能够识别的基元类型,比如Int32,string等,而readonly需要分配独立的存储空间,并且可以是任意类型。 const只能应用在值类型和string类型上,其他引用类型常量只能定义为null,否则以new为const引用类型常量赋值,编译器会引发“只能用null对引用类型(字符串除外)的常量进行初始化”错误提示,原因是构造函数初始化是在运行时,而非编译时,readonly只读字段,可以是任意类型,但是对于引用类型字段来说,readonly不能限制对该对象实例成员的访问控制。 总结:尽可能以只读属性来实现对类型读写特性的控制,而不是只读字段,但是在某些情况下,只读字段更简化些。 const是编译时常量,readonly是运行时常量,const较高效,readonly更灵活,在应用上,推荐以static readonly代替const,以平衡const在灵活性上的不足,同时克服编译器优化const性能时,所带来的程序集引用不一致问题。

2012-06-28 · 1 min · bystander

对不起,我等不了你了

 这不是我写的,这篇文章也不是讲爱情的,来自XuTuo的方式,大学生活。人生理想。不错的文章。收藏分享之。 很多事很多人你觉得对你很重要,会在你的一生中留下不可磨灭的印记,却总在你的渐行渐远中云淡风轻。 大一的时候不写高考,因为年少轻狂中带有那么点不可一世的自尊心。大三的时候写不出高考,因为想再提起时已经变成愈加模糊与苍白,甚至还有点可笑。那时候的你已经开始忙着考研或者找工作,忙着褪去象牙塔里那张不老的脸,忙着一个人或者两个人的未来。 后来觉得有必要在这个稚嫩的末尾画上一个走向成熟的句号,在夏天还没到来的时候。 两年前你迷茫着要走上那条路,两年后你迷茫着这条路会走向哪里。 学生生涯是一个很美好的时刻,当然这种美好往往得等失去了才知道珍惜。就像记忆中的高中班主任总是苦口婆心地告诉我们,拼一拼,过了这一个月,你们就解放了。年幼的人有种向往年长人的生活的冲动,这种原始的冲动就像小时候注册QQ的时候总喜欢把年龄放大到十八岁,好像花季雨季里总会有那么些纯纯的爱恋等着我们。而直到了那个季节才发现原来小说里都是骗人的,这里除了长个不停的青春痘还有做不完的作业与考不完的试,爱情是战乱里的奢侈品,珍贵且易碎。 一群刚考完试的高考生们疯狂地撕掉课本,然后撒向天空大吼说:“我终于解放了!”接下去的几天里他们不停地聚会,不停地唱K,不停地喝酒,不停地网路短信暧昧,然后接下来是高中“革命一辈”的“生离死别”。 说着一生一世的誓言走上两条反方向的路,我喜欢那个时候忽明忽暗的爱恋,喜欢就是喜欢,不喜欢就是不喜欢,表白的那个男生可能以后会考上一所名牌大学,毕业后能当上国家公务员,家里供有着一套以及一套以上的房子让他结婚。但不喜欢就是不喜欢,因为他胖,他油性皮肤,他的校服一个礼拜都没洗,还有,他的字不好看。 接着他们如愿以偿地上了老师口中的“由你玩四年”。这是一个很不负责任的谎言,并且被我们尊重的老师屡用不止,就好像你在吃一根玉米,你啃到第三排的时候已经吃不下了,然后一个人告诉你说越往后越好吃,逼你不得不继续往下吃,然而你却逐渐感到反胃,旁边的人说一开始不习惯,慢慢地就会好了,你相信了,硬着头皮往下吃,直到吃完最后一颗时你才发现这根玉米原来压根就烂了,你吐了三天拉了三天后却忘记了自己当初吃玉米的缘由,只剩下一堆无尽的怨言。 银行卡里的生活费准时的打来,人民币上毛爷爷微笑的脸使你渐渐淡忘了家中父母的样貌,你终于有了支配财富的能力以满足你的愿望,这像是一种迟来的报复般让你有种快感,然而当这种权利到手时你却感到一种迷茫与不真实。小时候的你一直暗下决心说等长大了有钱了就要买一大堆零食,结果现在如愿了,但面对超市柜台前满满的零食,你却如何也抬不起兴趣。 生活像是一场黑色幽默的电影,越往后越是笑得想哭出来。 周围的同学渐渐都恋爱了,有几对是新结连理,有几对则是异地的革命伉俪。你开始也心动了,心猿意马地看着校道上那一双双白花花的大腿,你的下半身逐渐代替了上半身的思考能力,你只是不想一个人过了,这样的生活让你感到孤单,无趣,甚至还有那么一点的自卑。高中时你曾经喜欢过一个女生,每当她走过你们班级的窗前你的心跳都会加速得快要蹦出来,那种奇妙的感觉让你喜欢着又害怕着,她就像你心目中的女神一样。那天晚上你终于下了好大的决心发了条短信给她,“在干吗?”“没啊,你呢?”你们有一搭没一搭地聊到了深夜却都心照不宣地不捅破内心的青春情怀。暧昧总是美好的,你以前老是不懂什么叫“人生若只如初见。”现在你渐渐懂了,以后你会更懂。 大学的爱情却让你逐渐感到些许恶心与廉价,前些天你看上一个不错的女生,找了人打听到了她的电话号码,头一句便问她:“你有男朋友吗?”她说,有。之后你便不再回复了。你开始忙了起来,因为你必须马不停蹄地找到下一个猎物。什么时候你失去了等待和耐心爱一个人的能力,你说不上来,在行色匆匆中搪塞着,晚了就找不到对象了。 大学的第一个新年里几个同学在老师家聚会,大家寒暄着暖场,讲着那个陌生地域的生活,有人说得眉飞色舞,有人说得黯然神伤,但却没有人知道明天会怎样。 父母们不再会催你赶紧读书了,你终于有了足够的时间玩游戏,看电视。无论你做什么他们都会一脸慈爱地看着你,有时甚至你自己都过意不去,你觉得是不是他们还会像以前帮你报个补习班或者训练营,结果没有。他们只是老了,累了,你终于考上了他们曾经仰望着的大学,他们感到很欣慰,惟愿你一切安好。 大学却依然在继续着,高考后的第二个夏天来临时你开始有些许羡慕地看着那群刚刚高考完的准大学生们,你听他们喊着你喊过的口号,过着你过过的生活,经历着你的曾经。你喜欢他们那种充满希望的眼神里闪烁着的光,只是你的眼角边不知什么时候多了条皱纹。 你开始得打算自己要往哪个方向发展了,这一年里你旷了将近四分之一的课,每天睡了有十个小时的觉,你交了两个女友,却还不到三个月的时间,到了大一结束的时候你才勉强能念出自己专业的全名,却仍不知道这个专业到底教的是什么。父母们常在你耳边旁敲侧击地说着一些称之为“现实”事情,比如谁谁家的女儿嫁了个好人家,谁谁家的孩子考上公务员后待遇很好。你烦了,爹妈不高兴了,他们会说你已经二十岁了,你则说你的事自己会处理好,但事实上你却依旧迷茫:未来在哪里? 跨入大二前你曾暗下决心要好好学习,就如打仗前的誓师般悲壮。然而在坚持了两个礼拜后却又开始了之前的生活循环,在新的一年里的慢慢发现了身边的人慢慢变了,有的人依旧每天叫上你一起去喝酒玩乐,有的人则一早上就出去,直到晚上才回来,他抱着书,你抱着酒瓶。你们的生活从这里开始分离开来,多年之后你会后悔,但却忘了当初是谁拿起那把剪子分道扬镳。 大二的那个圣诞节里你度过了大学的第三次失恋,你听了一天的《圣诞结》并骂着甩你的女生现实,势力。然而你的舍友却在同一天表白成功了,他和你一样,没有背景,没有一个可以拼的爹,你们曾经在同一条起跑线上,然后现在却互相看不到彼此的身影。你在网上刷了一天的微博看到了那么一句话:“永远不要低估一个女生和你同甘共苦的决心。”你冷冷一笑,关了电脑,却没看到下本句写的:“一个女生最怕的,是在你身上看不到希望。” 大二上学期的春节来临时父母还为你的回来准备着大鱼大肉,貌似什么都没变,但貌似什么都变了一点,就像你的压岁钱不知怎么就少了,几个小外甥甚至还嚷着:“舅舅,给我红包!” 过了这个年你戏谑着自己走在奔三的路上,在回学校的时候父母到车站送你,你突然发现他们的脚步什么时候变慢了,你已经走了好远他们怎么都跟不上,那一刻你突然感到一种前所未有的孤独,就好像曾经可以依靠的肩膀都不在了。 这个春天你觉得怎么过得那么快,你说你已经不打游戏了,不打牌了,也不常和朋友出去玩了,你说你制定了一个计划,但为什么日子还是过得那么快,白天转眼就是黑夜。 就像又到了一年的高考时。 我等不了你了,少年。

2012-06-27 · 1 min · bystander

C#WinForm实现不规则窗体

这个纯属娱乐,因为其实用的不是太多,因为非主流,非标准的界面不符合用户的体验,不符合可用性功能的某一条HE规则。 为了完成这个效果,首先需要自己动手画个你需要的界面出来,界面边缘需要是一种可以很好区别的颜色,比如纯蓝色,因为实现不规则窗体是让C#使边缘颜色透明化来实现的,所以需要唯一识别。因为我用的图是一张灰色的图,我然后圈了一个蓝色的边缘。 刚开始的图; 然后新建windows应用程序。创建windows窗体并设置窗体基本属性。 (1)将 FormBorderStyle 属性设置为 None。 (2)将窗体的 BackgroundImage 属性设置为先前创建的位图文件。不必将文件添加到项目系统中;这将在指定该文件作为背景图像时自动完成。 (3)将 TransparencyKey 属性设置为位图文件的背景色,本例中为蓝色。(此属性告诉应用程序窗体中的哪些部分需要设置为透明。 ) 上面两个步骤已经完成了不规则窗体自身显示效果的制作。 有人说在24位色以下的环境中可以显示正常,但在24位色以上时黄色背景不能消失,所以上述不能胜任24位色以上环境。但我看到了一种解决方法,那就是先将背景图片添加到资源文件,然后在窗体构造时为窗体设置背景图片: private void Form1_Load(object sender, EventArgs e){ Bitmap bmp = Properties.Resources.form2; bmp.MakeTransparent(Color.Blue); // bmp.MakeTransparent(Color.FromArgb(2,2,2));如果rgb则是这样用 this.BackColor = Color.Blue; this.BackgroundImage = bmp; this.TransparencyKey = Color.Blue; } 实测是可以的。 然后就是为窗体添加移动、关闭、最大最小化的事件。代码直接给出 private bool isMouseDown = false; //记录鼠标是否被按下 private Point position; //记录鼠标位置 private void Form1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { int x = -e.X; int y = -e.Y; position = new Point(x, y); isMouseDown = true; } } private void Form1_MouseMove(object sender, MouseEventArgs e) { if (isMouseDown) { Point newPosition = Control.MousePosition; newPosition.Offset(position); this.Location = newPosition; } } private void Form1_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { isMouseDown = false; } } 还有其他一些比如关闭按钮的添加,都很简单,直接添加一个button,事件里写,两个选一个。 this.Close();//关闭此窗体 Application.Exit();//退出应用程序 我最终的效果是个圆,可以看到,锯齿很明显,我想要效果好的话,那个位图得好好设计。这个只是演示。。所以。。还有一种方法是链接1中提供的,有兴趣的可以试试。 工程源码下载:IrregularForm.7z 参考: http://www.cnblogs.com/KissKnife/archive/2006/10/02/520116.html http://allancandy.cnblogs.com/archive/2005/09/01/227814.html

2012-06-21 · 1 min · bystander

FreeAnony-代理采集设置工具

这个名字确实有点不太好。。因为刚开始我想到这个工具是在今天早上看到一个别人的代理工具的时候,突然想做的,没有好好规化,结果后来代码越写越多。。不过收获很大。 先看界面,因为是简单实现一下,所以就不要吐槽界面了。。 刚开始想的思路就是先去一个经常发布代理IP的网页去采集。然后解析成一条条的信息。然后显示出来。中途遇到几个问题,一个就是在做代理验证的时候,没有用多线程,导致直接界面无响应。另一个就是DataGridView控件要实现对一个数组的绑定,需要的一个实体对象。 public IPEntity[] GetIpInfo(string url) { //获得网页源码 string content = Get_Http(url); //定位代理ip位置 int start = content.IndexOf("</strong></u></a><BR>"); int end = content.LastIndexOf("<BR><SCRIPT type=text/javascript>"); //提取并去除一些冗余代码 string subContent = content.Substring(start, end - start).Substring(21); subContent = subContent.Replace("&nbsp; dn28.com", ""); //通过br标签分隔代理列表为数组 string[] sArray = Regex.Split(subContent, "<br>", RegexOptions.IgnoreCase); IPEntity[] list = new IPEntity[sArray.Length]; int j = 0; foreach (string i in sArray) { int addrpos = i.IndexOf(":"); string ipaddress = i.Substring(0, addrpos); int portpos = i.IndexOf("@"); string ipport = i.Substring(addrpos + 1, portpos - addrpos - 1); int typepos = i.IndexOf(";"); string iptype = i.Substring(portpos + 1, typepos - portpos - 1); string ipcountry = i.Substring(typepos + 1); list[j++] = new IPEntity(ipaddress, ipport, iptype, ipcountry); } return list; } 这部分就是先得到网页源码,然后通过IndexOf和LastIndexOf定位到ip组的位置。这是通过分析源码来确定参数的。最后通过 标签分割成字符数组。数组元素类似于112.25.12.37:80@HTTP;江苏省 移动,然后就是继续分割成一部分,构造了一个IPEntity的数组。在按钮中绑定到DataGridView中即可 IPEntity类的定义如下:这里面设置了一个status属性,用于后面代理验证的时候进行标记。 public class IPEntity { string _Address; string _Port; string _Type; string _Country; string _Status; public string Address { get { return _Address; } set { _Address = value; } } public string Port { get { return _Port; } set { _Port = value; } } public string Status { get { return _Status; } set { _Status = value; } } public string Type { get { return _Type; } set { _Type = value; } } public string Country { get { return _Country; } set { _Country = value; } } public IPEntity(string Address, string Port,string Type,string Country) { this._Address = Address; this._Port = Port; this._Type = Type; this._Country = Country; } } 然后是验证ip可用性的部分。这部分主要的代码是验证DataGridView中的ip地址可用性 ...

2012-06-17 · 2 min · bystander

属性文法

 我们知道,许多编译程序采用属性文法和语法制导翻译方法对语义处理工作进行比较规范和抽象的描述。 而一个属性文法包含一个上下文无关文法和一系列文法规则,语义规则是指:对于文法的每个产生式都配备了一组属性的计算规则 语义规则附在文法的每个产生式上,而语法制导翻译是指在语法分析过程中,完成附加在所使用的产生式上的语义规则描述的动作。 ·语法制导:基于语法分析中用到的文法产生式 ·翻译:完成语义分析的各项功能,不仅指生成中间代码 形式上讲,一个属性文法是一个三元组,A=(G,V,F),其中G是一个上下文无关文法;V是有穷的属性集,每个属性与文法的一个终结符或非终结符关联,属性加工的过程即是语义处理的过程。F是关于属性的属性断言或一组属性的计算规则(称为语义规则)。断言或语义规则与一个规则式关联,只引用该规则式左端或右端的终结符或非终结符关联的属性。形式化的东西看看就好,后面给出具体例子分析。 既然称之为属性文法,那么什么属性呢。这些属性代表与文法符号相关信息,比如它的类型、值、代码序列、符号表内容等等。属性与变量一样,可以进行计算和传递。可以类比我们平时写代码时候一些成员变量。。属性又分为综合属性和继承属性。 n在一个属性文法中,对应于每个产生式A→a都有一套与之相关联的语义规则,每条规则的形式为: b:=f(c1,c2,…,ck),只有在已知 c1-ck 值的基础上,才能计算属性值 b, 称属性 b 依赖于属性 c1-ck,至于c1-ck依赖于哪个,就得看由c1-ck在左侧的规则了。也就是看下面的规则了。 这里,f是一个函数,而且或者 1. b是A的一个综合属性并且c1,c2,…,ck是产生式右边文法符号的属性,或者 2. b是产生式右边某个文法符号的一个继承属性并且c1,c2,…,ck 是A或产生式右边任何文法符号的属性。 属性b依赖于属性c1,c2,…,ck。 属性文法中常用记号N·t表示与非终结符号N相关联的属性t。 注意:¨终结符只有综合属性,由词法分析器提供 ¨非终结符既可有综合属性也可有继承属性,文法开始符号的所有继承属性作为属性计算前的初始值 ¨在语法树中,一个结点的综合属性的值由其子结点的属性值确定。一个结点的继承属性由此结点的父结点和/或兄弟结点的某些属性确定 根据包含的属性类型,属性文法分为:S-属性文法和L-属性文法 S-属性文法是仅包括综合属性的属性文法;L -属性文法是包括综合属性和继承属性的属性文法。 给出一个简单的实例说明上面的内容: 考虑非终结符A,B和C,其中,A有一个继承属性a和一个综合属性b,B有综合属性c,C有继承属性d。产生式A→BC可能有规则 C.d:=B.c+1 A.b:=A.a+B.c 而属性A.a和B.c在其它地方计算 为什么是这样的,因为此时A就是A,B是X1,C是X2,对于d来说,他是产生式右部C的一个属性,c是右部B的属性,属性d依赖于属性c,和1,所以它是C的继承属性,对于c来说,他是产生式右部B的一个属性,但是c不依赖于d,而是d依赖于c所以c属性类型无法确定,对于b,他是A的一个属性,并且a是A的属性,c是产生式右部的属性,所以b是A的综合属性,而对于a,因为不能确定a属性依赖于那个属性,所以。无法得知。从上面我可以得出一个规律,对于一个属性规则来说,一条规则只能确定其左侧的属性类型,而右侧的属性需要由一个由他在左侧的规则来确定。比如,可以看到上面的规则中,c和a都不能确定,就是因为在规则右侧。 此部分可能理解不够深刻,如有错误欢迎指正。 参考: http://jpkc.hdu.edu.cn/computer/byyl/online/5-2.htm http://metc.gdut.edu.cn/compile/nandian/n-8.htm

2012-06-08 · 1 min · bystander