随笔 - 29, 文章 - 42, 评论 - 12, 引用 - 0
数据加载中……

2005年6月23日

修改时间

declare @time varchar(8),@datetime datetime

declare cursor_time cursor for select right(datetime,8) from att_original where left(datetime,10) = '06 11 2003'
open cursor_time
fetch next from cursor_time into @time

declare cursor_user cursor for select * from att_original  where left(datetime,10) = '06 11 2003'
open cursor_user

fetch next from cursor_user

while @@fetch_status = 0
begin
  set @datetime = '2005-06-11 '+ '' + @time
  update att_original set datetime = @datetime where current of cursor_user

  fetch next from cursor_user
  fetch next from cursor_time into @time
end

 

close cursor_user
deallocate cursor_user

close cursor_time
deallocate cursor_time

select * from att_original

posted @ 2005-06-23 18:14 Eagletian 阅读(233) | 评论 (0)编辑

2005年3月10日

小结

1、Flash图层的应用:图层的类型(普通、引导/被引导、蒙板/被蒙板)

posted @ 2005-03-10 16:56 Eagletian 阅读(250) | 评论 (0)编辑

2005年3月9日

薪酬管理

一、《现代企业薪酬知识讲座》:
   1、经济性薪酬:直接性:

posted @ 2005-03-09 17:46 Eagletian 阅读(320) | 评论 (0)编辑

小结

1、Flash第4章 动画制作:
    
Flash MX动画中的运动可以分为平动和转动,变化可分为颜色和形状;
   运动过渡动画和变形过渡动画;
   帧的类型、标签和注释;
   洋葱皮技术。
注:所画的图形无法直接进行帧的运动变化,转化为元件都即可以。为什么呢?

posted @ 2005-03-09 17:13 Eagletian 阅读(328) | 评论 (0)编辑

2005年3月8日

小结

1、Flash学习中,有一个问题:(1)字的旋转效果实现;
2、初步查找了HR的相关资源网站:已存入连接;

posted @ 2005-03-08 17:48 Eagletian 阅读(182) | 评论 (0)编辑

2005年3月7日

小结

1、初步选定Yahoo的“效率手册”作为我的时间管理工具;
2、初步制定近期工作、生活目标,以及时间计划;
3、今天的主要工作是:WEB设计(Flash学习)《Flash MX动画制作实例教程》学习完第二章,但最后的例子实现有问题,   
     Actions的使用不太懂。

posted @ 2005-03-07 16:48 Eagletian 阅读(192) | 评论 (1)编辑

管理定律大全 www.shanzei.com

一、 素养

蓝斯登原则:在你往上爬的时候,一定要保持梯子的整洁,否则你下来时可能会滑倒。
提出者:美国管理学家蓝斯登。
点评:进退有度,才不至进退维谷;宠辱皆忘,方可以宠辱不惊。

卢维斯定理 :谦虚不是把自己想得很糟,而是完全不想自己。
提出者:美国心理学家卢维斯
点评:如果把自己想得太好,就很容易将别人想得很糟。

托利得定理: 测验一个人的智力是否属于上乘,只看脑子里能否同时容纳两种相反的思想,而无碍于其处世行事。
提出者:法国社会心理学家托利得
点评:思可相反,得须相成。

二、统御

刺猬理论 :刺猬在天冷时彼此靠拢取暖,但保持一定距离,以免互相刺伤。
点评:保持亲密的重要方法,乃是保持适当的距离。

鲦鱼效应 :鲦鱼因个体弱小而常常群居,并以强健者为自然首领。将一只稍强的鲦鱼脑后控制行为的部分割除后,此鱼便失去自制力,行动也发生紊乱,但其他鲦鱼却仍像从前一样盲目追随。
提出者:德国动物学家霍斯特
点评:1、下属的悲剧总是领导一手造成的。 2、下属觉得最没劲的事,是他们跟着一位最差劲的领导。

雷鲍夫法则 :在你着手建立合作和信任时要牢记我们语言中:
1、最重要的八个字是:我承认我犯过错误
2、最重要的七个字是:你干了一件好事
3、最重要的六个字是:你的看法如何
4、最重要的五个字是:咱们一起干
5、最重要的四个字是:不妨试试
6、最重要的三个字是:谢谢您
7、最重要的两个字是:咱们
8、最重要的一个字是:您
提出者:美国管理学家雷鲍夫
点评:1、最重要的四个字是:不妨试试; 2、最重要的一个字是:您

洛伯定理 :对于一个经理人来说,最要紧的不是你在场时的情况,而是你不在场时发生了什么。
提出者:美国管理学家洛伯
点评:如果只想让下属听你的,那么当你不在身边时他们就不知道应该听谁的了。

三、沟通

斯坦纳定理 :在哪里说得愈少,在哪里听到的就愈多。
提出者:美国心理学家斯坦纳
点评:只有很好听取别人的,才能更好说出自己的。

费斯诺定理:人两只耳朵却只有一张嘴巴,这意味着人应该多听少讲。
提出者:英国联合航空公司总裁兼总经理费斯诺
点评:说得过多了,说的就会成为做的障碍。

牢骚效应 :凡是公司中有对工作发牢骚的人,那家公司或老板一定比没有这种人或有这种人而把牢骚埋在肚子里公司要成功得多。
提出者:美国密歇根大学社会研究院
点评:1、牢骚是改变不合理现状的催化剂。 2、牢骚虽不总是正确的,但认真对待牢骚却总是正确的。

避雷针效应 :在高大建筑物顶端安装一个金属棒,用金属线与埋在地下的一块金属板连接起来,利用金属棒的尖端放电,使云层所带的电和地上的电逐渐中和,从而保护建筑物等避免雷击。
点评:善疏则通,能导必安

四、协调

氨基酸组合效应 :组成人体蛋白的八种氨基酸,只要有一种含量不足,其他七种就无法合成蛋白质。
点评:当缺一不可时,一就是一切。

米格-25效应 :前苏联研制的米格-25喷气式战斗机的许多零部件与美国的相比都落后,但因设计者考虑了整体性能,故能在升降、速度、应急反应等方面成为当时世界一流。
点评:所谓最佳整体,乃是个体的最佳组合。

磨合效应 :新组装的机器,通过一定时期的使用,把磨擦面上的加工痕迹磨光而变得更加密合。
点评:要想达到完整的契合,须双方都做出必要的割舍。
 

五、指导

波特定理 :当遭受许多批评时,下级往往只记住开头的一些,其余就不听了,因为他们忙于思索论据来反驳开头的批评。
提出者:英国行为学家波特
点评:总盯着下属的失误,是一个领导者的最大失误。

蓝斯登定律 :跟一位朋友一起工作,远较在父亲之下工作有趣得多。
提出者:美国管理学家蓝斯登
点评:可敬不可亲,终难敬;有权没有威,常失权。

吉尔伯特法则 :工作危机最确凿的信号,是没有人跟你说该怎样作。
提出者:英国人力培训专家吉尔伯特
点评:真正危险的事,是没人跟你谈危险。

权威暗示效应 :一化学家称,他将测验一瓶臭气的传播速度,他打开瓶盖15秒后,前排学生即举手,称自己闻到臭气,而后排的人则陆续举手,纷纷称自己也已闻到,其实瓶中什么也没有。
点评:迷信则轻信,盲目必盲从。
 

六、组织

奥尼尔定理 :所有的政治都是地方的。
提出者:美国前众议院院长奥尼尔
点评:只有能切身体会到的,群众才认为那是真实的。

定位效应: 社会心理学家曾作过一个试验:在召集会议时先让人们自由选择位子,之后到室外休息片刻再进入室内入座,如此五至六次,发现大多数人都选择他们第一次坐过的位子。
点评:凡是自己认定的,人们大都不想轻易改变它。

艾奇布恩定理 :如果你遇见员工而不认得,或忘了他的名字,那你的公司就太大了点。
提出者:英国史蒂芬约瑟剧院导演亚伦艾奇布恩
点评:摊子一旦铺得过大,你就很难把它照顾周全。
 

七、培养

吉格勒定理 :除了生命本身,没有任何才能不需要后天的锻炼。
提出者:美国培训专家吉格吉格勒
点评:水无积无辽阔,人不养不成才。

犬獒效应 :当年幼的藏犬长出牙齿并能撕咬时,主人就把它们放到一个没有食物和水的封闭环境里让这些幼犬自相撕咬,最后剩下一只活着的犬,这只犬称为獒。据说十只犬才能产生一只獒。
点评:困境是造就强者的学校。
 

八、选拔

近因效应 :最近或最后的印象对人的认知有强烈的影响。
提出者:美国社会心理学家洛钦斯。
点评:结果往往会被视为过程的总结。

洒井法则 :在招工时用尽浑身解数,使出各种方法,不如使自身成为一个好公司,这样人才自然而然会汇集而来。
提出者:日本企业管理顾问酒井正敬。
点评:不能吸引人才,已有的人才也留不住。

美即好效应 :对一个外表英俊漂亮的人,人们很容易误认为他或她的其他方面也很不错。
提出者:美国心理学家丹尼尔麦克尼尔。
点评:印象一旦以情绪为基础,这一印象常会偏离事实。
 

九、任用

奥格尔维法则 :如果我们每个人都雇用比我们自己都更强的人,我们就能成为巨人公司。
提出者:美国奥格尔维马瑟公司总裁奥格尔维。
点评:如果你所用的人都比你差,那么他们就只能作出比你更差的事情。

皮尔卡丹定理 :用人上一加一不等于二,搞不好等于零。
提出者:法国著名企业家皮尔卡丹。
点评:组合失当,常失整体优势,安排得宜,才成最佳配置。
 

十、激励

马蝇效应 :再懒惰的马,只要身上有马蝇叮咬,它也会精神抖擞,飞快奔跑。
点评:有正确的刺激,才会有正确的反应。

倒u形假说 :当一个人处于轻度兴奋时,能把工作作得最好。当一个人一点儿兴奋都没有时,也就没有作好工作的动力了;相应地,当一个人处于极度兴奋时,随之而来的压力可能会使他完不成本该完成的工作。世界网坛名将贝克尔之所以被称为常胜将军,其秘诀之一即是在比赛中自始至终防止过度兴奋,而保持半兴奋状态。所以有人亦将倒u形假说称为贝克尔境界。
提出者:英国心理学家罗伯特?耶基斯和多德林。
点评:1、激情过热,激情就会把理智烧光。 2、热情中的冷静让人清醒,冷静中的热情使人执着。
 

十一、调研

特伯论断 :在数字中找不到安全。
提出者:美国经济学家特伯。
点评:数字是死的,情况是活的。

摩斯科定理 :你得到的第一个回答,不一定是最好的回答。
提出者:美国管理学家摩斯科。
点评:刨根得根,问底知底。
 

十二、预测

罗杰斯论断 :成功的公司不会等待外界的影响来决定自己的命运,而是始终向前看。
提出者:美国IBM公司前总裁罗杰斯。
点评:只想随波逐流,难有理想彼岸。

萨盖定律 :戴一块手表的人知道准确的时间,戴两块手表的人便不敢确定几点了。
提出者:英国心理学家萨盖。
点评:若选错误参照,必无正确比较。

隧道视野效应 :一个人若身处隧道,他看到的就只是前后非常狭窄的视野。
点评:1、不拓心路,难开视野。2、视野不宽,脚下的路也会愈走愈窄。
 

十三、目标

巴菲特定律 :在其他人都投了资的地方去投资,你是不会发财的。
提出者:美国股神巴菲特。
点评:1、善于走自己的路,才可望走别人没走过的路。2、特色不特,优势无优。

古特雷定理 :每一处出口都是另一处的入口。
提出者:美国管理学家古特雷。
点评:上一个目标是下一个目标的基础,下一个目标是上一个目标的延续。
 

十四、计划

列文定理 :那些犹豫着迟迟不能作出计划的人,通常是因为对自己的能力没有把握。
提出者:法国管理学家列文。
点评:如果没有能力去筹划,就只有时间去后悔了。

弗洛斯特法则 :在筑墙之前应该知道把什么圈出去,把什么圈进来。
提出者:美国思想家弗洛斯特。
点评:开始就明确了界限,最终就不会作出超越界限的事来。
 

十五、参谋

波克定理 :只有在争辩中,才可能诞生最好的主意和最好的决定。
提出者:美国庄臣公司总经理詹姆士?波克。
点评:无磨擦便无磨合,有争论才有高论。

韦奇定理 :即使你已有了主见,但如果有十个朋友看法和你相反,你就很难不动摇。
提出者:美国洛杉矶加州大学经济学家伊渥?韦奇。
点评:1、未听之时不应有成见,既听之后不可无主见。 2、不怕开始众说纷纭,只怕最后莫衷一是。
 

十六、决策

福克兰定律 :没有必要作出决定时,就有必要不作决定。
提出者:法国管理学家福克兰。
点评:当不知如何行动时,最好的行动就是不采取任何行动。

王安论断 :犹豫不决固然可以免去一些作错事的机会,但也失去了成功的机遇。
提出者:美籍华裔企业家王安博士。
点评:寡断能使好事由好变坏,果断可将危机转危为安。
 

十七、执行

格瑞斯特定理 :杰出的策略必须加上杰出的执行才能奏效。
提出者:美国企业家格瑞斯特。
点评:好事干实更好,实事办好愈实。

吉德林法则 :把难题清清楚楚地写出来,便已经解决了一半。
提出者:美国通用汽车公司管理顾问查尔斯?吉德林。
点评:杂乱无章的思维,不可能产生有条有理的行动。
 

十八、信息

沃尔森法则 :把信息和情报放在第一位,金钱就会滚滚而来。
提出者:美国企业家沃尔森。
点评:你能得到多少,往往取决于你能知道多少。

塔马拉效应 :塔马拉是捷克雷达专家弗?佩赫发明的一种雷达,它与其他雷达的最大不同是不发射信号而只接收信号,故不会被敌方反雷达装置发现。
点评:善藏者人不可知,能知者人无以藏。
 

十九、监督

小池定理 :越是沉醉,就越是抓住眼前的东西不放。
提出者:日本管理学家小池敬。
点评:自我陶醉不易清醒,自以为是不喜批评。

赫勒法则 :当人们知道自己的工作成绩有人检查的时候会加倍努力。
提出者:英国管理学家赫勒。
点评:只有在相互信任的情况下,监督才会成为动力。
 

二十、控制

横山法则 :最有效并持续不断的控制不是强制,而是触发个人内在的自发控制。
提出者:日本社会学家横山宁夫。
点评:有自觉性才有积极性,无自决权便无主动权

蝴蝶效应:紊乱学研究者称,南半球某地的一只蝴蝶偶尔扇动一下翅膀所引起的微弱气流,几星期后可变成席卷北半球某地的一场龙卷风。他们将这种由一个极小起因,经过一定的时间,在其他因素的参与作用下,发展成极为巨大和复杂后果的现象称为蝴蝶效应。
点评:善终者慎始,谨小者慎微。

阿什法则 :承认问题是解决问题的第一步。
提出者:美国企业家阿什。
点评:你愈是躲着问题,问题愈会揪住你不放。
 

二十一、法纪

洛克忠告 :规定应该少定,一旦定下之后,便得严格遵守。
提出者:英国教育家洛克 。
点评:简则易循,严则必行。

热炉法则 :当人用手去碰烧热的火炉时,就会受到烫的惩罚,其有以下三个特点:即时性、预警性、平等性。
点评:罪与罚能相符,法与治可相期。
 

二十二、改革

柯美雅定律 :世上没有十全十美的东西,所以任何东西都有改革的余地。
提出者:美国社会心理学家柯美雅。
点评:不拘于常规,才能激发出创造力。

达维多夫定律 :没有创新精神的人永远也只能是一个执行者。
提出者:前苏联心理学家达维多夫
点评:只有敢为人先的人,才最有资格成为真正的先驱者。

自吃幼崽效应 :美国硅谷企业竞争十分激烈,以至于各公司都积极寻找自己的致命弱点,所有公司共同的生存之道是:拿出更好看产品来击败自己的原有产品。有人将这种行为戏称为自吃幼崽。
点评:1、自己不逼自己,别人迟早会逼你。 2、敢于对过去告一个段落,才有信心掀开新的一章。
 

二十三、创新

舍恩定理 :新思想只有落到真正相信它,对它着迷的人手里才能开花结果。
提出者:美国麻省理工学院教授舍恩。
点评:只有信之不疑,才能持之以恒。

吉宁定理 :真正的错误是害怕犯错误。
提出者:美国管理学家吉宁。
点评:不怕错误的人,错误往往也离他最远。

卡贝定理 :放弃是创新的钥匙。
提出者:美国电话电报公司前总经理卡贝。
点评:在未学会放弃之前,你将很难懂得什么是争取。

posted @ 2005-03-07 08:49 Eagletian 阅读(717) | 评论 (0)编辑

2005年3月5日

ITSM网上资源导航 From:act.it.sohu.com 《IT服务管理:概念、理解与实施》

第9章 IT服务外包管理

附录1 ITSM网上资源导航

    

组织机构

www.itgov.org.cn
中国IT治理论坛网站。致力于探讨信息化建设中深层次的机制问题,倡导将国际上前沿的IT治理机制及其方法论与中国的国情相结合,走有中国特色的IT治理之路。聚焦领域涵盖信息系统审计、信息化工程监理、IT服务管理、信息安全管理、IT项目管理以及国内外的IT标准和咨询方法论。

www.itsmportal.cn
国际IT服务管理门户中国分站。

www.ogc.gov.uk
英国政府商务部(OGC)官方网站。OGC是IT服务管理领域事实上的国际标准ITIL的所有者。

www.itsmf.com
国际IT服务管理论坛(itSMF)官方网站。ItSMF是国际上唯一被认可的IT服务管理行业组织,在全世界设立了超过16个国家分会。

www.iosm.com
IT服务管理学院(Institute of Service Management)网站。IoSM是一个面向IT服务管理专业人士的机构。

www.bita-center.com
商业和信息技术整合研究中心(The Business IT Alignment (bITa) Center)网站。该中心致力于商业与信息技术的战略整合,以及各种IT管理标准之间的协调和融合。

www.thinkhdi.com
帮助台协会(HDI)官方网站。HDI是世界服务和支持业中最大的协会。

www.bcs.org.uk
英国计算机协会(BCS)网站。BCS通过信息系统考试委员会(Information Systems Examination Board)负责英联邦地区的IT服务管理(ITSM)认证考试。

www.bsi-global.com
英国标准协会(BSI)网站。BSI是英国IT服务管理国家标准BSI15000的制订者和所有者。BSI15000现正提交给国际标准化组织以成为IT服务管理国际标准。

新闻、白皮书、术语表和出版物

http://industry.ccidnet.com
赛迪网中国信息化子站,关注中国信息化建设的热点、难点和疑点,读者亦可通过此站与本书著者互动交流。

http://media.ccidnet.com/ccu 
《中国计算机用户周刊》,面向高端用户的IT权威媒体。

http://En.itsmportal.net
国际IT服务管理领域最大的独立IT服务管理方面信息交换平台,在多个国家设有分站,包括中国(见www.itsmportal.cn)。

www.itilpeople.com/
一个包含大量ITSM类文章、术语、链接和缩略语的网站。

http://InterPromUSA.com
包含大量ITSM方面的文档。同时该网站还出版一份电子版的ITSM月刊。

软件

www.ca.com.cn
冠群电脑(中国)有限公司Unicenter软件的官方网站。

www.openview.hp.com
HP公司OpenView软件的官方网站。

www.hiss.cn/jp1/
日立信息系统(上海)有限公司JP1软件的官方网站。

www.bmc.com/zh_CN/
博思软件(中国)有限公司Remedy软件的官方网站。

http://www-900.ibm.com/cn/software/tivoli/
IBM公司Tivoli软件的官方网站。

培训和认证

www.ccidtraining.com
training.ccidnet.com/ccid
中国电子信息产业发展研究院培训中心(简称赛迪培训)。赛迪培训为政府组织和企业提供世界级水准的信息化管理培训服务,其课程体系中立于任何软硬件提供商,围绕着IT治理这一核心理念,从客观的立场提供六大系列紧密相关的课程,即IT服务管理系列、信息系统审计系列、评估和监理系列、信息安全管理系列、管理信息化系列、IT项目管理系列、信息化战略规划系列。

www.ca.com.cn/education/
冠群电脑(中国)有限公司网站教育与培训频道。

www.hp.com.cn/support/education/itm/
HP公司IT管理学院。

posted @ 2005-03-05 16:11 Eagletian 阅读(493) | 评论 (0)编辑

2005年3月4日

实战Delphi数据网格色彩特效

Delphi中的数据网格控件(TDbGrid)对于显示和编辑数据库中大量的数据起着十分重要的作用;然而,在使用数据网格控件的同时,也往往因为表格中大量的数据不易区分,而令操作者眼花缭乱。如何提高网格控件的易用性,克服它的此项不足呢?本文从改变数据网格的色彩配置角度,提出了一种解决办法。

  以下为数据网格控件的6种特殊效果的实现方法,至于数据网格控件与数据集如何连接的方法从略。

  1. 纵向斑马线效果:实现网格的奇数列和偶数列分别以不同的颜色显示,以区别相邻的数据列。

  file://在DbGrid的DrawColumnCell事件中编写如下代码:

  Case DataCol Mod 2 = 0 of

   True: DbGrid1.Canvas.Brush.Color:= clBlue; file://偶数列用蓝色

   False: DbGrid1.Canvas.Brush.Color:= clAqua; file://奇数列用浅绿色

  End;

  DbGrid1.Canvas.Pen.Mode:=pmMask;

  DbGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);

2. 纵向斑马线,同时以红色突出显示当前单元格效果:以突出显示当前选中的字段。

  file://将上述代码修改为:

  Case DataCol Mod 2 = 0 of

   True: DbGrid1.Canvas.Brush.Color:= clBlue; file://偶数列用蓝色

   False: DbGrid1.Canvas.Brush.Color:= clAqua; file://奇数列用浅绿色

  End;

  If ((State = [gdSelected]) or (State=[gdSelected,gdFocused])) then

    If Not DbGrid1.SelectedRows.CurrentRowSelected then

      DbGrid1.Canvas.Brush.Color:=clRed; file://当前选中单元格显示红色       DbGrid1.Canvas.Pen.Mode:=pmMask;

      DbGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);

上述两种方法突出了列的显示效果。

  3.在数据网格中以红色突出显示当前选中的行。

  设置DbGrid控件的Options属性中的dgRowSelect属性为真,Color属性为clAqua(背景色), 在DbGrid的DrawColumnCell事件中编写如下代码:

  if ((State = [gdSelected]) or (State=[gdSelected,gdFocused])) then

   DbGrid1.Canvas.Brush.color:=clRed; file://当前行以红色显示,其它行使用背景的浅绿色

   DbGrid1.Canvas.pen.mode:=pmmask;

   DbGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);

  4.行突显的斑马线效果:既突出当前行,又区分不同的列(字段)。

  file://其它属性设置同3,将上述代码修改为:

  if ((State = [gdSelected]) or (State=[gdSelected,gdFocused])) then

   begin

    Case DataCol Mod 2 = 0 of

     True : DbGrid1.Canvas.Brush.color:=clRed; file://当前选中行的偶数列显示红色

     False: DbGrid1.Canvas.Brush.color:=clblue; file://当前选中行的奇数列显示蓝色

    end;

   DbGrid1.Canvas.pen.mode:=pmmask;

   DbGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);

  end;


  5.横向斑马线, 同时以红色突显当前行效果。

  file://其它属性设置同3,将上述代码修改为:

  Case Table1.RecNo mod 2 = 0 of file://根据数据集的记录号进行判断

   True : DbGrid1.Canvas.Brush.color:=clAqua; file://偶数行用浅绿色显示

   False: DbGrid1.Canvas.Brush.color:=clblue; file://奇数行用蓝色表示

  end;

  if ((State = [gdSelected]) or (State=[gdSelected,gdFocused])) then file://选中行用红色显示

   DbGrid1.Canvas.Brush.color:=clRed;

   DbGrid1.Canvas.pen.mode:=pmMask;

   DbGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);

  6.双向斑马线效果:即行间用不同色区分,同时,选中行以纵向斑马线效果区分不同的列。

  file://其它属性设置同3,将上述代码修改为:

  Case Table1.RecNo mod 2 = 0 of file://根据数据集的记录号进行判断

   True : DbGrid1.Canvas.Brush.color:=clAqua; file://偶数行用浅绿色显示

   False: DbGrid1.Canvas.Brush.color:= clblue; file://奇数行用蓝色表示

  end;

  If ((State = [gdSelected]) or (State=[gdSelected,gdFocused])) then

  Case DataCol mod 2 = 0 of

   True : DbGrid1.Canvas.Brush.color:=clRed; file://当前选中行的偶数列用红色

   False: DbGrid1.Canvas.Brush.color:= clGreen; file://当前选中行的奇数列用绿色表示

  end;

  DbGrid1.Canvas.pen.mode:=pmMask;

  DbGrid1.DefaultDrawColumnCell (Rect, DataCol, Column, State);

上述6种方法分别就数据网格控件的列和行的色彩进行了设置,读者可以根据自己的需要设置特效。该程序在Delphi5中测试通过。

posted @ 2005-03-04 17:04 Eagletian 阅读(227) | 评论 (0)编辑

自制精美易用的DBGrid from: www.delphifans.com

看了以上这么多的技巧和方法,想必大家未免会有一种冲动吧-自己动手做一个DBGrid,下面就介绍一种自制DBGrid的方法啦。

    Delphi中的TDBGrid是一个使用频率很高的VCL元件。TDBGrid有许多优良的特性,例如它是数据绑定的,能够定义功能强大的永久字段,事件丰富等,特别是使用非常简单。但是,与FoxPro、VB 、PB中的DBGrid相比就会发现,TDBGrid也有明显的缺陷:它的键盘操作方式非常怪异难用。虽然很多人都通过编程把回车键转换成Tab键来改进TDBGrid的输入方式,但是仍然不能很好地解决问题,这是为什么呢?本文将对造成这种缺陷的根本原因进行分析,并在此基础上制作一个输入极其简便、界面风格类似Excel的DBGridPro元件。

     DBGrid的格子(Cell)有四种状态:输入状态(有输入光标,可以输入,记作状态A1);下拉状态(弹出了下拉列表,可以选择,记作状态A2);高亮度状态(没有输入光标,可以输入,记作状态B);显示状态(不能输入,记作状态C)。DBGrid接受的控制键有回车,Tab,Esc,以及方向键。据此可以画出每个Cell的状态转换图:

    不难看出,当用户移动输入焦点时,对不同的移动方向要用不同的操作方法,甚至可能必须使用多个不同的键或借助鼠标来完成一个操作。当有下拉列表和要斜向移动的时候这种问题尤为明显。因此,输入困难的根本原因是其状态图过于复杂和不一致。基于这种认识,我们可以对DBGrid作三点改造:

    改造1:显然B状态是毫无意义的,应该去掉。这意味着焦点每进入一个新的Cell,就立即进入编辑状态,而不要再按回车了。每个进入状态B的Cell都需要重新绘制,因此我们可以在绘制动作中判断是否有状态为gdFocused的Cell,若有则设置EditorMode为真。值得注意的是,TDBGrid用来画Cell的函数DefaultDrawColumnCell并不是虚函数,因此不能通过继承改变其行为,而只能使用其提供的事件OnDrawColumnCell来插入一些动作。在DBGridPro中,这一点是通过实现显示事件OnDrawColumnCell来实现的。但是这样一来,外部对象就不能使用该事件了,所以提供了一个OnOwnDrawColumnCell事件来替代它。见代码中的Create和DefaultDrawColumnCell函数。

    改造2:控制键应该简化,尽量增加每个控制键的能力。在DBGridPro中,强化了方向键和回车键的功能:当光标在行末行首位置时,按方向键就能跳格;回车能横向移动输入焦点,并且还能弹出下拉列表(见改造3)。在实现方法上,可以利用键盘事件API(keybd_event)来将控制键转换成TDBGrid的控制键(如在编辑状态中回车,则取消该事件并重新发出一个Tab键事件)。当监测到左右方向键时,通过向编辑框发送EM_CHARFROMPOS消息判断编辑框中的光标位置,以决定是否应该跳格。见代码中的DoKeyUped函数。

    改造3:简化下拉类型Cell的输入方式。在DBGridPro中,用户可以用回车来弹出下拉列表。这种方式看起来可能会造成的回车功能的混淆,但是只要处理得当,用户会觉得非常方便:当进入下拉类型的Cell之后,如果用户直接键入修改,则按回车进入下一格;否则弹出下拉列表,选择之后再按回车时关闭下拉列表并立即进入下一格。见代码中的DoKeyUped函数和DefaultDrawColumnCell函数。

    一番改造之后,用户输入已经非常方便了,但是又带来了新的问题:在TDBGrid中,用户可以通过高亮度的Cell很快知道焦点在哪里,而DBGridPro中根本不会出现这种Cell,所以用户可能很难发现输入焦点!一种理想的方法是像Excel一样在焦点位置处放一个黑框--这一点是可以实现的(如图2)。

    Windows中提供了一组API,用于在窗口上建立可接受鼠标点击事件的区域(Region)。多个Region可以以不同的方式组合起来,从而得到"异型"窗口,包括空心窗口。DBGridPro就利用了这个功能。它在内部建立了一个黑色的Panel,然后在上面设置空心的Region,并把它"套"在有输入焦点的Cell上,这样用户就能看到一个醒目的边框了。

    好事多磨,现在又出现了新的问题:当Column位置或宽度改变时,其边框必须同步变化。仅利用鼠标事件显然不能完全解决这个问题,因为在程序中也可以设置Column的宽度;用事件OnDrawColumnCell也不能解决(宽度改变时并不触发该事件)。幸运的是,TDBGrid中的输入框实际上是一个浮动在它上面的TDBGridInplaceEdit(继承自TInplaceEdit),如果我们能监测到TDBGridInplaceEdit在什么时候改变大小和位置,就可以让边框也跟着改变了。要实现这一点,用一个从TDBGridInplaceEdit继承的、处理了WM_WINDOWPOSCHANGED消息的子类来替换原来的TDBGridInplaceEdit将是最简单的办法。通过查看源代码发现,输入框由CreateEditor函数创建的,而这是个虚函数--这表明TDBGrid愿意让子类来创建输入框,只要它是从TInplaceEdit类型的。从设计模式的角度来看,这种设计方法被称为"工厂方法"(Factory Method),它使一个类的实例化延迟到其子类。看来现在我们的目的就要达到了。

    不幸的是,TDBGridInplaceEdit在DBGrids.pas中定义在implement中(这样外部文件就无法看到其定义了),因此除非把它的代码全部拷贝一遍,或者直接修改DBGrids.pas文件(显然这前者不可取;后者又会带来版本兼容性问题),我们是不能从TDBGridInplaceEdit继承的。难道就没有好办法了吗?当然还有:我们可以利用TDBGridInplaceEdit的可读写属性WindowProc来捕获WM_WINDOWPOSCHANGED消息。WindowProc实际上是一个函数指针,它指向的函数用来处理发到该窗口元件的所有消息。于是,我们可以在CreateEditor中将创建出的TDBGridInplaceEdit的WndProc替换成我们自己实现的勾挂函数的指针,从而实现和类继承相同的功能。这样做的缺点是破坏了类的封装性,因为我们不得不在DBGridPro中处理属于TDBGridInplaceEdit的工作。当然,可能还有其他更好的方法,欢迎读者提出建议。

    至此,TDBGrid已经被改造成一个操作方便、界面美观的DBGridPro了,我们可以把它注册成VCL元件使用。以下是它的源代码:


unit DBGridPro;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Grids, DBGrids, ExtCtrls, richEdit, DBCtrls, DB;

type TCurCell = Record {当前焦点Cell的位置}
  X : integer; {有焦点Cell的ColumnIndex}
  Y : integer; {有焦点Cell所在的纪录的纪录号}
  tag : integer; {最近进入该Cell后是否弹出了下拉列表}
  r : TRect; {没有使用}
end;

type
  TDBGridPro = class(tcustomdbgrid)
  private
    hr,hc1 : HWND; {创建空心区域的Region Handle}
    FPan : TPanel; {显示黑框用的Panel}
    hInplaceEditorWndProc : TWndMethod; {编辑框原来的WindowProc}
    {勾挂到编辑框的WindowProc}
    procedure InPlaceEditorWndProcHook(var msg : TMessage);
    procedure AddBox; {显示边框}
    {实现TCustomDBGrid的OnDrawColumnCell事件}
    procedure DoOwnDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
    {处理键盘事件}
    procedure DoKeyUped(Sender: TObject; var Key: Word; Shift: TShiftState);

  protected
    curCell : TCurCell; {记录当前有焦点的Cell}
    FOwnDraw : boolean; {代替TCustomDBGrid.DefaultDrawing}
    FOnDraw : TDrawColumnCellEvent; {代替TCustomDBGrid.OnDrawColumnCell}
    function CreateEditor : TInplaceEdit; override;
    procedure KeyUp(var Key: Word; Shift: TShiftState); override;
    procedure DefaultDrawColumnCell(const Rect: TRect;DataCol: Integer; Column: TColumn; State: TGridDrawState); overload;

  public
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;

  published
    property Align;
    property Anchors;
    property BiDiMode;
    property BorderStyle;
    property Color;
    property Columns stored False; //StoreColumns;
    property Constraints;
    property Ctl3D;
    property DataSource;
    property OwnDraw : boolean read FOwnDraw write FOwnDraw default false;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    property FixedColor;
    property Font;
    property ImeMode;
    property ImeName;
    property Options;
    property ParentBiDiMode;
    property ParentColor;
    property ParentCtl3D;
    property ParentFont;
    property ParentShowHint;
    property PopupMenu;
    property ReadOnly;
    property ShowHint;
    property TabOrder;
    property TabStop;
    property TitleFont;
    property Visible;
    property OnCellClick;
    property OnColEnter;
    property OnColExit;
    property OnColumnMoved;
    property OnDrawDataCell; { obsolete }
    property OnOwnDrawColumnCell : TDrawColumnCellEvent read FOnDraw write FOnDraw;
    property OnDblClick;
    property OnDragDrop;
    property OnDragOver;
    property OnEditButtonClick;
    property OnEndDock;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnKeyup;
    property OnKeyPress;
    property OnKeyDown;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnStartDock;
    property OnStartDrag;
    property OnTitleClick;
end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Data Controls', [TDBGridPro]);
end;

{ TDBGridPro }
procedure TDBGridPro.AddBox;
var
  p,p1 : TRect;
begin
  GetWindowRect(InPlaceEditor.Handle,p);
  GetWindowRect(FPan.Handle,p1);
  if (p.Left=p1.Left) and (p.Top=p1.Top) and (p.Right=p1.Right) and (p.Bottom=p1.Bottom) then exit;
  if hr<>0 then DeleteObject(hr);
  if hc1<>0 then DeleteObject(hc1);
 {创建内外两个Region}
  hr := CreateRectRgn(0,0,p.Right-p.Left+4,p.Bottom-p.Top+4);
  hc1:= CreateRectRgn(2,2,p.Right-p.Left+2,p.Bottom-p.Top+2);
  {组合成空心Region}
  CombineRgn(hr,hc1,hr,RGN_XOR);
  SetWindowRgn(FPan.Handle,hr,true);
  FPan.Parent := InPlaceEditor.Parent;
  FPan.ParentWindow := InPlaceEditor.ParentWindow;
  FPan.Height := InPlaceEditor.Height+4;
  FPan.Left := InPlaceEditor.Left-2;
  FPan.Top :=InPlaceEditor.Top-2;
  FPan.Width := InPlaceEditor.Width+4;
  FPan.BringToFront;
end;

constructor TDBGridPro.Create(AOwner: TComponent);
begin
  inherited;
  {创建作为边框的Panel}
  FPan := TPanel.Create(nil);
  FPan.Parent := Self;
  FPan.Height := 0;
  FPan.Color := 0;
  FPan.Ctl3D := false;
  FPan.BevelInner := bvNone;
  FPan.BevelOuter := bvNone;
  FPan.Visible := true;
  DefaultDrawing := false;
  OnDrawColumnCell := DoOwnDrawColumnCell;
  OnOwnDrawColumnCell := nil;
  curCell.X := -1;
  curCell.Y := -1;
  curCell.tag := 0;
  hr := 0;
  hc1 := 0;
end;

function TDBGridPro.CreateEditor: TInplaceEdit;
begin
  result := inherited CreateEditor;
  hInPlaceEditorWndProc := result.WindowProc;
  result.WindowProc := InPlaceEditorWndProcHook;
end;

procedure TDBGridPro.DefaultDrawColumnCell(const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  {如果要画焦点,就让DBGrid进入编辑状态}
  if (gdFocused in State) then
  begin
    EditorMode := true;
    AddBox;
    {如果是进入一个新的Cell,全选其中的字符}
    if (curCell.X <> DataCol) or (curCell.Y <> DataSource.DataSet.RecNo)
    then begin
      curCell.X := DataCol;
      curCell.Y := DataSource.DataSet.RecNo;
      curCell.tag := 0;
      GetWindowRect(InPlaceEditor.Handle,curCell.r);
      SendMessage(InPlaceEditor.Handle,EM_SETSEL,0,1000);
    end;
    end else {正常显示状态的Cell}
  TCustomDBGrid(Self).DefaultDrawColumnCell(Rect,DataCol,Column,State);
  end;

destructor TDBGridPro.Destroy;
begin
  FPan.Free;
  inherited;
end;

procedure TDBGridPro.DoKeyUped(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  cl : TColumn;
begin
  cl := Columns[SelectedIndex];
  case Key of
    VK_RETURN:
    begin
    {一个Column为下拉类型,如果:
      1 该Column的按钮类型为自动类型
      2 该Column的PickList非空,或者其对应的字段是lookup类型}
    if (cl.ButtonStyle=cbsAuto) and ((cl.PickList.Count>0) or (cl.Field.FieldKind=fkLookup)) and (curCell.tag = 0) and not (ssShift in Shift) then
    begin
    {把回车转换成Alt+向下弹出下拉列表}
      Key := 0;
      Shift := [ ];
      keybd_event(VK_MENU,0,0,0);
      keybd_event(VK_DOWN,0,0,0);
      keybd_event(VK_DOWN,0,KEYEVENTF_KEYUP,0);
      keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,0);
      curCell.tag := 1;
      exit;
    end;
    {否则转换成Tab}
    Key := 0;
    keybd_event(VK_TAB,0,0,0);
    keybd_event(VK_TAB,0,KEYEVENTF_KEYUP,0);
  end;
  VK_RIGHT :
  begin
  {获得编辑框中的文字长度}
  i := GetWindowTextLength(InPlaceEditor.Handle);
  {获得编辑框中的光标位置}
  GetCaretPos(p);
  p.x := p.X + p.Y shr 16;
  j := SendMessage(InPlaceEditor.Handle,EM_CHARFROMPOS,0,p.X);
  if (i=j) then {行末位置}
    begin
      Key := 0;
      keybd_event(VK_TAB,0,0,0);
      keybd_event(VK_TAB,0,KEYEVENTF_KEYUP,0);
    end;
  end;
  VK_LEFT:
  begin
    GetCaretPos(p);
    p.x := p.X + p.Y shr 16;
    if SendMessage(InPlaceEditor.Handle,EM_CHARFROMPOS,0,p.X)=0 then
    begin {行首位置}
      Key := 0;
      keybd_event(VK_SHIFT,0,0,0);
      keybd_event(VK_TAB,0,0,0);
      keybd_event(VK_TAB,0,KEYEVENTF_KEYUP,0);
      keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
    end;
  end;
  else begin {记录用户是否作了修改}
    if (Columns[SelectedIndex].PickList.Count>0) and (curCell.tag = 0) then
      if SendMessage(InPlaceEditor.Handle,EM_GETMODIFY,0,0)=1 then
        curCell.tag := 1;
    end;
  end;
end;

procedure TDBGridPro.DoOwnDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if FOwnDraw=false then DefaultDrawColumnCell(Rect,DataCol,Column,State);
  if @OnOwnDrawColumnCell<>nil then OnOwnDrawColumnCell(Sender,Rect,DataCol, Column,State);
end;

procedure TDBGridPro.InPlaceEditorWndProcHook(var msg: TMessage);
var m : integer;
begin
  m := msg.Msg;
  {=inherited}
  hInplaceEditorWndProc(msg);
  {如果是改变位置和大小,重新加框}
  if m=WM_WINDOWPOSCHANGED then AddBox;
end;

procedure TDBGridPro.KeyUp(var Key: Word; Shift: TShiftState);
begin
  inherited;
  DoKeyUped(Self,Key,Shift);
end;

end.

{以上代码在Windows2000,Delphi6上测试通过}

posted @ 2005-03-04 17:03 Eagletian 阅读(348) | 评论 (0)编辑