| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4460 人关注过本帖
标题:给各位狐友的马年大礼
取消只看楼主 加入收藏
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
结帖率:100%
收藏
 问题点数:0 回复次数:20 
给各位狐友的马年大礼
本人撰写的《FoxPro入门手册》于新年再度改版,本次改版更新了以下几项比较大的内容:
1、如何设计表文件;
2、加入可变长字符型(Varchar)和大二进制(Blob)的介绍;
3、加入对底数为负数时,使用指数运算符的注意点;
4、增加了一个章节:自定义过程与函数;
5、对子查询充实了部分内容;
6、增加了对.NULL.值的介绍。
其它还修正了几处以前不太合适的表述,在此次改版中对Varchar类型的存储作了更详细的介绍。本书在修订时,仍然保持了一贯的风格:用最浅显的语言讲述知识,并适时地介绍一些与FoxPro有关,但又不完全属于FoxPro的计算机知识。
作为开年大礼,以及对新老狐友以前支持的回馈,《FoxPro入门手册》2014年2月版在整个春季期间下载无需任何积分,直至立夏时节恢复积分下载。:-)
下载地址:https://down.bccn.net/6534.html(已根据坛友liuxingang28、antony521的宝贵意见和自己的实验结果作了第4次修订)。


[ 本帖最后由 taifu945 于 2014-3-25 16:43 编辑 ]
收到的鲜花
  • tlliqi2014-02-06 10:05 送鲜花  10朵   附言:加分
搜索更多相关主题的帖子: 计算机 二进制 风格 如何 知识 
2014-02-05 21:43
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用wzxc在2014-2-5 22:16:22的发言:

认真看书学习,弄通Foxpro。
感谢taifu945春节期间,仍然不辞劳苦,为小狐狸们无私奉献。

作为版主,应该的;作为一款经典的桌面数据库系统,我希望它能被更多人用好。其实,中小型单位和部门的数据管理用它很好,Oracle啥的都是杀鸡用牛刀。
收到的鲜花
  • tlliqi2014-02-13 20:39 送鲜花  50朵   附言:原创内容
2014-02-05 22:44
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用hu9jj在2014-2-6 09:22:34的发言:

我按照链接尝试下载,除了被安装了一个“酷屏”程序外,并没有见到什么电子书啊,这是什么回事呢?

点以下红圈处,胡版。
图片附件: 游客没有浏览图片的权限,请 登录注册

2014-02-06 10:41
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用oldhawk在2014-2-9 01:16:59的发言:

正在备份数据库,请稍等1分钟……

怎么回事。
我下载了一下,感觉可以的呀。你要么换个浏览器再试试?
2014-02-09 10:39
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用liuxingang28在2014-2-14 17:00:48的发言:

闲暇之余,花了二天时间认真阅读了该书。总体来说,该书还不错,读后有不少收获,但也发现了几处不足或错误,如下:

1. 第15页,作者建议“字符型数据全部使用Varchar型,这样可避免再使用Alltrim()函数消除多余的尾部空格”。根据本人的开发体验,在VFP下Varchar型并不比Character有优势。一是Varchar并不比Character节省空间,二是Varchar仍然会存储手工录入的空格。VFP提供该字段类型只是为了兼容SQL Server。

2. 第22页,作者建议在命令窗口中输入较长命令时,在行尾输入分号号后按Ctrl_Enter来换行,不能直接按回车。但经上机验证,直接回车也可以。

3. 第38页,在介绍REPLACE命令时,作者认为“有 FOR/WHILE短语时,默认范围是ALL”,应该纠正为:有FOR短语时,默认范围是ALL,有WHILE短语时默认范围是REST,同时有FOR短语和WHILE短语时,默认范围是REST,即WHILE优先。

4. 第42页例3,“skip 记录号-RECNO()”有错误。比如,当前记录号是8,要切换到记录号3时,skip 3-8 则将记录切换到了第2条记录,显然错误。应该修改为:
    go 记录号
    if dele()
        skip
        if eof() and !bof()
            skip -1
        endif
    endif

5. 第74页,关于掩码“9”的作用,作者表述为“只允许输入数字和+-号”,应纠正为“对字符号字段只允许输入数字”,对于数值型字段只允许输入数字和+-号”。

6. 第111页例3,其中的“having avg(英语)>=85”改为“having 英语平均分>=85”更好一些

7. 第142页,其中的“where ... and 成绩=(select ...)”改为“where ... and 成绩 in (select ...)”更好一些,因为若子查询若回多条记录时,程序会出错,使用 in 则不会。

8. SQL的例子中,一个查询语句中出现多个子查询,甚至出现重复的子查询,使程序的可读性很差。其实,在编写SQL语句时,先将子查询输出到一个游标,再对游标进行操作,有时也很好,特别是需要重复引用子查询中的记录时。

9. 第168页第2行,在介绍Between函数时,作者表述为“该函数不区分大小写”,这个表述是错误的。只所以between('B','a','C')返回.f.,是因为Set Collate to "PinYin"引起的,输入Set Collate to "Machine"后,返回.t.。在PinYin排序方式下,不是按字符的Ascii码值进行比较的,而是按其拼音的先后比较,这可能与我们的习惯不同。

10.第196页倒数第6行,在介绍EndScan时,作者专门强调“在Endscan前切换到原工作区”。其实,根本没有必要,在执行Endscan时系统会自动切换到原工作区。

11.第208页倒数第7行中的“skip -reccount()”语句令人费解,应该改为“go top”更容易理解。

12.第247页,第1行,将“THISFORM.backcolor.value=255+255*256+0*65536”改为“thisform.backcolor.value=rgb(255,255,0)”更简单。

13.第268页,在记录导航条的代码中有大量的重复代码,使用算定义方法可能更好。

14.第283页,将Dakai.Click中使用低级文件函数读出文本文件内容的语句改为:THISFORM.源文本区.Value = FileToStr(文件名)。

15.第293页第4行开始的代码段有问题:若备选列表允许多选,则其中的“THISFORM.已选.additem(this.value)”应改为“THISFORM.已选.additem(this.list(i))”;若备选列表不允许多选,则仅需先清除已选列表,再执行“THISFORM.已选.additem(this.value)”一条语句即可。

……
还有很多,由于时间的关系我要下班回家了!
非常感谢你的意见。之所以回复你比较晚,是因为再次对你提出的质疑进行了一一验证,现答复如下:
1、Varchar对于Character的优势并不在于节省空间(这点我在书中也提到了,并介绍了该类型存储的原理),而在于编程时的便捷性,不用考虑字符型的后面是否填充有空格。我个人认为,用可变长字符串的优势在于编程时可少一层考虑,不用担心因为字符串后面无谓的空格而影响程序走向;
2、确实如你所说,直接按回车也可以;
3、经我再次验证:REPLACE...WHILE的默认范围确为REST;同时存在FOR,WHILE两个短语时,以WHILE优先;
4、这个例子经我再一次反复测试,结论与之前一样。你可以打开一个表文件,定位到第8条记录,再用SKIP 3-8,看看是否能回到第3条记录(第3-8条记录没有被删除时)。另外,我这个例子是为了展示如何让指针不误指到已被删除的记录上,不是为了展示SKIP可以比GO更精确地定位记录。所以,这个例子是放在删除记录的小节里介绍的;
5、正如你所说,对于C、V型字段,只允许输入数字;数值型或其兼容型字段允许输入数字和正负号;
6、两种方法是一样的,我个人认为习惯哪种就用哪种;
7、子查询的输出项用了聚集函数MAX(),在没有分组的情况下只可能输出一个数值,不可能有第二个。你可以再仔细斟酌一下,是不是这样;
8、你说得不错,我也是这样认为的。但在不影响可读性的情况下,适当使用子查询也不是不可以。这点,在我子查询介绍的第6点“关于子查询的小结”中已经有指出;
9、经你提醒,我又反复实验了一下:在SET COLLATE TO 'pinyin'/'Stroke'时,BETWEEN()函数不区分大小写,而在SET COLLATE TO 'machine'时区分大小写;
10、确如你所说,ENDSCAN会自动识别配套的SCAN属于哪个表文件;
11、与第6点一样,两种方法都可以的,看个人习惯,我个人习惯用SKIP。还有,这段程序可以用上面黄色背景的一条UPDATE-SQL搞定,写这段代码只是为了对比SQL命令和普通命令;
12、对于RGB()函数,后文已有介绍;
13、不知道你所说的“算定义方法”是什么。这个例子我在发布前也经多次测试,如果四个记录导航按钮不重复写这些代码,光靠一句表单刷新,是不会改变表单显示内容的。这一点,我刚刚又重新测试了一下,确实应该“重复”这些代码;
14、用FILETOSTR()函数读入文本文件确实比低级函数方便。由于以前没用过该函数,因此写本书的时候没想到它;
15、你说的那个例子是单选项,不多选,确实可以按你说的方式改进。
最后,再一次感谢你指出这么多问题,尽管有些地方值得再商榷,但还是能看出你这个论坛新人的实力。而且注册了ID后第一帖就给我,太感谢了,希望以后能在论坛中多多见到你的身影,更希望你在百忙之余继续为本书“找茬”。另外,我会根据你提出的建议修正书中一些不妥的内容,然后再次发布出来,让更多的人用好这款经典的桌面数据库软件。
2014-02-14 22:11
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用liuxingang28在2014-2-18 11:24:46的发言:

1. 关于第4个问题,文中的代码确实有问题,之所以我在举例中将当前记录指定为8,目标记录指定为3,是因为按照书中的例子,第5条记录被删除了,并且Set dele on,所以书中的代码肯定是有问题的。

2. 关于第6个问题,我要说明的是:为计算字段指定别名是为了方便引用,既然为 AVG(英语)指定了别名,那么在HAVING语句中使用别名应该更好一些。

3. 关于第7个问题,我要表述的意思是:用 IN 代替 = 也可以,且适用范围更宽。在我看过的资料中,很少见到用等号连接子查询的用法。

4. 关于第13个问题,我要表述的意思是:将按钮 Click 事件代码中的:“THISFORM.XH_Label.Caption = ……”放到表单的自定义方法中,如:THISFORM.ShowData 代码更简洁,原文并无错误。

1、你说的情况确实存在,但请注意一点:该例子是为了说明当指针指向被删除记录时的处理情形。你说的跳转到3号记录是未被删除的记录,这种情况当然要另外处理。之所以本例代码不作处理,是因为这段代码与本例要说明的主题无关;
2、我说了,这是一个个人习惯问题,无所谓哪个更好。为“AVG(英语)”指定别名,在我看来,只是为了输出显示时栏目名称更一目了然。我并没有强调大家必须用这种方式,每个人可以根据自己的爱好和习惯来写代码;就象我在书中强调写代码的规范性,但你看本论坛上很多人贴上来的代码不也是五花八门的么?
3、既然子查询只可能输出一个数值,那用等号和用IN有什么区别呢?对于“=ANY”这种情况,我向来是用IN的,因为IN比=ANY更好理解。=表示等于,IN表示包含,等于通常用在一对一、多对一比较,而包含通常用在一对多、多对多比较。对于本例来说,属于多对一比较,更强调“等于”,而不是“包含”。我见过很多范例中,类似的情况(与一个定值进行比较相等)都用等号的;
4、本书面向入门者(书名就定义为《入门手册》),所以我采用的代码都力求新手能尽快理解,自定义方法显然对刚入门的人来说有一定难度。已经达到一定水平的用户,可以按自己的方法去重新改写代码。案例只是一种参考,并不是一种模板。
2014-02-18 14:07
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
1、那条命令只是为了说明别名的用法,不是建议大家这么用。我在后面的举例中从未有这么用的;
2、我在介绍很多命令时只是挑比较常用的选项进行介绍,并不是每条命令都介绍所有的选项。TITLE和VALID选项在EDIT中我也作了介绍;
3、你也说了,是“设置”表文件的长名,不是修改,我在本书中没涉及到如何修改表的长名和注释。参考手册不是字典,不可能介绍全面。事实上,教材都不会把一样东西从头到尾都详细地讲述完整;
4、我说了,这是个人习惯问题,请你不要把你的理念强加给别人,我也从未在书里说过只能这样用。再次说明,例子是一种参考,不是一种模板。你可以用GO TOP,但不要去阻止别人用SKIP,除非代码执行的结果有错误。还有,我当初写这本书时有一个宗旨,就是力争在保持代码简洁有效的情况下,多展示几种代码的实现方式,让读者根据自身情况去选择。于是,就有了GO TOP用SKIP -RECCOUNT()代替的写法;
5、第256-257页添加形状确实可以点“布局”工具箱中的“置后”钮进行排列;
6、对于你提出的数组扩容可以保留原数据的说法,我又做了一遍实验(其实写本例时我已多次实验)。依次执行以下命令:
public abc(3)
abc(1)=[row1]
abc(2)=[row2]
abc(3)=[row3]
list memory like abc
public abc(4)
list memory like abc
然后你看截图吧(当然,这也可能是我们所用版本不同造成的),因此,至少在我机器上运行这个例子是一定要借用临时数组的;
图片附件: 游客没有浏览图片的权限,请 登录注册

7、对于这个问题,我觉得是你对命令按钮及命令按钮组的CLICK事件执行关系没理解透彻。首先,命令按钮组和其中的每个按钮都有CLICK事件;其次,两种CLICK事件的执行关系是:如果用户点击的按钮有自己的Click事件代码,则执行按钮本身的;若没有,就执行按钮组的Click事件代码。根据以上两点,如果你用鼠标点击命令按钮中的空档或边界,触发的是组的CLICK事件,而不是按钮的。而组的CLICK事件是空的,所以,即便执行也不会做任何事,对程序一点影响也没有。若你有兴趣的话,可以建一个表单,用调试程序一步步跟进,看看是不是如此;
8、第461页中,确实手误,把7423写成了7432。

感谢你的批评和指正,虽然有些地方我们观点不同,但还是很钦佩你仔细入微地提出意见,让本书得以有质的飞越。感谢钦佩之余,给你一个提醒:看案例代码需要结合上下文来看,并理解好案例所反映的主题。最后,再次由衷感谢,希望能在论坛中常常见到你的身影。
2014-02-20 16:56
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用liuxingang28在2014-2-21 09:01:03的发言:


我用的版本的VFP 9.0 SP2 7423 英文版。不建议用户采用汉化版,汉化版有很多问题。

以下是帮助文件中关于 DIMENSION 命令的解释:

If the number of elements in an array is increased, the contents of all the elements in the original array are copied to the newly redimensioned array. The additional array elements are initialized to False (.F.).
译文:如果数组中元素的数目增加了,就将原数组中所有元素内容复制到维数重新调整过的数组中,增加的数组元素初始化为“假”(.F.)。
我不是很喜欢英文版,没有汉化版的没办法。作为中国人,还是看中文习惯。这也不是什么大不了的事,借用一下临时数组也可解决。话说,你在英文版中亲身测试过这种情况吗?还是只看了帮助说明?
2014-02-21 10:49
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用TonyDeng在2014-2-21 10:54:29的发言:

數組重定義和調整尺寸是不會重置數據的,這種方法我常用,有問題早完蛋了。你的測試結果,原因在於你用public來試驗,帶public的語句,都是帶初始化的執行語句,不像private和local那樣僅僅是聲明,在後者的環境,dimension一個數組,數據是保存的。
因为有时候在表单中定义的数组要跨着用,只能设为PUBLIC。我写了一段测试程序,分别用PUBLIC、DIMENSION、LOCAL、PRIVATE定义数组。实验证明:前三种定义数组的方式都无法在对原数组扩容后保留原值,而PRIVATE干脆就不能定义数组。从实验输出的结果来看,私有型数组必须用DIMENSION来定义。
以下是代码,谁有兴趣,可以复制到VFP9中运行一下,看看结果:
CLEAR
PUBLIC abc(3)
abc(1)=[row1]
abc(2)=[row2]
abc(3)=[row3]
LIST MEMORY LIKE abc
PUBLIC abc(4)
LIST MEMORY LIKE abc
CLEAR MEMORY
DIMENSION abc(3)
abc(1)=[row1]
abc(2)=[row2]
abc(3)=[row3]
LIST MEMORY LIKE abc
DIMENSION abc(4)
LIST MEMORY LIKE abc
CLEAR MEMORY
LOCAL abc(3)
abc(1)=[row1]
abc(2)=[row2]
abc(3)=[row3]
LIST MEMORY LIKE abc
LOCAL abc(4)
LIST MEMORY LIKE abc
CLEAR MEMORY
DO SZ
RETURN
PROCEDURE SZ
   PRIVATE abc(3)
   abc(1)=[row1]
   abc(2)=[row2]
   abc(3)=[row3]
   LIST MEMORY LIKE abc
   PRIVATE abc(4)
   LIST MEMORY LIKE abc
   CLEAR MEMORY
   RETURN
ENDPROC
运行结果截图:
图片附件: 游客没有浏览图片的权限,请 登录注册

从实验结果来看,应该不是你说的这个原因。我现在最想这里有人拿上面的代码在英文原版的VFP9上运行一下,看看什么结果。从程序本身的角度来讲,我觉得现在的结果是合理的。因为数组定义语句的原理就是重新定义一片连续的内存地址给这个数组,不会因为数组的名称是否相同就会保留原来的值。学过汇编语言的人应该知道,同一数组中的各元素在内存中是占据一片连续地址的,变量名只是为了高级语言使用内存地址方便而采取的一种措施。值是否保留其实不是看表面的变量名,而应该看重新定义了数组后是否还是原来的那片地址。显然,VFP9不是,它在执行数组定义命令后,是另寻一片连续的未用过的地址给程序的。当然,我这个结论也有待英文原版的VFP9去验证。


[ 本帖最后由 taifu945 于 2014-2-21 12:22 编辑 ]
2014-02-21 12:15
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用liuxingang28在2014-2-21 12:17:34的发言:


我的贴子均是在本人机器上测试后才回复的。如果用VFP开发正式的应用系统,VFP的稳定性十分重要,使用汉化版玩一下还可以,若用它开发应用程序肯定不行!

我没觉得不行,我以前毕业设计时做的学生管理系统,几万行代码也是用的汉化版VFP,稳定使用了好几年,直到用户单位提出用网络管理学生后才终止使用的。前阵子我又用这个汉化版为该用户单位做了一个创新实践的系统,目前还在其XP系统上稳定地运行,而我这套系统是在家里Windows 7 x64位上开发的。哪里肯定不行?
我相信你的帖子不会信口开河,但微软的帮助文件也不是完全没有错误。你可以拿我上面的一段代码到你的原版VFP9去运行试试,然后把运行结果截图上来看看。我也很想知道数组的这个问题到底是汉化版独有的,还是VFP9原生就是这样处理的。
2014-02-21 12:28
快速回复:给各位狐友的马年大礼
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015397 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved