bitfan(数字世界一凡人)的专栏

在新浪博客的新家:http://blog.sina.com.cn/bitfan

原创 《编程的奥秘》读者问答(时时更新)收藏

新一篇: 公布《编程的奥秘》配套升级版《.NET 2.0面向对象程序设计(VB2005篇)》写作构想及全书目录 | 旧一篇: Basic :“青春长驻”还是“菜鸟陷阱”

以下将我收到的邮件中读者常问的问题进行统一回答。欢迎读者反馈各种意见。

(有关问题我会以评论的方式及时在此跟贴,时时更新)


问:

您好,金老师,我是贵书《编程的奥秘》的读者,虽然还未读完,但能感受到您对编程的热情以及对教育事业的努力,请允许我说一声“谢谢”,下边说一下我在读贵书时遇到的困惑。

环境:win2000pre+VS.NET 2003
问题:几乎每个例子编译时都会提示:“未处理的“System.ArithmeticException”类型的异常出现在 system.drawing.dll 中。其他信息: 算术运算中发生溢出或下溢。”
,之后我请教过别人,但他们的办法我试后无效。我曾怀疑是编译器的问题,但在网上DOWN了三个IOS文件,安装后出现同样的问题,另外,我按书中打源代码编译时问题一样出现。您经验比我丰富,或许知道问题的原因,所以我发信一封想您请教。

恳请金老师帮忙,为谢!!!

回复:
如果是每个例子都无法编译,那只能肯定是VS.NET未安装好。最简单的办法是安装一个“干净的”的Windows,然后先安装VS.NET,成功以后再安装其它软件。另一原因是病毒影响,GDI+(刚好在System.Drawing.DLL中)有个漏洞,可被病毒利用,微软发布过相关补丁。
--------------------------------------------------------------------------------------------------------

问:
今天把您的著作粗略的读完了,信心很足,打开vs.net准备写点东西.
但是一开始就遇到了麻烦,虽然解决了但是心中还存有疑虑
 
'点击按钮出现一个窗体

Private fm1 As form1
If fm1 Is Nothing Then
fm1 = New form1
fm1.Show()
End If
这样的话,当新窗体关闭后,再点击按钮就不出现新窗体了


Private fm1 As form1
If fm1 Is Nothing OrElse fm1.IsDisposed Then
fm1 = New form1
fm1.Show()
End If

加上OrElse fm1.IsDisposed 的话就正常了

关闭窗体不就是销毁窗体了嘛?为什么还要判断IsDisposed ,不能只判断nothing呢?

也就是说当实例窗体关闭(点右上X关闭)后 fm1不是nothing嘛?

答:
关键在于.NET的垃圾回收机制。与C++不同,在VB.NET中将一个窗体关闭之后,并不会立即销毁它,并回收其资源,而只是打上了一个“不用”的标记(IsDisposed =True),等到垃圾回收进程运行时,这些对象才会被真正地销毁,在此之前,frm1<>Nothing。
---------------------------------------------------------------

问:
今天遇到一个困惑,我把书上215~217上的程序敲入,准备运行,但是运行后点击"从数据库获取数据按钮后",出现了"未处理的“System.Data.OleDb.OleDbException”类型的异常出现在 system.data.dll 中。
"的错误提示.此时程序执行到da.fill(dt)这一行.

请金老师百忙之中抽空看一下.

另外,程序中" da.SelectCommand = comm"不是很理解. 为什么不是 da.SelectCommand = comm.commandtext呢?


答:
有非常多的错误会引发这个异常,常见的原因是SQL命令的格式有误。
    另外,OleDbDataAdapter的SelectCommand属性接收一个OleDbCommand类型的对象,此对象用于从数据库中提取数据。
    第七章中有详细说明,请参看7.4节。
----------------------------------------------------------
问:
您好,我是一位江苏无锡的读者,对您的著作甚是喜欢,但是其中也有不明白的地方,请指教:

P130页  “两个SUB过程,为什么传值后tempobj与obj指向的对象还是同一个,而引用后就不同了。”
看了您作出的解释但是不是很明白,能否请您在百忙之中再给我详细解释一下呢?

答:
  对象变量其实可以看成是一个整数变量,只不过它存放的“整数”很特殊,是内存地址值。
    dim obj as new RefVal
    这句执行后,在内存中创建了一个“大”的区域,用于存放以类RefVal为模板创建的对象(一个类可以创建任意多个对象)数据,存放这些数据的第一个内存单元的地址被放到变量obj中(如果把内存单元看成是小屋子,则内存地址可以看成是门牌号),假设其为ABCD。
    所以,Obj.i=100的含义是到地址为ABCD的内存单元处开始寻址并找到变量i的区域,将其改为100.
    当obj作为参数被传送到Sub ChangeObjByVal()中时,一个隐含的整数对象被创建,其值与obj相同,也为ABCD.
这样,在Sub过程内部使用的Obj其实与Sub过程外的Obj是两个独立的整数对象。只不过其值相同,都代表着真正的RefVal对象数据的首地址。
    但在这个过程中,RefVal对象本身并没有被复制一份,被复制的只不过是它的首地址数据(如ABCD)罢了。
    在Sub ChangeObjByRef()中,与上不同之处在于在Sub ChangeObjByRef过程内使用的obj变量与过程外的是同一个,不存在地址值的复制问题。是否会将参数复制一份,这就是ByRef与ByVal的区别所在。
    呵呵,希望我讲清楚了。请再回头看看P84页的相关内容。

再问:
但是 Sub ChangeObjByVal()中 "obj=new refval"这句话不是又重新初始化了实例啊
这时obj.i=0啊,难道 这个obj和sub外的obj不是同一个?

再答:
凡是以ByVal方式传送的参数都被复制了一份。所以,在Sub ChangeObjByVal()中的obj和Sub外部的obj不是一个。
obj=new refval"这句话确实重新初始化了实例,但它的修改不影响Sub外的obj变量。

2月25日 更新

问:读这本书要求有哪些基础

我主要是针对大学低年级学生的知识结构来组织材料的,对读者知识水平的最低要求是高中毕业。如果是在校大学生,并且是计算机及相关专业的,则最合适不过。书中涉及到了一些数学知识,超过了高中数学的范畴,跳过就行了,不影响书的学习。

问:书的定价是否过高?

许多经济不宽裕的读者来邮件抱怨书价过高,但书价是由出版社定的,作者无能为力。一名山东的读者来邮件说他省下了一星期的早餐买下了这本书,我很感动,但身体是革命的本钱,还是要注意保重健康的。学习软件开发是需要有一定的物质保障的,如果您没有上机的机会,那么,这本书所介绍的许多东西是难以掌握的。在写作时,我是假设读者能有一台用于开发实践的电脑的,如果能上网就更好了。如果个人经济条件不具备,我想还是从现实出发,先考虑如何立足自己的实际,把生活过好来,学习软件技术未免有点脱离现实了。

问:为何不用C#作例子?

主要原因就是我一直使用VB.NET开发,因此,积累的代码实例是VB.NET的,实在没有时间将其转化为C#。而且本书主要强调的是编程的思想、方法与相关的计算机理论,语言不是重点,读者可以按照本书介绍的次序去自学C#,一样是没问题的。

问:哪儿有卖这本书?

主要是大中城市的科技书店,小城市与县城书店恐怕不会进这本书,这些地方的读者可以通过网上书店订购,或者直接联系电子工业出版社博文视点公司看看能不能邮购。

问:老师能不能指导我学习软件技术?

很多读者要求我能指点指点。如果您在北京,我每个学期都在北京理工大学开设.NET选修课,可以直接到学校来听课(开放的)。外地读者如果有困惑,可以发邮件,问得多的问题我统一在这个BLOG上回复,另外,我也只是半桶水,说的话仅是个人观点,很害怕“误人子弟”,如果观点有错误,也请大家原谅。由于收到的邮件较多,可能不一定回复,在此也敬请读者谅解。

问:买到你的书了,感觉前几章有些凌乱,把人的脑子搞的乱乱的,有东一鎯头西一棒子的感觉,并不是围绕着一个例子从头到尾的叫,让人很别扭呀,不好意思,我有话直说啦.

请回头再仔细看看《自序》中对全书结构的说明。软件本就是一个“集成”的产物,一个程序其实是多种技术的组合,各种具体的知识点相当于七巧板中的七个构造块,并无主从关系,而程序本身就相当于用七巧板拼出的图案,整个关键在于七巧板模块间组合的方式。所以我才采用这样的组织方式写书。

发表于 @ 2006年02月25日 22:25:00|评论(loading...)|编辑

新一篇: 公布《编程的奥秘》配套升级版《.NET 2.0面向对象程序设计(VB2005篇)》写作构想及全书目录 | 旧一篇: Basic :“青春长驻”还是“菜鸟陷阱”

评论

#dynamic 发表于2006-03-06 20:43:00  IP: 59.191.22.*
VB.NET和C#有什么区别吗?我们看的是代码背后的思想,而不是组成代码的字符.在我的眼里,这本书VB.NET写还是用C#写是不重要的
#bitfan 发表于2006-03-21 17:03:00  IP: 211.68.13.*
to 段兴传:
国内的教材,“精简”可谓是主要特色,但一精简下来,书的阅读难度直线上升,拿《离散数学》来说,北大耿素云的可谓典型,再与国外的《离散数学及应用》相比,大多数更愿意看后者。虽然后者的厚度是前者的2倍。
Deitel的《Java大学教程》也是巨厚无比,还分上下册。
我写这本书时,在写作风格是的确有所考虑。
其实,“精简”的书远比“大白话”的书好写。我要采用传统的大家熟悉的方式去写,的确书可以薄不少,但阅读的乐趣会少很多,至少,我在看北大《离散》的时候,薄薄一页都看得痛苦不堪,而类似的编程书,比如钱能的C++,能自己坚持看完全书的恐怕不多。
写书就要有特色,我这种写作风格是一种尝试,从国外教材中得到了很多启发,但也有自己的创造。我03年写过一本《网站建设教程》,典型的大学教材,29元,也先后有十几所院校选用,但无任何新意。
这本书定价是出版社定的,事先并未正式征询作者的意见。
这本书虽然厚,写价高,但我可以很负责任地说,厚主要是因为内容多,涉及面广,其中的“废话”恐怕不多。
#段兴传 发表于2006-03-21 14:58:00  IP: 218.22.160.*
我去书店反复看三次了。还是决定不了买不买。

在国内,一本这样的书,定价65,太脱离实际了。我想作者自己应该很清楚。虽说你左右不了,但卖的是你的书。之所以这么贵,与作者你自身有很大的关系,纸张,排版,等等。如果适当精简,我想完全可以控制在50到60左右。

计算机类的美国人教材,这样的经典,也不过是50左右的定价。

这本书,不错。但价格和价值有些背离。
#段兴传  发表于2006-03-23 16:53:00  IP: 218.22.160.*
很好。谢谢你的评论。我这几天刚开始学VB.NET.呵呵。我有过其他一些语言的编程基础比如C++。正在寻找VB。NET的入门教程。我实在头大。现在还是下定决心用你的书作为入门教程了。

你的风格其实我很欣赏。只是一直对书价有微词。祝福你!

#段兴传 发表于2006-04-01 09:31:00  IP: 218.22.160.*
金老师:
你好!向你请教几个问题。
1。我用vb.net写了一个小程序。功能就是检测内存中的可疑进程,然后杀死。在具有admin权限的帐户里可以正常执行。若在受限的帐户里,就无法执行,因为我要kill的进程,有的是system帐户创建的,所以执行时程序没有权限,比如mssearch进程。我现在想请教你的是,如何在程序中实现这样一个功能:程序启动时会判断当前帐户的类型。若是受限,就切换到admin。这个可难可不难。我只想知道,我如何在程序代码中将系统权限传递给它?
或者,如何让这个程序无论在什么帐户下,都是由admin帐户运行它? 事实上,这两个方法本质上是一个。可我就是不知道如何实现。希望金老师有空时能给予解答。

2。我最近两个星期开始学习vb.net了。我此前只学过简单的C和C++。没有任何编程基础。对VB也一窍不通。现在我想请教的是,作为我这样一个没有任何RAD开发经验,甚至从来没有学习任何有关vb编程的的人,是从vb2005开始,还是选择vs2003做为开发平台?我看过一些资料,说b2003是真正的OO语言。而vb2005为了照顾以前vb6开发者的习惯,语法又退回到vb6了。那我这样一个没有任何vb使用经验的人,是不是应该选择vb2003呢?这个困惑也是我周围几个准备学习vb.net的朋友的共同困惑。希望金老师能给予解答。我好做出判断。vb2003和vb2005,是仅仅开发环境的改进,还是语法方面的变化?我们该如何选择?

我的EMAIL: xingchuanduan@gmail.com

#bitfan 发表于2006-04-01 21:12:00  IP: 211.157.213.*
to 段兴传:
(1)关于用户权限的问题,据我所知,在Windows现有的权限机制基础之上,.NET提供了更多的权限控制手段。而且2.0比1.1在权限管理上有较大的变化,更严格了。NT平台上,Windows提供了一组API(好象被称为Active Directory),可以调用Windows的权限管理子系统功能,但抱歉,我没有仔细地研究过这个领域。你可以到论坛上去问问这方面的高手。
(2)关于VB2005,2003的功能它都有,但同时又提供了原先VB6有,而2003去掉的特性。我写了篇文章《Basic:“青春长驻”还是“菜鸟陷阱”》,就在本站BLOG上,你可以去看看。
VB2005在OOP特性上比VB2003有所增强,通过它来入门是完全可以的,只需要注意不要采用VB6原有的编程风格来开发就行了,毕竟现在已是面向对象开发为主流的时代。
#段兴传 发表于2006-04-02 18:37:00  IP: 218.22.160.*
非常感谢金老师的解答!... (也对得起我买您的书了.. 呵呵,开个玩笑!)

继续问题1:我想金老师可能误解我的意思了,也可能是我没表达好。请容许我再把问题换种方式描述。

平时,如果我们在受限帐户里安装各种应用程序时,一般会出现两种情形。一种是弹出一个对话框,提示无法安装,无法写入注册表之类,然后程序结束。我们就必须切换到具有admin权限的帐户内重新安装。另一种情形就比较智能,会弹出一个窗体,让我们输入系统管理员的密码,然后就可以象在admin帐户内一样安装该程序。后一种情形比较少,大部分都是前者,比较粗暴,检测到无法写入注册表,就关闭程序。

当我执行我写的这个进程检测软件时,它会检测我是否具有系统管理员权限,若没有,也会弹出一个对话框,让我输入系统管理员密码。然后就可以以系统管理员身份执行,然后杀死内存中的一些进程。

现在关键是,如何让它判断我是否是系统管理员?我采用的是try catch语句,如果在受限帐户下执行时,就会抛出一个异常。我就可以在catch里进行处理,此时程序会弹出一个窗体,让我输入系统管理员密码。当程序接收到这串字符后,怎样利用我赋予的这串密码,切换到系统管理员身份呢?

真心希望金老师能给予帮助。可能我的问题很幼稚,但希望你能原谅。我学习编程才一个多月...... 学习vb.net才2个星期,头几个星期我学了一阵子C++,后来立刻不学了,因为学习坡度太大,我只是业余爱好,感兴趣才学编程。所以,就立刻转到了VB.net。到目前为止,除了那个著名的hello world入门程序外,我编的第2个程序就是这个进程检测软件,就遇到了这样一个麻烦... 真的非常郁闷。我把我的程序清单附录如下,非常简陋,让金老师见笑了。

Public Class Form1
Inherits System.Windows.Forms.Form

#Region " Windows 窗体设计器生成的代码 "

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'此处为空,窗体加载时不执行任何动作
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

Try
Dim manyProc(), Proc As Process
manyProc = Process.GetProcesses()
For Each Proc In manyProc
If Proc.ProcessName = "snmp" Then
Proc.Kill()
End If
Next
Me.Close()
Catc
#dxc 发表于2006-04-03 04:51:00  IP: 218.22.160.*
金老师,我在msdn里终于找到几个WinAPI函数。

BOOL ImpersonateLoggedOnUser(
HANDLE hToken
);

BOOL LogonUser(
LPTSTR lpszUsername,
LPTSTR lpszDomain,
LPTSTR lpszPassword,
DWORD dwLogonType,
DWORD dwLogonProvider,
PHANDLE phToken
);

BOOL SHCreateProcessAsUserW(PSHCREATEPROCESSINFOW pscpi);

BOOL CreateProcessAsUser(
HANDLE hToken,
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);

BOOL CreateProcessWithLogonW(
LPCWSTR lpUsername,
LPCWSTR lpDomain,
LPCWSTR lpPassword,
DWORD dwLogonFlags,
LPCWSTR lpApplicationName,
LPWSTR lpCommandLine,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCWSTR lpCurrentDirectory,
LPSTARTUPINFOW lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInfo
);


你能告诉我如何在VB.NET里调用这些API函数吗?有的形参我知道数据类型是string,可是有的就不知道该是什么类型,这样我就不知道该如何声明。
另外,在调用时,我也不知道该具体如何赋值。

希望你能告诉我如何在vb.net里使用这几个WINapi函数,谢谢。
#bitfan 发表于2006-04-03 19:45:00  IP: 211.68.9.*
呵呵,dxc找的API函数好象正好可以解决段兴传的问题。
关于在.NET中调用Win32 API的方法,必须首先使用Declare语句声明API函数,对于C形式的接口,在.NET下必须手动改为VB.NET接收的形式。其方法可以在MSDN中查询“平台调用(platform invoke)”关键字。
关于段兴传的代码,不要捕获最顶层的Exception对象,而应捕获最具体的异常。
还可以不使用异常机制,而是直接调用API(去查MSDN)获取当前用户类型。我觉得这样更好。
#dxc (it is short for 段兴传) 发表于2006-04-04 08:39:00  IP: 218.22.160.*
实在不好意思。。。 赫赫。看了金老师的第一句话,我觉得很有趣,当时给你留言时,我直接就用了缩写,dxc就是我姓名段兴传的缩写。

谢谢你的指点。我刚开始编程,所以思路比较幼稚。我已经重新考虑了。就是先获得当前用户名,然后判断是不是系统账户。如果不是,则执行logonUser函数,然后,再执行createprocessasUser函数就可以解决了。如果是,就直接执行程序段。
完全不需要用异常处理机制。

再次谢谢你的指点。我现在比较需要重点解决的就是如何将c形式的接口参数改成vb.net形式。这个我现在一点头绪都没有。API函数到没有问题。很多资料上都可以得到。

#bitfan 发表于2006-04-06 18:08:00  IP: 211.68.13.*
to Single:
不知你为何“寒一个…”?
我猜你是不是在想:金老师怎么也抄袭啊?对不对?
书中有数处使用了MSDN中的例子,但几乎都进行了进一步的完善与加工,比如GDI+ Clock,本就来源于MSDN网站提供的资源,但请你去Google一下,看看原文及源程序是什么样的,再看看我的书中这部分是怎么写的!
DirectCast这部分与MSDN中的一致,因为它太简单了,我想不出比MSDN中的提供的更合适的例子,,就直接采用了。近600页的书,这种内容情况加起来恐怕不会超过10页。而且这种内容,没有一处是本书所介绍的技术核心所在,也许我的失误是没有指明来自MSDN。MSDN是产品文档,是开发最权威的资源,使用VS.NET开发,有谁能不去查阅它?
我可以告诉你,书中90%以上的内容,要不是我原创开发,要不经过了综合的整理与分析,尤其是最关键的若干个代码超过千行的大实例,全是我独立完成的,你知道我设计并开发这些实例付出了多少心血吗?书中最重要的内容,哪部分不是我自己先悟,再从实践中得到验证,然后从读者角度加以梳理,并从教学实践中从学生得到反馈,才写到书中的。我敢在封面上写“著”而不是“编著”,不是随便乱写的。
欢迎读者提各种意见。

#sinlge 发表于2006-04-06 17:26:00  IP: 222.209.117.*
金老师,今天看到135页,里面讲CType和DirectCast的区别和msdn里面的完全一样...

寒一个...
#single 发表于2006-04-27 18:12:00  IP: 222.209.119.*
这些天看书还是有些心得..里面留了很多读者自己去学习和思考的空间,这也是提高动手能力最好的方法。
嘿嘿,有好的工具为什么不用呢,我不是说老师抄袭,只是觉得有点奇怪?我现在经常看msdn,不过说实话,msdn里面有些措辞比较难懂。
哈哈,我刚才看了一下我的几本书,老外写的几本(经济,linux,c++)和你这本都是“著”,惟独以前的课本软件工程是“编著”......
#yfl 发表于2006-06-02 09:07:00  IP: 221.1.205.*
金老师:
您好!谢谢您.我正在读<<编程的奥秘>>,但是,对主窗体与辅助窗体关联的理解还是不到位,P103提示与探索中的练习没有做出来,p142事件中Init()过程中的CounterForm.MainForm=me
理解的也不好,我感觉到连多态和继承也没这难理解,怎么回事?
我想请金老师给我讲一下此句,将练习再做出来,另外能否给几个类似的例子,加强理解.谢谢!
另外给您提个建议,例题中有的没有完整的代码,如"事件"P142中
Init()过程都没有,当然光盘中有完整的代码,这使得读起来比较困难,要知道我们不是专业人员,不能时时在电脑前看书.
盼望您的新书早问世!
忠实的读者:于法凛
6.2
#rockdream 发表于2006-06-03 23:43:00  IP: 218.81.163.*
CounterForm.MainForm应该是指frmcounter窗体中声明的主窗体变量,=ME就把主窗体和frmcounter窗体联系起来了,可以向frmcounter窗体传递信息了.
书是本好书,但从初学者角度来看有的地方讲的还是难懂了些,比如窗体信息的传递,传值传引用,委托,事件.不过我觉得书写的方向还是对的,强调实践,强调思维的转换及编程背后的机制.
看的出来金老师写这本书花了很大的功夫,耗费了很多心血,现在这样写IT技术书籍的人真是很少的了.等我看完一遍后一定把我看说的详细感受和意见EMAIL给金老师.希望能看到本书能出二版.
#fyl 发表于2006-06-04 09:07:00  IP: 221.1.205.*
金老师:
您好!有几个问题请教.<<奥秘>>P157示例ContainerExample中,如果首先单击"显示第二窗体"按钮,则Form2显示出来,接着单击"收入囊中"按钮,Form1中的"树"不见了,
但Form2中也不见"树",此时"树"到哪里去了?如果此时单击Form1中的"将树放入GroupBox中",GroupBox中又出现了"树" .
另一问题,重载Form2的构造函数中:语句 Me.frm=frm 感觉很难理解,可能是对窗体关联理解得不好,但还能慢慢理解,对此句不知如何理解.谢谢!
#bitfan 发表于2006-06-06 19:03:00  IP: 211.68.13.*
to 于法凛:
A对象要访问B对象,它必须获取B对象的引用,对象的引用就是对象变量。
窗体也是对象。当一个窗体要访问另一个窗体时,它必须得有一个内部的变量用于存放对另一个窗体对象的引用。因此在重载的构造函数中初始化另一个窗体对象变量,如果不这么做,此对象变量就是Nothing(空引用)。
关于源代码问题,本书实在无法将所有源码清单在书中列出,那样的话,书可能还要厚一倍。

感谢大家对我写的这本书的肯定,有不少读者给我发邮件,让我对读者在学习过程中遇到的困难有了更多的认识。

目前我正在撰写《编程的奥秘》补充升级版,大家的意见我会在这本书中予以体现。此书将会对《奥秘》一书中讲得不够详细的内容比如事件驱动,委托等进行重点剖析。采用最新的Visual Studio 2005,并对.NET Framework 2.0中一些重要内容和技术内幕进行介绍。目前正在准备中,近期会在本BLOG上公布新书的目录。

到时敬请大家多提宝贵意见。
#yfl 发表于2006-06-11 08:51:00  IP: 221.1.205.*
这是一个在本blog中出现的问题

问:
今天把您的著作粗略的读完了,信心很足,打开vs.net准备写点东西.
但是一开始就遇到了麻烦,虽然解决了但是心中还存有疑虑

'点击按钮出现一个窗体

Private fm1 As form1
If fm1 Is Nothing Then
fm1 = New form1
fm1.Show()
End If
这样的话,当新窗体关闭后,再点击按钮就不出现新窗体了


Private fm1 As form1
If fm1 Is Nothing OrElse fm1.IsDisposed Then
fm1 = New form1
fm1.Show()
End If

加上OrElse fm1.IsDisposed 的话就正常了

关闭窗体不就是销毁窗体了嘛?为什么还要判断IsDisposed ,不能只判断nothing呢?

也就是说当实例窗体关闭(点右上X关闭)后 fm1不是nothing嘛?

答:
关键在于.NET的垃圾回收机制。与C++不同,在VB.NET中将一个窗体关闭之后,并不会立即销毁它,并回收其资源,而只是打上了一个“不用”的标记(IsDisposed =True),等到垃圾回收进程运行时,这些对象才会被真正地销毁,在此之前,frm1<>Nothing。

******

但是,我上机操作为什么没有出现此现象?我用的vs.net2003.谢谢!
#ma001 发表于2006-06-11 17:50:00  IP: 60.208.170.*
金老师 您好
我是一名电脑业余爱好者,退休前在机关工作
,1989年至1996年期间由于工作需要曾用MSC5.0。MSC60写过一些程序,以后工作变动,再也没有编过程序。只是WINDOWS操作系统还算熟悉。现在退休了,作为一种爱好,很想学习一下NET环境下的编程,费了不少的劲买了好多垃圾书,总算幸运买到了您
写的编程的奥秘这本书,通过学习受益匪浅,通过几个月的学习这本书已基本学完,现在可以编写一些小程序了,现在想继续学习
ASP。NET的编程,正如您所说垃圾书太多,苦于找不到一本好书,恳切地希望您能在百忙之中,抽点时间给我推荐一本学习
ASP。NET编程的书。
#ma001 发表于2006-06-11 17:55:00  IP: 60.208.170.*
金老师 您好
我是一名电脑业余爱好者,退休前在机关工作
,1989年至1996年期间由于工作需要曾用MSC5.0。MSC60写过一些程序,以后工作变动,再也没有编过程序。只是WINDOWS操作系统还算熟悉。现在退休了,作为一种爱好,很想学习一下NET环境下的编程,费了不少的劲买了好多垃圾书,总算幸运买到了您
写的编程的奥秘这本书,通过学习受益匪浅,通过几个月的学习这本书已基本学完,现在可以编写一些小程序了,现在想继续学习
ASP。NET的编程,正如您所说垃圾书太多,苦于找不到一本好书,恳切地希望您能在百忙之中,抽点时间给我推荐一本学习
ASP。NET编程的书。
#bitfan 发表于2006-06-12 19:22:00  IP: 211.157.213.*
to ma001:
您都退休了还对软件开发有如此的兴趣,还能从头学习一门新的知识与技能,让人佩服!您这种精神值得我学习。
关于ASP.NET,不是目前我关注的热点,平时也没时间,所以,很多这方面的书都没有阅读,抱歉未能提出建议。但您可以上China-pub去搜搜相关的书,看看读者书评,可能有帮助。
目前我正在撰写<编程的奥秘>一书的配套升级版本,目录已在本网站BLOG上公布,欢迎您提宝贵意见。
我计划再用两到三年的时间完成《编程的奥秘》三部曲的写作,明年完成第二部,有关互联网程序设计,以ASP.NET为主,后年第三部,有关分布式系统开发。
#whitewin 发表于2006-06-13 20:21:00  IP: 218.22.71.*
我是从第二书店上买来了这本书,打了7.6折,花了不到50元。当初也觉得挺贵,犹豫了很多天,还是买了。
回来一看,厚厚的一本,还有配套光盘,确实比较值。
再花了几天看了一下内容,感觉确实难得。可以说,书中的每一行代码都是金老师经验的积累。不但有技术路线的介绍,还有软件工程知识的应用。可以说,书中没有一句废话,哪怕是扩充阅读,都很贴切主题。没有几万行的代码经验,没有数年的编程感悟,是出不了这篇巨著的。不但是一本由入门到精通的好教材,也是一本难得的教学参考书。从这本书中,我解决了好几个以往难以解决的疑惑。
虽然没有时间通读细读,但一有空拿起这本书,每次总会有些许收获。
有点缺陷,就是书中代码都是VB.NET的。说老实话,初学者学VB.NET总觉得晦涩,关键字太多,不像C#那么简洁流畅,现在的国人普遍都E文不好。我想利用暑假时间,将金老师的示例转换成用C#的,也好细读一下金老师的这本书。不知金老师能否支持?到时有问题,可要多向金老师请教哟!
期待你的新作《.NET 2.0面向对象程序设计(VB2005篇)》!!!
#MA001 发表于2006-06-18 08:54:00  IP: 60.216.199.*
金老师 您好
看到您的回复很高兴,盼望着您的《编程的奥秘》的第二部早日面市。
另外还要请教一个问题,在《编程的奥秘》的第40页有这样一个过程

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles

MyBase.Paint
Dim g As Graphics
g = e.Graphics
g.DrawString("您好!世界", New Font("宋体", 16), Brushes.Red, 10, 10
g.Dispose() '释放绘图对象
End Sub
在这个过程中 g.Dispose() 释放绘图对象这一句感到有点不好理解,绘图对象是由e这个参数
从外部传入的,并不是在过程内部创建的,在过程内部通过g.Dispose() 释放绘图对象合理吗?
如果把上面的过程盖成下面的形式
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles

MyBase.Paint
e.Graphics.DrawString("您好!世界", New Font("宋体", 16), Brushes.Red, 10, 10)
End Sub
还需要在过程内部加入一句e.Graphics.Dispose()释放绘图对象吗?这个地方感到有点困惑。
#bitfan 发表于2006-06-18 16:56:00  IP: 211.68.13.*
To MA001:
Form1_Paint事件过程中的Grahpics对象可以不调用Dispose方法释放,因为此对象由基类对象负责Dispose,当然,在Form1_Paint事件中直接Dispose也不会引发任何异常,因为开发者在设计Graphics类时就已考虑过这种情况。
但在Paint事件代码之外,Graphics对象大都是由CreateGraphics方法手动创建的,则必须调用g.Dispose显式释放,不然,会造成内存泄漏。其原因在于GDI+不是纯.NET代码,其底层是调用Win32API实现的,因此,无法象标准.NET对象一样,由垃圾回收机制处理对象的销毁工作。
正如C++中,New一个对象,用完之后必须Delete一样。
#bitfan 发表于2006-06-23 11:06:00  IP: 211.68.13.*
问:金老师,你好!我在看你的<<编程的奥秘>>中有有一些地方看不明白,
如Module Module1
Sub Main()
Dim i1, i2, i3 As Integer
Dim max, min As Integer
Dim ran As New Random
i1 = ran.Next(1, 1000)
i2 = ran.Next(1, 1000)
i3 = ran.Next(1, 1000)
getmaxmin(i1, i2, i3, max, min)
System.Console.WriteLine("三个数{0},{1},{2},中的最大数是{3},最小数是{4}", i1, i2, i3, max, min)

{0}{1}{2}.... 这是什么意思??{0}{1}{3}{4}怎么来的???加粗的看不懂!

书中的127页!!
答:
这些数字都是占位符,在运行时被变量值替换。
比如,{0}的位置被i1的值换掉,{1}的值被i2换掉,依次类推。
这种方式其实就是“填空”,事实上可以用字串连接的方法得到同样的效果,但那样代码不够简洁。
除了Writeln方法,书中还常用String.Format方法,其参数也采用同样的形式。
#bitfan 发表于2006-06-25 09:27:00  IP: 211.68.7.*
金旭亮老师:
我现在正在阅读您的大作(第二章),有几个问题希望得到您的指教:
1. 关键字Me怎样理解?可以理解成主窗体吗?
2. 在看MyEditor时,RichTextBox1控件的SelectionFont属性为什么在属性窗口中找不到?而在代码中通过输入Me.RichTextBox1可得到?而且属性更多?
3. 在P113页中有表达式Me.btnBold.Pushed = _font.Bold,那么控件btnBold在设计时为何找不到?

答:
(1)Me是一个关键字,代表对象本身。正如张三在说自己的事时,都说“我”一样。Me用在窗体内部时,代表正在运行此窗体对象(注意,是窗体对象不是窗体类,因为一个类可创建多个对象,而创建的每个对象,其Me都是指向此对象)
(2)有些属性在VS.NET的下拉列表中是找不到的,必须要到MSDN中查阅文档才行。SelectionFont属性就是如此。这是VS2003的弱点之一。VS2005就好多了。
(3)btnBold是一个按钮变量,它属于主窗体类,前面说过Me代表运行时的窗体对象,可以通过Me来访问窗体类的所有成员(正如通过对象名可以访问对象一样,比如TextBook1.Text="Book"),也可以把Me去掉,代码同样正常运行。之所以加上Me,是因为在VS.NET中,Me加一个小数点后会弹出一个下拉列表,可以加快代码录入的速度。
#bitfan 发表于2006-06-25 10:37:00  IP: 211.68.7.*
问:
尊敬的金老师:

您好!

感谢上次的回复,现有个问题请教,请不吝赐教!

1 P254页“使用索引访问”下边您省略的部分是不是应该这样写?
Me.Listbox1.Items.Add(dr)
2 P252页在定义oledbDataReader和oledbDataTable变量时,为什么前者没有用NEW而后者用了?在定义变量时,什么情况用NEW,什么情况不用呢?

回复:
1.省略的部分是说你可以使用变量dr访问到Datarow对象,比如给此条记录的某个字段赋值:
dr.Item("StudentName")="张三"
具体代码在实际开发时决定。
2.之所以前一个没有用New,是因为OleDBcomand对象的ExecuteReader方法执行时,它自己会创建一个新的OleDbDataReader对象返回。
而OleDBDataAdapter对象的Fill方法只能填充已创建好的对象,它自己不会自动创建一个DataTable对象,所以在调用Fill方法之前,要先创建好一个DataTable对象给它。
--------------------------------------------------------------
问:
金老师您好:
拜读您的大作,很有收获,像您这样的作者现在很少.想请教您一个问题,还望您百忙中给予解答.
"组件中常说的那个接口和c#中那个接口(interface)是完全等同的概念吗,组件中的这个接口概念是否范围更大一些?"
谢谢

回复:
面向对象理论中的软件组件“接口”,其含义是指组件提供给外界的公有类(包括类的公有属性和方法)。C#中的interface是面向对象语言级别的特性,是一种特殊的类。组件接口的含义要宽得多。

--------------------
问:
>金老师:
>我正在学习您的书,上次向您请教过问题,您的回答使我茅塞顿开,获益匪浅,非常感谢,还有一个问题:
>
>对于企业级的大型应用,如果需要存取上万条记录,使用DataSet是一个好的选择吗?如果使用DataSet,应该还需要些其他辅助的技术帮助提高性能吧?还是不使用DataSet,通常的解决方案是什么呢?
>
>期盼着您的回复,谢谢
答:
尽可能避免将太多的数据放入DataSet中,根据我们的测试,上万条记录将使DataSet的查找与修改操作变得很慢,因为会占用大量的内存。
最好采用SQL命令直接将数据在数据库中修改,或者分段提取数据以减少数据流量。
最常用的方法是编写存储过程。
另外,SQL Server2005支持使用C#和VB2005直接在数据库中书写代码操作数据库,因此,使用这种方法也是推荐的。


-----------------------------

#bitfan 发表于2006-06-25 10:41:00  IP: 211.68.7.*
金旭亮老师:
我现在正在阅读您的大作(第二章),有几个问题希望得到您的指教:
1. 关键字Me怎样理解?可以理解成主窗体吗?
2. 在看MyEditor时,RichTextBox1控件的SelectionFont属性为什么在属性窗口中找不到?而在代码中通过输入Me.RichTextBox1可得到?而且属性更多?
3. 在P113页中有表达式Me.btnBold.Pushed = _font.Bold,那么控件btnBold在设计时为何找不到?

答:
(1)Me是一个关键字,代表对象本身。正如张三在说自己的事时,都说“我”一样。Me用在窗体内部时,代表正在运行此窗体对象(注意,是窗体对象不是窗体类,因为一个类可创建多个对象,而创建的每个对象,其Me都是指向此对象)
(2)有些属性在VS.NET的下拉列表中是找不到的,必须要到MSDN中查阅文档才行。SelectionFont属性就是如此。这是VS2003的弱点之一。VS2005就好多了。
(3)btnBold是一个按钮变量,它属于主窗体类,前面说过Me代表运行时的窗体对象,可以通过Me来访问窗体类的所有成员(正如通过对象名可以访问对象一样,比如TextBook1.Text="Book"),也可以把Me去掉,代码同样正常运行。之所以加上Me,是因为在VS.NET中,Me加一个小数点后会弹出一个下拉列表,可以加快代码录入的速度。
--------------------------------------------

问:
从买你的书到现在已经两个月了啊,书也看了挺多的啊,虽然现在我还不能编写出大的东西,但是您给了我很多启发,为我指明了以后的编程之路,呵呵,在这里就是还想问一下啊,你会再出书关于.NET在网络编程方面的书吗,就是ASP.NET啊
答:
会写的,但要明年吧。
---------------------------

金老师:
你好!谢谢你的帮助,这个问题在你的帮助下我已经解决了,真是非常感谢!
大致翻阅了一下该书的提纲,好像缺少对事件驱动的介绍,觉得很是遗憾!我是搞GIS的,使用的VB.NET平台,最近觉得事件驱动很是重要,并且和VB6还是有些不同,一时间觉得有些内容很是迷惑。翻阅了很多的VB.NET的书籍,看看有些高级版的有一定介绍,但是不多,也不是很详细。获悉你要出版此书的高级版,很是高兴,希望在你的书中,能在这一部分的论述多一些。最好能举你个例子,和VB6有些比较那就在好不过了!
谢谢金老师!

回复:
事件驱动在我的新书中有专门的章节进行详细介绍。
----------------------------------------------
金老师,您好!

我是你是《编程的奥秘--.NET软件技术学习与实践》的读者,这本书写的很浅显易懂,是初学者的一本很好的入门书。当我第一眼看到它时,就被其中的一个章节所吸引,其中的多窗体编程一节是我自接触VB.NET以来,一直苦苦思考的一个问题,也是学习
#急速恶搞 发表于2006-06-25 23:31:00  IP: 59.57.238.*
金老师:你好!
三年大学里没教会我的VB.NET,《编程的奥秘》教会了。她让我了解了编程。现在我学ASP2.0感觉很容易上手,感谢金老师给我打下的编程基础。
我发现现在的ASP.NET书很多都用C#写,是不是VB.NET适合软件高效开发,C#多用在写网络程序(听说安全性高??)
#bitfan 发表于2006-06-29 10:36:00  IP: 211.68.13.*
to 张伟国:
1.之所以删除Form1是因为我们希望窗体名是有意义的,并且与源文件同名,但在VS2003中,改文件名不会导致类名一同更改,还不如直接新建一个窗体更省事。
在VS2005中,这个问题已解决。
2.的确是这样,一般情况下,窗体设计器生成的代码可以不用理。可以手动添加代码的地方就是在Sub New过程的InitializeComponent()一句之后。在VS2005中,默认情况下是根本看不到窗体设计器生成的代码。
3.frm.controller=me 是在类WizardController内部写的,因此,Me代表类WizardController创建的对象。
Dim Frm as New FrmBase 一句创建了一个基类窗体对象
但在书中代码环境下,需要枚举向导窗体集合中的对象,而这些对象都继承自FrmBase,所以,定义一个基类变量frm,就可以用它来引用所有的集合中的子对象。这些子对象已在WizardController的构造函数中创建好了。所以,在定义时不需要创建基类窗体对象。
4.在.NET中访问文件是使用流对象来进行的,请参看4.5节。
.NET 2.0中,提供了一个TextFieldParser 类专用于访问结构化的文件,非常方便。
#张伟国 发表于2006-06-29 09:09:00  IP: 218.59.138.*
金老师:现在我正在阅读<<编程的奥秘>>一书,有几个问题请教一下:
1.有些项目(如第148页)为什么在创建应用程序后,删除其中的Form1,而后又新建一个窗体?
2.一般情况下,Windows窗体设计器生成的代码是不是不用管它?
3.在第150页中有以下表达式:
frm.controller=me
意思看不明白,me代表什么?是WizardController类的一个对象吗?
将该页Sub New()中表达式Dim frm as FrmBase改为
Dim Frm as New FrmBase
程序也能正常运行,那么,这二句有什么不同?
在定义变量时,经常不知道该不该加关键字New?
4.在VB6.0中,读顺序文件时,有如
input #1, a1, a2, a3
这样的句子,执行后,变量a1 a2 a3都有具体的数据,使用起来非常方便,而在VB.NET中我没有发现这样的句子,是不是没有?
#张伟国 发表于2006-06-29 16:32:00  IP: 218.59.138.*
金老师:现在我正在阅读<<编程的奥秘>>一书,有一个问题请教一下:
在第158页中有如下表达式:
Me.frm=frm
书中说,建立与主窗体Form1的关联,介绍得很简洁,能详细地说明一下吗?
如果把关键字Me去掉呢?
#张伟国 发表于2006-06-29 18:01:00  IP: 218.59.138.*
金老师:你好!
非常感谢你的回帖,上面有:
.NET 2.0中,提供了一个TextFieldParser 类专用于访问结构化的文件,非常方便。
我在Visual Studio.net 2003的帮助中怎么没有发现TextFieldParser 类,你说的.NET 2.0是指什么?
#张伟国 发表于2006-06-30 10:16:00  IP: 218.59.138.*
经过查看前面的内容,我明白了.NET 2.0的含义了,谢谢金老师
#于法凛 发表于2006-07-04 09:02:00  IP: 221.1.205.*
金老师:
您好!有个问题请教:在P44示例项目UserStatusBar中,在ProgressBar1的属性栏中将其Dock属性设为Top时,运行程序时击btnAddProgressBar按钮,进度条将整个状态栏占满了,并未达到我们设想的仅占StatusBarPanel2的目的.为什么会这样?
谢谢金老师
#to 于法凛 发表于2006-07-04 11:47:00  IP: 211.68.13.*
当Dock属性置为Top,控件的行为是紧贴容器的顶端并占满容器的宽度,并随着容器大小的改变而动态改变。
容器控件最常见的就是Panel,Form和Groupbox,你可以用Form和ToolBar试一试就明白了。
因此,要想实现示例的功能,Dock属性必须为None。
请参看本书第四章中的相应章节。
#李炳辰 发表于2006-07-10 12:05:00  IP: 59.44.76.*
金老师您好,我初学.net编程。
在第五章-.net数据库编程概览中的5.2节时,
想把例子程序改造一下,
让每一次点击DataGridView中的某一行时,
取出这行的某一个字段,
显示到一个文本编辑框里。
可是我发现程序启动后,
虽然游标指向的第一行可以用DataGridView1.CurrentRow.Cells(1).Value.ToString取得,但是,如果在DataGridView1的click事件里添加上面的代码,
却需要点击两次鼠标(第一次点击任意一行(可以是要选中的行),第二次点击要选中的行)才能取出那一行的内容。
之后才可以点击哪行,
那行的内容就可以被提取出来。
这样用起来不方便,
怎样才能做到在一开始不需要点击两次?
谢谢。
#李炳辰 发表于2006-07-10 13:51:00  IP: 59.44.76.*
金老师,我找到原因了,只要把设置DataGridView属性的语句移到其他的事件处理函数中就可以了。
#于法凛 发表于2006-07-11 08:45:00  IP: 221.1.205.*
金老师您好,这几天一直在看MyEditor程序,但联想到能否用vs.net克隆Excel?如果行,用什么控件?
第二个问题:在P144"事件"一节"中有"注意,上述代码的第一句要放在窗体的InitalizeComponent()过程中才起作用"指的是哪一句?如果是Adddhandler句,哪么事件处理过程中的代码又放在哪里?我找了许多资料也未找到.请指教.
谢谢.
#zqqu12 发表于2006-07-30 14:10:00  IP: 58.59.148.*
金老师您好:
在书店发现《编程的奥秘》,如获至宝!我看过很多书,都是看几页就丢了,但这个星期我全天在家阅读《编程的奥秘》,爱不释手。我感叹当今的书市像您这样的书真是太少了,勘称经典!
但今天读到第9章时发现缺了许多页,出版社漏印了,全空白。我在新华书城买的,绝对正版。现在前面部分已经被我画满了,拿去换是不可能了。恳请金老师帮我传该书的Page323、326、327、330、331、334、335、338的页面内容到我邮箱好吗:zqqu12@yahoo.com.cn
谢谢!
#ZQQU12  发表于2006-07-30 14:18:00  IP: 58.59.148.*
金老师您好:
在书店发现《编程的奥秘》,如获至宝!我看过很多书,都是看几页就丢了,但这个星期我全天在家阅读《编程的奥秘》,爱不释手。我感叹当今的书市像您这样的书真是太少了,勘称经典!
但今天读到第9章时发现缺了许多页,出版社漏印了,全空白。我在新华书城买的,绝对正版。现在前面部分已经被我画满了,拿去换是不可能了。恳请金老师帮我传该书的Page323、326、327、330、331、334、335、338的页面内容到我邮箱好吗:zqqu12@yahoo.com.cn
谢谢!
#bitfan 发表于2006-08-03 10:53:00  IP: 211.68.10.*
金老师,
您好,我前些天买了你的一本《编程奥秘》,最近也还在看。我发现你的书确实写的很好,有一点我很佩服,就是你书中的语言很朴实,但就因为这朴实的语言把很多难以理解的东西解释清楚啦!你在你的博客上说要出一版本《.NET 2.0面向对象程序设计(VB2005篇)》,我很想买这本书,因为你这本书同样会写的很不错!
我今年刚考上上海一名校计算机应用的研究生,我对软件开发也很感兴趣,尤其现在接触了.net后,
我感觉它确实是一个很好的平台。以后如果在学习中遇到些棘手的问题,实在难以理解或难以解决,我不知能否请教你,尤其是关于你这两本书的内容!
最后我想问问你,你的第二本书什么时候出来?希望你能给我回信,谢谢!
-------------------------------------------------------------------
回复:
 第二本书目前我正在撰写中,可能要到年底了,没办法,因为是原创,所以工作量大。
第二本书的重点是面向对象,以C#为例,同时对比VB.NET,Java和C++,我的目的是通过展示语言之间的共性与不同,从而帮助读者真正地理解面向对象,从而成为一个可以自如掌握多种编程语言,灵活性更高的程序员。书中还重点介绍许多高级的面向对象技术,我的目的是读者学完这本书,会发现再去软件公司面试,只要是面向对象的试题,应该跑不脱这本书介绍的内容。
你如果有问题,可以直接给我来信,或者到我的BLOG上提问(http://blog.csdn.net/bitfan)


学习顺利

金旭亮
#bitfan 发表于2006-08-03 10:58:00  IP: 211.68.10.*
我是个初学者,目前安装一整套VS2005,也知道你这套书以2003VB为平台讲述对象,考虑再三,买了这本书.目前快到货了.如何更好的利用2005版本从此书收益是我目前很想知道的.谢谢,祝你身体健康
------------------------------------------------
回复:
虽然我的书是以VS2003为例的,但其中介绍的知识却是通用的。
要看你已有的编程基础,如果较少编程经验,则最好还是在VS2003基础之上学完前三章,后面再转为使用VS2005。如果已有较丰富的开发经验,则可以直接以VS2005为开发平台学习。实例代码是完全可以在VS2005上运行的。且VS2005可以自动升级2003的代码。但ADO.NET这块VS2005有较大的改变,因此第7章内容需要注意,在学完后可以通过查询MSDN掌握ADO.NET新的对象模型,如果学得扎实的话,我的书应该给你打好了自学的基础。
VS2005在类库上提供了更完善的类,因此,原先2003需要不少代码才能实现的在VS2005上可能只需要一两行代码就可以了,在语言上也有变化,但并不是本质上的变化。可以这么说,除了IDE界面与操作上略有不同,完全可以用VS2005来学习我的那本书。
目前我正在撰写VS2005的书,是《编程的奥秘》配套升级版,但在理论上技术上更深入,以C#2.0为主,同步介绍VB2005,不过要出版还得好几个月的时间,到时你可以参照学习,以提升自己的实践能力和理论素养。
#张伟国 发表于2006-08-04 11:56:00  IP: 218.59.138.*
金旭亮老师:
我现在正在阅读您的大作,有个问题希望得到您的指教:
1.在定义对象变量后,有的在应用时加关键字NEW,而有的就没有
例如第七章/MoveInDataTable/frmMoveInDT1类中,定义conn,comm时没有关键字NEW,在后面的表达式中(如conn = New OleDbConnection和 comm = New OleDbCommand)有关键字NEW;
而定义cm时同样没有关键字NEW,但后面的表达式(如cm = Me.BindingContext(ds1.Tables(0))仍然没有关键字NEW,为什么关键字有时加有时不加?
2.我将定义变量conn和comm的语句增加关键字NEW后,结果运行也正常,为什么?
#bitfan 发表于2006-08-05 12:03:00  IP: 211.68.1.*
to 张伟国 :
凡有New的,都表示要创建一个对象,没有New的,只不过是定义了一对象变量,可以引用一个真实的对象,但并意味着它会创建一个对象!
这个问题我前面也有回答过。
看来对象变量与对象的区别很多人弄不明白,但这在编程中是很重要的。顺便说一下:我已在新书中用了较大的篇幅努力讲清楚这个问题,相信读者到时再参考一下,就会很清楚了。
#张伟国 发表于2006-08-06 11:23:00  IP: 218.59.138.*
金旭亮老师:
你好!你编写的《编程的奥秘》一书,我正在阅读,很有深度很有水平,深入浅出的比喻,让读者对书内容有很好的理解,看到你正在编写《奥秘》的升级版,我很高兴,希望早日出版.
有几个问题请教一下:
如果我读完了《奥秘》一书,再读VS2005的话,可以吗?你在帖子上说本书以C#2.0为主,我是否再去了解一下C语言呢?
看你的帖子,原来的升级版为VB2005,以VB语言为主(与《奥秘》相同),为什么又改了?是用C语言的人多还是建议你用C语言编写的人多?
C语言我通过谭浩强的《C程序设计》接触过,但没有读完,我的感觉是C语言表达非常灵活,语句非常简练,很少代码就能表达出很多内容.还有AUTOLISP语言等,我觉得每种都有自己的规则,只要人们了解并掌握了它的规则,按照它的规则写出表达式来体现自己的意图就行了,都是大同小异的.
可能是个人特点所致,我更喜欢使用VB,因为它表达直观,容易理解.跟平常的数学表达式基本上是一样的.谭浩强的书为什么受欢迎,我个人认为他的书内容非常简单,表达非常清楚,很容易使人上路,上路后再学其他的难度就小的多,这些特点你可参考.
我看到谭浩强的《C程序设计》和《QBASIC语言教程》表达内容许多是一样的,只有例子分别用二种语言编写,你为何不如此呢?这样不就满足不同的读者了吗?如果升级本用C#2.0编写一本,再用VB语言改写编另一本,按照你的水平一个月应该差不多.当然,如果象你在帖子上介绍的那样,以C#2.0为主,同步介绍VB2005,能够同时将不同的语言介绍清楚的话,那就更好了.
#张伟国 发表于2006-08-06 14:37:00  IP: 218.59.138.*
金旭亮老师:
你好!你编写的《编程的奥秘》一书,我正在阅读,很有深度很有水平,深入浅出的比喻,让读者对书内容有很好的理解,看到你正在编写《奥秘》的升级版,我很高兴,希望早日出版.
有几个问题请教一下:
如果我读完了《奥秘》一书,再读VS2005的话,可以吗?你在帖子上说本书以C#2.0为主,我是否再去了解一下C语言呢?
看你的帖子,原来的升级版为VB2005,以VB语言为主(与《奥秘》相同),为什么又改了?是用C语言的人多还是建议你用C语言编写的人多?
C语言我通过谭浩强的《C程序设计》接触过,但没有读完,我的感觉是C语言表达非常灵活,语句非常简练,很少代码就能表达出很多内容.还有AUTOLISP语言等,我觉得每种都有自己的规则,只要人们了解并掌握了它的规则,按照它的规则写出表达式来体现自己的意图就行了,都是大同小异的.
可能是个人特点所致,我更喜欢使用VB,因为它表达直观,容易理解.跟平常的数学表达式基本上是一样的.谭浩强的书为什么受欢迎,我个人认为他的书内容非常简单,表达非常清楚,很容易使人上路,上路后再学其他的难度就小的多,这些特点你可参考.
我看到谭浩强的《C程序设计》和《QBASIC语言教程》表达内容许多是一样的,只有例子分别用二种语言编写,你为何不如此呢?这样不就满足不同的读者了吗?如果升级本用C#2.0编写一本,再用VB语言改写编另一本,按照你的水平一个月应该差不多.当然,如果象你在帖子上介绍的那样,以C#2.0为主,同步介绍VB2005,能够同时将不同的语言介绍清楚的话,那就更好了.
#C++信徒 发表于2006-08-07 17:31:00  IP: 59.49.133.*
再补一枪
如果你想成为合格成熟的程序员的话,很遗憾!要学的不止一门 程序设计语言!
#陶庆龙 发表于2006-08-07 19:07:00  IP: 58.33.111.*
金老师:
您好!我是个初学者,今年3月份偶然看到您的这本佳作。书的“自序”写得非常精彩!书的内容已经看到开发GDIClock程序了,由于该程序涵盖了前面的所以内容,我感到理解起来很吃力,所以决定把所有实例一行一行敲入代码重做一遍,夯实一下基本功。由于我用的是VS2005环境,配套光盘中的所有实例均能在该环境下升级、通过运行,但是当我在VS2005环境下敲入配套光盘中的代码时发现有些实例不能通过运行。下面这个问题我感到比较典型:有一个实例叫 UseDelegate,我在VS2005环境下敲入UseDelegate的所有代码(除了系统自动生成的代码,结果会出现以下error:Error 'frmMain' is a type in 'use_delegate' and cannot be used as an expression.
通过几个实例的比较研究发现:凡是有窗体间相互通信的实例都会出现这种error(比如 MyEditor中的主窗体要与查找窗体的通信)。我想这也许是VS2005与VS2003的某些机制不同导致的,由于我是初学者,对于这种error 我没法排除,请您抽空给我解答一下,为了节约您的时间,请仅告诉我排除这种error 的方法,关于“为什么”就由我自己去思考吧。谢谢! (以下是配套光盘中的代码和我在VS2005环境下敲入的代码的比较,以便于您发现问题所在。备注:frmCounter 中的代码一模一样,所以没有提供)
Public Class frmMain
Inherits System.Windows.Forms.Form

#Region " Windows 窗体设计器生成的代码 "

Public Sub New()
MyBase.New()

'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()

'在 InitializeComponent() 调用之后添加任何初始化
Init()
End Sub

'窗体重写 dispose 以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Windows 窗体设计器所必需的
Private components As System.ComponentModel.IContainer

'注意: 以下过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改此过程。
'不要使用代码编
#C++信徒 发表于2006-08-07 17:19:00  IP: 59.49.133.*
To 张伟国
以C#2.0 为主 你为什么要去学C语言呢? 直接就学C# 了! 金老师的书 直接就是切入 面向对象 所以 在讲述 VB2005的是也许会对C# 一起对比一些语言之间的特性!我个人觉得非常棒! 所以个人建议你直接学 C# 或是继续使用 VB 也是很不错的!也能开发出很牛的软件 只要你足够聪明 !
#C++信徒 发表于2006-08-07 17:25:00  IP: 59.49.133.*
嘿嘿 我还要补一枪!
个人觉得 谭浩强 的<<C程序设计>> 不大好!
推荐使用 Deitel 的<<C How to Program Fourth Edition>>
#bitfan 发表于2006-08-08 17:58:00  IP: 211.157.213.*
to 陶庆龙:
UseDelegate在VS2005下没问题,可正确升级并运行。
你的问题出在构造函数上
Private Sub New()
构造函数私有的话,就无法创建主窗体。
另外,必须在覆盖基类的构造函数时,通过MyBase关键字调用基类的构造函数。
#yfl 发表于2006-08-08 20:38:00  IP: 221.1.205.*
金老师您好,这几天一直在看MyEditor程序,但联想到能否用vs.net克隆Excel?如果行,用什么控件?
谢谢.
#陶庆龙 发表于2006-08-11 19:10:00  IP: 58.33.102.*
金老师:
按照您的方法在VS2005环境下开发Wizard 应用程序,遗憾的是一开始就遇到阻力,因为当我创建好frmBase窗体并编译项目后,并没有发现Project(项目)菜单中有“添加继承的窗体”菜单项,我选中“Add New Item", 在弹出的对话框中也没有发现有表示添加继承窗体的项目。我想这也许是在VS2005环境创建应用程序向导与VS2003的不同。如果您有时间的话,希望您能够指导一下,谢谢!
#张伟国 发表于2006-08-18 23:06:00  IP: 218.59.138.*
金旭亮老师:
你好!你编写的《编程的奥秘》一书,我正在阅读,有几个问题请教
1)在第346页函数Public Function FindElement(...)中有语句
......
While _reader.read
......
_reader.read()
为什么一个不带括号,另一个带括号?
2)在VB2003中,如何生成绘图软件AutoCAD打开的图形?也就是如何与第三方软件通信?
3)在编程时,如何知道应该引入哪一个命名空间?
4)在VB2003中,能按装.NET2.0吗?
#初学者 发表于2006-08-18 21:14:00  IP: 222.33.147.*
金教授,您好!
我今天在网上看到一个人说在java中,声明一个对象时,并不为这个对象分配内存,只有在定义(对象名=new 类名())时分配,在vb.net中也是这样的吗?另外他还说:“实际上在创建jingwei这个对象时计算机只给这个对象的所有的属性分配了内存,而并没有给方法分配内存。方法只有一个,是属于所有的对象的,所以无论创建了多少个对象,计算机只会为一个方法分配一块内存。”真是这样吗?vb.net也是如此吗?
还有一个更菜的问题:dim a as integer 这个变量名a是有一个专门的地方存放吗?
希望您能指教,谢谢!
#初学 发表于2006-08-31 11:17:00  IP: 221.1.205.*
金旭亮老师:
你好! 《编程的奥秘》P334表9-1中InsertBefore行."节点"位置列中:Dim&nbsp;node&nbsp;......表达的是什么意思?
请指导.
#bitfan 发表于2006-08-31 16:27:00  IP: 211.68.13.*
to 初学:
这是印刷错误。
#初学 发表于2006-09-21 18:36:00  IP: 221.1.205.*
金旭亮老师:
你好! 有几个很菜的问题请指导.
1.新建军两个窗体
为什么frm2=new form2 写在sub( )外不行(出现需要声明)而在sub( )内可以?
(1)Public Class Form1
Inherits System.Windows.Forms.Form
Private frm2 As New Form2
frm2=new form2 'frm2下面出现下划线,需要声明

Private Sub Button1_Click( sender, e) Handles Button1.Click
frm2.Show()
End Sub
End Class
(2) Public Class Form1
Inherits System.Windows.Forms.Form
Private frm2 As New Form2 ‘ 此种写法OK

Private Sub Button1_Click( sender, e) Handles Button1.Click

frm2.Show()
End Sub
End Class
2.在MyEditor中有一段程序:

Private Sub NewFile()
Me.RichTextBox1.Clear()
'重置为缺省值
Me.RichTextBox1.ResetText()
......
End Sub
试了一下.ResetText也将 RichTextBox1中的内容clear了,为什么用这两个方法?
查MSDN ,.ResetText为 重置为默认值 ,这个默认值如何理解?

3.第三章WizardController有一只读属性:

Public ReadOnly Property IsFirstForm() as Boolean
Get
Return curIndex=0
End Get
End Property
如何理解? 属性为True时返回curIndex=0,为False 返回什么值?这样理解对否?
#初学 发表于2006-09-22 08:09:00  IP: 221.1.205.*
再问: IsFirstForm这个属性值是如何传到DisableButton() 过程中的,在使用DisableButton()之前,我看到并未明确IsFirstForm这个属性值是True还是False? 对只读属性理解的不好.老是不明白.多谢指导!!
#初学 发表于2006-09-22 08:09:00  IP: 221.1.205.*
再问: IsFirstForm这个属性值是如何传到DisableButton() 过程中的,在使用DisableButton()之前,我看到并未明确IsFirstForm这个属性值是True还是False? 对只读属性理解的不好.老是不明白.多谢指导!!
#初学  发表于2006-09-23 08:41:00  IP: 221.1.205.*
金旭亮老师:您好!
第三个问题我已经弄明白.还有一问题第三章Wizard程序在Class WizardController的构造函数中有一句frm.DisableButton()将第一个和最后一个窗体的特定按钮灰掉
我试了一下,在此句之前加Msgbox(curIndex),两次输出的都是
0,可见不能将最后一个窗体的特定按钮灰掉,另外去掉frm.DisableButton()这句程序运行也正常
#Hedgehog 发表于2006-10-09 00:03:00  IP: 59.59.192.*
金老师,我对第二章的递归还是不太理解,尤其是P95的试一试中,为什么将
Me.RichTextBox1.AppendText("第 " & CStr(times) & " 次" & vbCrLf)
Me.RichTextBox1.AppendText(Story)这两句移到DoRecursion(times - 1)后,我从设置的断点来看,程序在调用完成后,语句都已经执行到Exit Sub ,应当是退出SUB过程,但程序仍然会按顺序继续执行Sub内的上述两个语句?初次学习面向对象编程语言,请多多指教。
#Hedgehog 发表于2006-10-09 00:10:00  IP: 59.59.192.*
金老师,看了递归这一节仍然不太理解,尤其是P95中的试一试,为什么将干活的两句移到DoRecursion(times - 1)后,会按顺序输出到文本框中,我在程序中设置了断点,观察到在三次调用完毕后,语句即执行了EXIT Sub,但程序会进入执行Me.RichTextBox1.AppendText("第 " & CStr(times) & " 次" & vbCrLf)
Me.RichTextBox1.AppendText(Story)这两句
初次学习编程,请多多指教
#greensun528 发表于2006-12-19 11:20:53  IP: 60.2.249.*
金老师: 你好,我正在读你的书,写的真好,以前看了好几本书,就是看不进去,而你的书,在图书馆看到了,感觉很好,于是去书店定购了一本,一口气看了200多页了。我也是一名大学计算机老师,大多经历与你也相似,上学,工作,考研,工作,不过编程比你差多了,向你学习。 盼望你的新书快出版。
#Phoenix59Sky 发表于2006-12-19 23:42:02  IP: 125.213.50.*
您的这本巨著非常有启发性. 假如我的大学老师能有你一半的品性,就相当难得了. 期待您的新书早日出版.
#rzl2006 发表于2006-12-20 22:55:32  IP: 222.138.177.*
我在卓越网订购的金老师的编程的奥秘一书终于到了,今天手不释卷看了一天,感觉真的很不错。老早就想好好学学.net,虽然懂一点点c和vb,但仅限于基本的语法,编程没什么基础,也没地方买书,早些日子在网上下了几本c#教程,什么函数的重载、类的定义,看的我头晕也没弄明白怎么回事。今天大致翻了翻编程奥秘的前几章,有点豁然开朗的感觉。看来这本书真的是买对了。从今天开始,好好学习.net,各位,共同加油吧。
#rzl2006 发表于2006-12-20 23:45:34  IP: 222.138.177.*
金老师:
在vs2003下运行P79例子
Set(ByVal Value as Integer) '电视频道数必须大于0,小于最大频道数
If Value >= 0 And Value <= MAX_CHANNEL Then
_curChannel = Value
Else
_curChannel = 0
End If

End Set

提示“ set 参数必须与包含属性的类型相同 ” 。编译无法通过。,去掉as子句后正确。属性与value 的类型都是integer的,为什么会出这个错误呢?
#rzl2006 发表于2006-12-20 23:45:44  IP: 222.138.177.*
金老师:
在vs2003下运行P79例子
Set(ByVal Value as Integer) '电视频道数必须大于0,小于最大频道数
If Value >= 0 And Value <= MAX_CHANNEL Then
_curChannel = Value
Else
_curChannel = 0
End If

End Set

提示“ set 参数必须与包含属性的类型相同 ” 。编译无法通过。,去掉as子句后正确。属性与value 的类型都是integer的,为什么会出这个错误呢?
#rzl2006 发表于2006-12-28 09:29:23  IP: 61.53.232.*
金老师最近好象不太有时间来看这里了啊..
有没有用这本书自学的朋友我们互相交流一下.我的qq:363189852 email: ycrzl@163.com

最好能有人建个qq群就好了.....
#rzl2006 发表于2006-12-28 09:30:17  IP: 61.53.232.*
金老师最近好象不太有时间来看这里了啊..
有没有用这本书自学的朋友我们互相交流一下.我的qq:363189852 email: ycrzl@163.com

最好能有人建个qq群就好了.....
#xiaodaoshan 发表于2007-02-28 18:41:46  IP: 60.164.165.*
金老师,请问combobox控件如何绑定access数据库呢.
我一直在看这本书,真的是一本好书.
我也希望有个QQ群
#xxxxbin 发表于2007-03-19 00:48:41  IP: 218.18.36.*
关于MyEditor与金老师探讨,我也是业余学习,不对之处请指正。
今天刚知道这本书,在csdn上浏览了试读的章节。因为我也曾用过RichTextBox控件,就看了一下MyEditor这个例子,对于设置字体,我有不同看法。

10 If _font.Bold = False Then

11 _font = New Font(_font, _font.Style Or FontStyle.Bold)

12 Else

13 '除去粗体选项

14 _font = New Font(_font, _font.Style - 1)

15 End If

对于除去粗体,你用-1,并在随后解释了为何要-1,这种做法不对,至少不标准。
FontStyle是一个FlagsAttribute类型的枚举值,也就是说是按位设置的,枚举值是不该这样设置的,因为一旦枚举定义改变,上述代码就可能不能得出正确的结果。
我认为上述的语句应该表达为:
_font = new Font(_font, _font.Style ^ FontStyle.Bold);
使用异或将该位反转。(这是C#语法,抱歉我不知道VB的语法)
#xxxxbin 发表于2007-03-19 00:53:00  IP: 218.18.36.*
列出来的语句,只需_font = new Font(_font, _font.Style ^ FontStyle.Bold);一句就解决了,根本用不着分支。
#yfl5061260 发表于2007-07-23 08:27:59  IP: 218.57.50.*
金老师:
您好!p157示例ContainerExample中,我在Form1上添加了一个button(其Text属性为显示第三窗体),同时在本项目内添加了Form3,显示第三窗体的button单击事件中的代码与显示第二窗体的button单击事件中类同,Form3 中的代码与Form2中类同,仅是由2变成3,运行后,如果 treeview在form2中,这时单击form3中的
"收入囊中"按钮,treeview会出现在form3中,请问:1.虽然form2 ,form3都与form1关联,但他们两个并不关联,如何能互相传递treeview呢?2.当treeview出现在form2中时,可以测出(利用contains属性)treeview并不包含在form1中,难道treeview真的跑掉了?怎么回事?里面隐藏的道理请您给讲一下.多谢指导!!非常感谢!!!
#bitfan 发表于2007-07-24 12:52:32  IP: 59.64.166.*
将TreeView的Parent属性设置为一个容器控件,会将其从原有的容器中移除,并加入到新的容器中成为那个容器的Controls集合中的成员。所以,treeView真的“跑掉了!”。
#yfl5061260 发表于2007-07-25 09:13:52  IP: 218.57.54.*
再问:form2 ,form3两个并不互相关联,treeView在form2中时单击form3中的"收入囊中"按钮,treeView又如何跑到form3中去了呢?多谢指导!!
#bitfan 发表于2007-07-26 09:45:36  IP: 59.64.166.*
窗体上的树控件其实是一个TreeView类的对象,它并不依赖于窗体。控件与窗体之间其实是个“对象组合”关系,这种组合是可以打散的。
其改换门庭是修改其Parent属性实现,而其实现代码由.NET Frameowork中实现Parent属性的代码实现。
#penpeis 发表于2008-01-13 20:47:23  IP: 117.11.142.*
两本书我都买了。
我这人向来这样。
买的书多,看的少。很多都是看几页就放起来了。
但这两本不一样。个人以为经典。
尤其适合国内读者。
非常希望老师多出精品。
#leozhuchen 发表于2008-05-24 00:42:51  IP: 60.170.56.*
金老师:
您好!
1.我想请教您,如何在vb.net2005中使用sub main,作为启动对象?
2.我想请教您,如何点击一个按钮,可以使得一个容器(如panel)中调用另一个form
#leozhuchen 发表于2008-05-24 00:48:08  IP: 60.170.56.*
金老师:
您好!
1.我想请教您,如何在vb.net2005中使用sub main,作为启动对象?
2.我想请教您,如何点击一个按钮,可以使得一个容器(如panel)中调用另一个form
#bitfan 发表于2008-05-26 11:17:53  IP: 219.143.205.*
to leozhuchen :
(1)在“项目”属性窗口中可以设置为使用Sub Main()启动。(在“解决方案资源管理器”中双击“My Project“节点可以调出此窗口)
(2)可以将另一个窗体中的所有控件都放在一个Panel中,然后,将此Panel的Parent属性设置为本窗体的Panel对象。就可以模拟实现“窗体嵌入”。
窗体本身是顶级容器,不能直接嵌入到Panel中。
#bitfan 发表于2008-05-26 11:23:06  IP: 219.143.205.*
漏了一点:
在“项目”属性窗口要先取消“Enable Application Framework”选项之后才可以将项目设置为使用Sub Main()启动。
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © bitfan(数字世界一凡人)