<![CDATA[平凡的世界--人生就象旅游,不要带太多行李。]]> http://booktian.blog.esnai.com/index.html <![CDATA[宁可做错,不可不做!(ZT)]]> http://booktian.blog.esnai.com/archives/2008/92108.html 现实中,我们却经常陷入“宁可不做,千万别错”的退缩中。

IT老英雄王安在他的回忆录《教训》中写道,他6岁的时候,在路上捡到一只活的小麻雀,欢天喜地拿着往家赶。

到了家门口,想起母亲不喜欢这类小东西进房间,于是就将小麻雀放在家门口,进屋去请示。妈妈竟然破例同意了!王安急着去拿他的宝贝。不幸啊!他看见小麻雀已经在猫的嘴里了。

王安小小年纪受到如此重大打击,促使他6岁时就立下志向:任何事做了再说,千万不要先请示汇报。

现实是,一个人做得越多,犯错的次数就越多,挨骂的次数也就越多。并且由于事物的多面性,可能你认为正确的,他人以为是谬误。世界上没有绝对正确的东西,阳光的背面是黑暗,管理中任何事情都可以引发正方与反方之争。多做多错,理之必然。曾国藩曾云:“名满天下,谤亦随之。”不做不错,因为错的对象都不存在了。

管理讲究责权利的相符。当一个人主动或被动地去承担一件责任的时候,他心中总是在掂量:权够不够,利够不够(当然还有能力够不够。此文中我们假定能力都够,只讨论人的能动性问题)。当他认为权或(和)利不够的时候,他就会有多种表现形式:

1.遇到问题,不收集材料也不提自己的见解与方法,只将问题提出请领导拍板。

2.为什么又是我?!

3.这件事应该由相关部门解决。

4.最不可救药的是,既不说这件事可行,也不说这件事不可行,好像这件事不存在,无休止地把一件事拖下去。

我们还可以见到另一种麻木的情况:明明是该人的本职工作,由于长期在一种他认为失望的氛围中工作(也可能是一种客观存在),生成了一种习惯性懒惰,不求有功,但求无过,有事能拖则拖,多一事不如少一事。其表现形式与上述第4条相同,但更糟糕的是,他已将之上升为无意识的习惯,还自认为老成。

毛泽东主席在《矛盾论》中一再强调人的主观能动性:“人是要有一点精神的。”

现代的说法是,人要有积极的心态。希望一个人做事,当然要赋予这个人足够的权与利。但我今天是要讲矛盾的另一个方面:当事人怎样来理解责、权、利的问题。

美国总统小布什的就职演讲有这样两段话:

“正处于鼎盛时期的美国重视并期待每个人担负起自己的责任。鼓励人们勇于承担责任不是让人们充当替罪羊,而是对人的良知的呼唤。虽然承担责任意味着牺牲个人利益,但是你能从中体会到一种更加深刻的成就感。

在生活中,有时我们被召唤着去做一些惊天动地的事。但是,正如我们时代的一位圣人所言,每一天我们都被召唤带着挚爱去做一些小事情。一个民主制度最重要的任务是由大家每一个人来完成的。”

一个企业何尝不是如此。只有每个人恪尽职守,担负起自己应当承担的责任,卡住每一个细节,这个企业才是有生命力的。

在人生的长河中,你不愿主动地去承担责任,看上去你没有损失什么,但实际上你在原地踏步,你的精神天天在萎缩;你天天听到别人的成功与失败,就是与你无关。当你勇敢地面对生活与工作中的每一个难题,不回避,你失去的是狭隘的小我;当你跨过这些问题,你会感觉到自己的成长,还会感觉到天地的宽广,人生的意义。

]]>
booktian 2008-8-4 13:45:00
<![CDATA[史记.马加爵传(ZT)]]> http://booktian.blog.esnai.com/archives/2008/87990.html 马君加爵者,桂之宾阳人也。年及弱冠,形貌古异,环眼蒜鼻,发尽上指。为人罕言语,工技击,多膂力。年二十,入滇之官学。
  
甲申岁仲春,聚邻舍四生赌,局未覆,马君彩之者三,邵生窘,疑其出千,乃出恶语逅之,其余三生皆群起而谩之。马君虽不言,实阴衔恨之。暮,货大铁椎二,袖而归。既同寝,伺邵生眠,奋而椎之,颅裂。明日,诱杨生以赌,亦毙之。如是者更击杀二生。既杀四生,悔,乃以布封其尸数匝,函而藏之柜中,重锁而遁。数日,同舍某生语于舍吏:“吾室若鲍鱼之肆,其臭不绝,何也?”吏以为腐鼠,患之乃所锁发柜,卒见尸,股栗欲堕,旋白衙吏。吏不敢隐,急闻刑部。刑部重之,乃案马君行容而为图,悬巨万之赏,大搜于四海之内。天下遂震动,小儿闻马君之名,不敢夜啼。然竭刑吏之余智,竟失其所往。天下益惧之,或云其藏金陵,或云其窜藏边,莫衷一是。
  
越旬日,琼之氓游于道,窥见一丐,颇似榜图。乃试与之语,丐色变,佯疯而走。氓乃蹑其踪,急禀琼衙。琼之吏空衙而出,遍而捕之,乃夜获丐于市中。问之,乃曰:“某是也。”吏喜可知也。马君从容笑曰:“天下汹汹半月者,以某之故也。今自度必死,天下人可安枕席矣。且吾以弱冠致名天下,死固其宜也。”遂就擒。
  
初,马君游于野寺。卦师见而异之,趋曰:“君鹤准而狮鼻,鹰视而狼顾,此武威之相也,君当以勇力而闻,且身致千金。”马君哂之,曰:“诚如尊言,取富贵如探囊耳,当与君共之!”径笑而去。卦师顾其去,良久乃曰:“骨相虽奇,命数实奇。惜哉,必不寿。”
  
赞曰:鼓博浪之勇,秦皇变色;奋夺军之威,朱亥无光。一朝逞技而天下汹汹者,马君之谓也。然其匿不能深,遁不能远。匹夫衔迹而颈系组,身辱刑吏之手者,是其智不能兼勇力也。

 

]]>
booktian 2008-5-21 17:18:00
<![CDATA[FormContainer简易手册]]> http://booktian.blog.esnai.com/archives/2008/87253.html
将一个子窗体插入另一个窗体,想过没?可能没想过.现在有了FormContainer,呵呵,梦想成真了.

开始的第一步,当然得拖一个FormContainer到被插入的窗体,即父窗体.

Formcontainer在哪?,别问我.这个东东与Panel类似,放完之后再放入其他的控件,操作也与panel差不多.

下一步,准备要插入的子窗体,在设计期,子窗体要满足一些条件:

1.BorderStyle=bsNone
2.FormStyle=fsNormal
3.WindowState=wsNormal
4.Visible=False

运行时对于使用的窗体也有一些限制:

1.不要用窗体的Show,Hide方法或Visible属性改变其可见性(visibility)

2.不能调用ShowModal,close,Destroy,Free或Release

3.不能改变Borderstyle,FormStyle与WindowState

4.OnActivate与OnDeactivate事件用标准控件的OnEnter与OnExit代替

5.OnClose事件不会被触发

6.OnClosequery只能被CloseQuery或ClosequeryAll触发

7.OnShow与OnHide只在直接或间接调用ShowForm或ShowFormEx并窗体显示或隐藏时触发

为了建立一个窗体,必须用formContainer的CreateForm方法.通过这种方法建立的窗体将作为FormContainer的子窗体,并将随其的消毁而消毁.例如:

MyForm:=TMyForm(MYFormcontainer.CreateForm(TMyForm)));

上面这行代码建立一个MyForm,类为TMyForm,它是MyFormcontainer的一个子窗体.

窗体虽然建立但依然是不可见的,为了显示它,还要通过两种方法:ShowForm与ShowFormEx.

MyFormContainer.Showform(Myform,False);

MyFormcontainer.ShowFormEx(MyForm,False,nil,nil,fcfaDefault);

到这我们显示了MyForm窗体,如果有以前显示的窗体,他将被隐藏,但并没有被删除.(如果要删除,随时调用DestroyForm方法并将第二个参数设为True.)

由于没用使用转换(Transition),所以不能改变BackGroundOptions.并且显示的窗体将依照设计时的设置时行排列.

所有联系到FormContainer可通过Forms属性来访问,Form返回显示的窗体.

如前所述,当FormContainer被destroy,所有与其联接的窗体也被destroy.

FormContainer自动维护一个LRU(Last Recently Used)窗体列表.可通过设置

LRUFormCapacity改变列表元素的最大值.要返回以前用过的窗体,可用:

ShowLRUForm,ShowLRUFormEx,ShowNextLRUForm,ShowNextLRUFormEx,ShowPriorLRUForm或ShowPriorLRUFormEx.

除非设置了SaveLRUDestroyedForms为True,否则Destroyed的窗体不被包含在列表中,当以前消毁的窗体需自动重新建立,FormContainer有一种机制,允许适当的初始化窗体.例如:假设你有一个窗体包含了edit控件并且你用以前用户输入的文本初始化它,则可继承TFCExtraData类和他的三个published方法.

published

function FCGetExtraDataClass: TFCExtraDataClass;

procedure FCGetExtraData(ExtraData: TFCExtraData);

procedure FCSetExtraData(ExtraData: TFCExtraData);

TMyExtraData = class(TFCExtraData)

public

MyEditText: String;

end;

function TMyForm.FCGetExtraDataClass: TFCExtraDataClass;

begin

Result := TMyExtraData;

end;

procedure TMyForm.FCGetExtraData(ExtraData: TFCExtraData);

begin

MyEdit.Text := (ExtraData as TMyExtraData).MyEdit.Text;

end;

procedure TFormLRUSample.FCSetExtraData(ExtraData: TFCExtraData);

begin

(ExtraData as TMyExtraData).MyEditText := MyEdit.Text;

end;

可以在演示程序的LRU.PAS单元中看到这样的例子.

如果一个子窗体有TMainMenu并设置其AutoMerge为True,当其显示时menu将与主窗体的menu(Application’s main menu)容和.

可以用图片作为FormContainer的显示背景,用不能的效果.(例子中用tiled效果),窗体的alignment可通过ShowFormEx的最后参数来控制.(如:强制窗体在FormContainer中居中,则可调用fcfaCenter).

每次可见窗体被切换时,OnFormChange事件将被触发.

隐藏当前显示的窗体也不显示其他的窗体,象下面这样调用:

MyformContainer.ShowForm(nil,False);

当显示或隐藏窗体时用转换(transition),在调用ShowFormEx时传进一个Transition参数:

var

Transition: TFuseTransition;

begin

Transition := TFuseTransition.Create;

try

Transition.Milliseconds := 500;

MyFormContainer.ShowFormEx(MyForm, False, Transition, nil, fcfaDefault);

finally

Transition.Free;

end;

end;


Delphi:用FormContainer渐变效果 
 

为什么要写这篇短文,目的之一感谢所有帮助过我的人,之二为了让用delphi的朋友们节约点时间来看其Demo.之三是感谢那些为大家无私奉献的朋友,如DelphiVCL,saycc.keeping.coder….太多了.之四是Formcontainer作者做一下宣传,感谢他这么精彩之作,如果大家用好这个东东,一定要想办法购个正式版来用.之五,把LP给忘了:)

先看看什么是渐变效果,作者在其文档中是这样定义的:一个渐变是运行窗体从开始显示的图形到最后完成显示过程的图形效果.实际上,按我的理解,就是指一个控件在显示过程中所细化的显示过程.这里的控件,指从Tcontrols继承来的所有组件.

在Formcontainer机制中,渐变效果已经被作者抽象成一个基类TTransitionEffect,其他所有要实现的渐变效果都要从这个类继承,并处在其类的层次结构中,而非组件.为了使用一个渐变效果,我们不得不建立,配置,执行最后释放掉这个效果.

对于不同的控件所使用的渐变效果的处理过程是不同的.具体可分为以下三种情况:

一.控制标准窗体的渐变效果.

主要可分为三步:

1.拖一个TFormTransitions组件到一个窗体上;

2.然后通过窗体的Create事件,通过TFormTransitions设置窗体的显示效果;具体作法是建立一个渐变效果类实例,附值给TFormTransitions.ShowTransition.

3.利用窗体的Show或ShowModal,窗体显示时就以设置的显示效果来显示了.

下面是我从其Demo中剪出的示例代码:

procedure TMainForm.FormCreate(Sender: Tobject);

var

lTWipeTransition:TWipeTransition;

begin

lTWipeTransition:=TWipeTransition.Create;

FormTransitions.ShowTransition := lTWipeTransition;

with lTWipeTransition do

begin

Milliseconds := 3000;

BandWidth := 100;

Direction := tedDown;

end;

end;

上面的代码中,FormTransitions 是我们手工拖到要改变窗体显示效果上去的TFormTransitions组件.TWipeTransition是作者直接在FormContainer VCL中完成的渐变效果类,代码中用这个类实例lTWipeTransition 来处理窗体的显示效果.通过上面的代码,也不难想到,要使用不同的渐变效果来显示窗体,只要改变FormTransitions.ShowTransition的值就能达到. 二.插入到父窗体中的子窗体的渐变效果

按前文,为了将一个窗体插入一个父窗体,我们要用到Tformcontainer,并用其来建立被插入窗体.下面是具体的代码:

FormIntro := TFormIntro(FormContainerNavigator.CreateForm(TFormIntro));

同样,为了显示被插入的子窗体,我们不能调用子窗体的Show或ShowModal,而不得不用TFormContainer的ShowForm或ShowFormEx方法.实际上,如果要改变子窗体的显示效果,就只能用ShowFormEx显示子窗体.下面这行代码演示如何利用TransEffct效果实例显示子窗体FormIntro:

FormContainerNavigator.ShowFormEx(FormIntro, True, TransEffct, nil, Align);

到此,我们看一下完整的代码,来理解如何控制子窗体的渐变效果:

procedure TFormNavigator.Intro;

var

TransEffct: TTransitionEffect;

begin

TransEffct := TWipeTransition.Create;

TransEffct.FlickerFreeWhenDisabled := True;

TransEffct.Milliseconds := 500;

(TransEffct as TWipeTransition).BandWidth := 50;

try

FormIntro := TFormIntro(FormContainerNavigator.CreateForm(TFormIntro));

FormContainerNavigator.ShowFormEx(FormIntro, True, TransEffct,nil,Align);

finally

TransEffct.Free;

end;

end;

通过上面的代码,很容易就能看原来子窗体的显示效果是通过Formcontainer的ShowFormEX方法的第三个参数来完成.

三.控件的渐变效果

下面的代码演示如何控件一个Tmemo的显示效果:

procedure TFormIntro.ShowText;

var

TextTransition: TWipeTransition;

begin

TextTransition := TWipeTransition.Create;

try

TextTransition.Milliseconds := 2000;

TextTransition.Direction := tedDown;

TextTransition.BandWidth := 100;

TextTransition.Prepare(MemoText.Parent, MemoText.BoundsRect);

MemoText.Visible := True;

if TextTransition.Prepared then

TextTransition.Execute;

finally

TextTransition.Free;

end;

end;

从代码中可以看到,首先要为控制显示的Tmemo控件设置为不可见.一般的情况在设计期设置Visible=False.然后建立一个效果类,利用效果类对Tmemo进行Prepare,再设置Tmemo为可见,最后让效果执行.即执行效果类的Execute方法.别忘了释放声明的效果类.

到此,也无法完整说明FC-Demo,这里,只是一个总结,如果想进一步了解FC的使用,还得参考其帮助文档及Demo.当然,你会得到意外的收获.

]]>
booktian 2008-5-12 15:50:00
<![CDATA[Mysql 增加用户权限]]> http://booktian.blog.esnai.com/archives/2008/87211.html @192.1.1.* identified by 'PASS';
]]>
booktian 2008-5-12 10:55:00
<![CDATA[2008经典语录]]> http://booktian.blog.esnai.com/archives/2008/86170.html 老鼠一发威,大家都是病猫。

和一MM争论鲸鱼是不是鱼,最后我说“曰本人也带个人字”,她这才同意鲸鱼不是鱼。

男人膝下有黄金,我把整个腿都切下来了,连块铜也没找着!

春天我把玉米埋在土里,到了秋天我就会收获很多玉米。春天我把老婆埋在土里,到了秋天我就会…被枪毙!

如果你看到面前的阴影,别怕,那是因为你的背后有阳光!

踏遍青楼人未老,请用汇仁肾宝。

听君一席话,省我十本书!

0岁出场亮相,10岁天天向上。20岁远大理想,30岁发奋图强。40岁基本定向,50岁处处吃香。60岁打打麻将,70岁处处闲逛。80岁拉拉家常,90岁挂在墙上!

脱了衣服我是禽兽,穿上衣服我是衣冠禽兽!

师太,你就从了老衲吧!…很久很久以后…师太,你就饶了老衲吧!

“亲爱的,我…我怀孕了…三个月了,不过你放心,不是你的,不用你负责……”

我们产生一点小分歧:她希望我把粪土变黄金,我希望她视黄金如粪土。

读10年语文,不如聊半年QQ。

早晨懒床,遂从口袋里掏出6枚硬币:如果抛出去六个都是正面,我就去上课!思躇良久,还是算了,别冒这个险了……

我花8万买了个西周陶罐,昨儿到《鉴宝》栏目进行鉴定,专家严肃地说:“这哪是西周的?这是上周的!”

我能容忍身材是假的,脸是假的,胸是假的,臀是假的!!!但就是不容忍钱是假的!!!!

士为知己者装死,女为悦己者整容。

长大了要嫁给唐僧,能玩就玩,不能玩就把他吃掉。

一山不能容二虎,除非一公和一母。

千万别等到人人都说你丑时才发现自己真的丑。

如果朋友可以出卖,每个值五块的话,我也能发笔小财了。

征婚启事:要求如下,A活的,B女的。

给点阳光我就腐烂。

要适当吃一点,才有劲减肥啊。

摇啊摇,摇到奈何桥。

命运负责洗牌,但是玩牌的是我们自己!

问:你喜欢我哪一点?答:我喜欢你离我远一点!

你快回来,我一人忽悠不来!

生活就像宋祖德的嘴,你永远都不知道下一个倒霉的会是谁

跌倒了,爬起来再哭

世界上难以自拔的,除了牙齿,还有爱情。

一恐龙路过西安交大时上了趟厕所,出来后她呜咽道:“555,这辈子终于不愁嫁不出去了……”

生,容易。活,容易。生活,不容易。

吾表兄,年四十余。始从文,连考三年而不中。遂习武,练武场上发一矢,中鼓吏,逐之出。改学医,自撰一良方,服之,卒。

问君能有几多愁,恰似一群太监上青楼……

吾生也有涯,而吃也无涯~~~

想污染一个地方有两种方法:垃圾,或是钞票!

年轻的时候,我们常常冲着镜子做鬼脸;年老的时候,镜子算是扯平了。

你瞎了眼啊?这么大的盾牌你看不见,偏偏要把石头朝我脑袋上扔!

出问题先从自己身上找原因,别一便秘就怪地球没引力。

拍脑袋决策,拍胸脯保证,拍屁股走人。

我们走得太快,灵魂都跟不上了

不要和地球人一般见识

女孩从处女到女人只要一次并成功,男孩从处男变男人需要反复的磨练!

出来混,老婆迟早是要换的!

小时候我以为自己长大后可以拯救整个世界,等长大后才发现整个世界都拯救不了我……

有钱的都是大爷!但是欠钱不还的更是!

我就算是一只癞蛤蟆,我也决不娶母癞蛤蟆。

生前何必久睡,死后自会长眠

不想当厨子的裁缝,不是好司机。

时间是最好的老师,但遗憾的是——最后他把所有的学生都弄死了。

去西安出差的路上,一位大连老兄一阵狂吹大连多好多好,然后说大连建市一百周年的时候举行了很隆重的庆祝活动云云,然后问了旁边一人:“西安建市一百周年有什么庆祝活动没有?”旁边几位西安的哥们一愣,过了一会儿,逼出一句话来:“我记得西安建市600年的时候搞了一个‘烽火戏诸侯’吧”

钻石恒久远,一颗就破产!

和谐校园里,骑自行车的也许是位博导,而开奔驰的则可能是个后勤

我女友不当尼姑的原因是她四级没过,庵里不收。

明星脱一点就能更出名,我脱的光光的却被抓起来了!

看一漂亮MM,苦无搭讪办法,路旁一砖头,拣起,上前,“同学,这是你掉的吧?”

小时候的梦想并不是要当什么科学家,幻想自己是地主家的少爷,家有良田千顷,终日不学无术,没事领着一群狗奴才上街去调戏一下良家少女

玫瑰你的,巧克力你的,钻石你的。你,我的!

所谓惊喜就是你苦苦等候的兔子来了,后面跟着狼!

什么是幸褔?幸福就是猫吃鱼狗吃肉,奥特曼打小怪兽!

俩农夫吹牛:“俺们农场的鸡,吃的都是茶叶,下的全是茶叶蛋”“有嘛啊,咱农场给鸡吃钱包,让它下荷包蛋。”

蟑螂都不怕蟑螂药了,我们却连维生素都搞不定!

长个包子样就别怨狗跟着!

男人偷腥时的智商仅次于爱因斯坦!

为中华而努力读书!一包中华好多钱啊……

如果你不能给你的女人穿上嫁衣,那么千万别停下你解开她衣扣的手!

别以为穿着脏衣服就可以做污点证人;别以为穿着木制拖鞋就可以做木屐证人。

凤凰重生就是涅盘,野鸡重生就是尸变。

老子不但有车,还是自行的。

女人拥有无数个QQ号只为了调戏一个男人,男人常用一个QQ号上面加满各种各样的女人。

偶然看见书上所谓的当代女子择偶标准:“有车有房,父母双亡。”郁闷。遂写下幻想中的选妻标准:“家中财产过亿,美貌天下第一,贤惠温柔性感,岳父癌症晚期”。

大部分人一辈子只做三件事:自欺、欺人、被人欺。

睡眠是一门艺术——谁也无法阻挡我追求艺术的脚步!

为了避免家庭暴力,于是我决定不结婚!

你可以像猪一样的生活,但你永远都不能像猪那样快乐!

迅雷不及掩耳盗铃,以不变应万变不离其宗,成事不足挂齿,此物最相思风雨中,一屋不扫何以扫天下无敌,东边日出西边雨一直下,举头望明月几时有,呆若木鸡毛当令箭,杀鸡焉用牛刀小试,锋芒毕露春光,围魏救赵宝奎,Very good bye,八格牙鲁冰花,一泻千里共婵娟。

某女的一篇博客日记:某月某日,大醉而归,伸手一摸——手机和贞操都在,睡觉!

如果幸福是浮云,如果痛苦似星辰。那我的生活真是万里无云,漫天繁星。

避孕的效果:不成功,便成“人”。

人生的悲惨在于:辛辛苦苦的作了一晚上内容香艳的美梦,第二天早上醒来居然全都记不起来了!

父亲问我人生有什么追求?我回答金钱和美女,父亲凶狠的打了我的脸;我回答事业与爱情,父亲赞赏的摸了我的头。

男人都好色,色心稍强一点叫色狼,再强一点叫色鬼,更加强就叫色魔,尤其强那就成了变态色魔,好色到了极致,被称作人体美学艺术家。

记得刚毕业不久的一天,女友给我发了一条短信:“我们还是分手吧!”我还没来得及伤心呢,女友又发来一条:“对不起,发错了。”这下可以彻底伤心了。

此地禁止大小便,违者没收工具。

在街上看美女,目光高一点就是欣赏,目光低一点就是流氓。

孩儿他娘,咱这辈子还有很多事要做呢,别耽误功夫和我玩捉迷藏了,赶紧蹦出来吧

女人一生喜欢两朵花:一是有钱花,二是尽量花!

一炮走红——是形容女艺人的。

这个世界不公平就在于:上帝说:“我要光!”于是有了白天。美女说:“我要钻戒!”于是她有了钻戒。富豪说:“我要女人!”于是他有了女人。我说:“我要洗澡!”居然停水了!

真不明白,女孩买很多很多漂亮衣服穿,就是为了吸引男孩的目光,但男孩想看的,却是不穿衣服的女孩。

偶尔幽生活一默你会觉得很爽,但生活幽你一默就惨了。

]]>
booktian 2008-4-28 10:20:00
<![CDATA[Format函数帮助 (For Delphi)]]> http://booktian.blog.esnai.com/archives/2008/86033.html Format是一个很常用,却又似乎很烦的方法,本人试图对这个方法的帮助进行一些翻译,让它有一个完整的概貌,以供大家查询之用:

首先看它的声明:
function Format(const Format: string; const Args: array of const): string; overload;

事实上Format方法有两个种形式,另外一种是三个参数的,主要区别在于它是线程安全的,
但并不多用,所以这里只对第一个介绍:
function Format(const Format: string; const Args: array of const): string; overload;
 
Format参数是一个格式字符串,用于格式化Args里面的值的。Args又是什么呢,
它是一个变体数组,即它里面可以有多个参数,而且每个参数可以不同。
如以下例子:

Format('my name is %6s',['wind']);
返回后就是my name is wind

现在来看Format参数的详细情况:
Format里面可以写普通的字符串,比如'my name is',但有些格式指令字符具有特殊意义,比如"%6s"格式指令具有以下的形式:
"%" [index ":"] ["-"] [width] ["." prec] type
它是以"%"开始,而以type结束,type表示一个具体的类型。中间是用来
格式化type类型的指令字符,是可选的。

先来看看type,type可以是以下字符:
d 十制数,表示一个整型值
u 和d一样是整型值,但它是无符号的,而如果它对应的值是负的,则返回时是一个2的32次方减去这个绝对值的数,如:
Format('this is %u',[-2]);
返回的是:this is 4294967294

f 对应浮点数
e 科学表示法,对应整型数和浮点数,比如
Format('this is %e',[-2.22]);
返回的是:this is -2.22000000000000E+000,等一下再说明如果将数的精度缩小

g 这个只能对应浮点型,且它会将值中多余的数去掉,比如
Format('this is %g',[02.200]);
返回的是:this is 2.2

n 只能对应浮点型,将值转化为号码的形式。看一个例子就明白了
Format('this is %n',[4552.2176]);
返回的是this is 4,552.22

  注意有两点,一是只表示到小数后两位,等一下说怎么消除这种情况, 二是,即使小数没有被截断,它也不会也像整数部分一样有逗号来分开的

m钱币类型,但关于货币类型有更好的格式化方法,这里只是简单的格式化,另外它只对应于浮点值
Format('this is %m',[9552.21]);
返回:this is ¥9,552.21

p 对应于指针类型,返回的值是指针的地址,以十六进制的形式来表示
  例如:
var X:integer;
p:^integer;
begin
  X:=99;
  p:=@X;
  Edit1.Text:=Format('this is %p',[p]);
end;
Edit1的内容是:this is 0012F548

s 对应字符串类型,不用多说了吧
x 必须是一个整形值,以十六进制的形式返回
Edit1.Text:=Format('this is %X',[15]);
返回是:this is F

类型讲述完毕,下面介绍格式化Type的指令:
[index ":"]这个要怎么表达呢,看一个例子
Format('this is %d %d',[12,13]);
其中第一个%d的索引是0,第二个%d是1,所以字符显示的时候是这样 this is 12 13

而如果你这样定义:
Format('this is %1:d %0:d',[12,13]);
那么返回的字符串就变成了this is 13 12。现在明白了吗,[index ":"] 中的index指示Args中参数显示的顺序还有一种情况,如果这样
Format('%d %d %d %0:d %d', [1, 2, 3, 4])
将返回1 2 3 1 2。

如果你想返回的是1 2 3 1 4,必须这样定:
Format('%d %d %d %0:d %3:d', [1, 2, 3, 4])

但用的时候要注意,索引不能超出Args中的个数,不然会引起异常如
Format('this is %2:d %0:d',[12,13]);
由于Args中只有12 13 两个数,所以Index只能是0或1,这里为2就错了[width] 指定将被格式化的值占的宽度,看一个例子就明白了

Format('this is %4d',[12]);
输出是:this is   12,这个是比较容易,不过如果Width的值小于参数的长度,则没有效果。
如:

Format('this is %1d',[12]);
输出是:this is 12

["-"]这个指定参数向左齐,和[width]合在一起最可以看到效果:
Format('this is %-4d,yes',[12]);
输出是:this is 12   ,yes

["." prec] 指定精度,对于浮点数效果最佳:
Format('this is %.2f',['1.1234]);
输出 this is 1.12
Format('this is %.7f',['1.1234]);
输出了 this is 1.1234000

而对于整型数,如果prec比如整型的位数小,则没有效果反之比整形值的位数大,则会在整型值的前面以0补之
Format('this is %.7d',[1234]);
输出是:this is 0001234]
         
对于字符型,刚好和整型值相反,如果prec比字符串型的长度大则没有效果,反之比字符串型的长度小,则会截断尾部的字符
Format('this is %.2s',['1234']);
输出是 this is 12,而上面说的这个例子:

Format('this is %e',[-2.22]);
返回的是:this is -2.22000000000000E+000,怎么去掉多余的0呢,这个就行啦

Format('this is %.2e',[-2.22]);
    
好了,第一个总算讲完了,应该对他的应用很熟悉了吧

///////////////////////////////////////////////////////////////
二 FormatDateTime的用法
他的声明为:

function FormatDateTime(const Format: string; DateTime: TDateTime): string;
overload;

当然和Format一样还有一种,但这里只介绍常用的第一种,Format参数是一个格式化字符串。DateTime是时间类型。返回值是一种格式化后的字符串,重点来看Format参数中的指令字符

c 以短时间格式显示时间,即全部是数字的表示
FormatdateTime('c',now);
输出为:2004-8-7 9:55:40

d 对应于时间中的日期,日期是一位则显示一位,两位则显示两位
FormatdateTime('d',now);
输出可能为1~31

dd 和d的意义一样,但它始终是以两位来显示的
FormatdateTime('dd',now);
输出可能为01~31

ddd 显示的是星期几
FormatdateTime('ddd',now);
输出为: 星期六

dddd 和ddd显示的是一样的。 但上面两个如果在其他国家可能不一样。ddddd 以短时间格式显示年月日
FormatdateTime('ddddd',now);
输出为:2004-8-7

dddddd 以长时间格式显示年月日
FormatdateTime('dddddd',now);
输出为:2004年8月7日

e/ee/eee/eeee 以相应的位数显示年
FormatdateTime('ee',now);
输出为:04  (表示04年)

m/mm/mmm/mmmm 表示月
FormatdateTime('m',now);
输出为:8
FormatdateTime('mm',now);
输出为  08
FormatdateTime('mmm',now);
输出为  八月
FormatdateTime('mmmm',now);
输出为  八月

 和ddd/dddd 一样,在其他国家可能不同yy/yyyy 表示年
FormatdateTime('yy',now);
输出为 04
FormatdateTime('yyyy',now);
输出为 2004,

h/hh,n/nn,s/ss,z/zzz 分别表示小时,分,秒,毫秒

t  以短时间格式显示时间
FormatdateTime('t',now);
输出为 10:17

tt 以长时间格式显示时间
FormatdateTime('tt',now);
输出为10:18:46

ampm 以长时间格式显示上午还是下午
FormatdateTime('ttampm',now);
输出为:10:22:57上午

大概如此,如果要在Format中加普通的字符串,可以用双引号隔开那些特定义的字符,这样普通字符串中如果含特殊的字符就不会被显示为时间格式啦:
FormatdateTime('"today is" c',now);
 输出为:today is 2004-8-7 10:26:58

时间中也可以加"-"或"\"来分开日期:
FormatdateTime('"today is" yy-mm-dd',now);
FormatdateTime('"today is" yy\mm\dd',now);
输出为: today is 04-08-07

也可以用":"来分开时间 
FormatdateTime('"today is" hh:nn:ss',now);
输出为:today is 10:32:23

/////////////////////////////////////////////////////////////////
三.FormatFloat的用法

常用的声明:
function FormatFloat(const Format: string; Value: Extended): string; overload;

和上面一样Format参数为格式化指令字符,Value为Extended类型为什么是这个类型,因为它是所有浮点值中表示范围最大的,如果传入该方法的参数比如Double或者其他,则可以保存不会超出范围。

关键是看Format参数的用法
0  这个指定相应的位数的指令。
   比如:
FormatFloat('000.000',22.22);
输出的就是022.220
 
注意一点,如果整数部分的0的个数小于Value参数中整数的位数,则没有效果如:
FormatFloat('0.00',22.22);
输出的是:22.22

但如果小数部分的0小于Value中小数的倍数,则会截去相应的小数和位数如:
FormatFloat('0.0',22.22);
输出的是:22.2
  
也可以在整数0中指定逗号,这个整数位数必须大于3个,才会有逗号出句
FormatFloat('0,000.0',2222.22);
输出是:2,222.2

如果这样
FormatFloat('000,0.0',2222.22);
它的输出还是:2,222.2

注意它的规律,#和0的用法一样,目前我还没有测出有什么不同。

FormatFloat('##.##',22.22);
输出是:22.00

E  科学表示法,看几个例子大概就明白了
FormatFloat('0.00E+00',2222.22);
输出是 2.22E+03
FormatFloat('0000.00E+00',2222.22);
输出是 2222.22E+00
FormatFloat('00.0E+0',2222.22);
 22.2E+2
明白了吗,全靠E右边的0来支配的。
  
这个方法并不难,大概就是这样子了。

上面三个方法是很常用的,没有什么技巧,只要记得这些规范就行了。

总结一下Format的用法:

Format('x=%d',[12]);//'x=12'//最普通
Format('x=%3d',[12]);//'x=12'//指定宽度
Format('x=%f',[12.0]);//'x=12.00'//浮点数
Format('x=%.3f',[12.0]);//'x=12.000'//指定小数
Format('x=%8.2f'[12.0])//'x=12.00';
Format('x=%.*f',[5,12.0]);//'x=12.00000'//动态配置
Format('x=%.5d',[12]);//'x=00012'//前面补充0
Format('x=%.5x',[12]);//'x=0000C'//十六进制
Format('x=%1:d%0:d',[12,13]);//'x=1312'//使用索引
Format('x=%p',[nil]);//'x=00000000'//指针
Format('x=%1.1e',[12.0]);//'x=1.2E+001'//科学记数法
Format('x=%%',[]);//'x=%'//得到"%"
S:=Format('%s%d',[S,I]);//S:=S+StrToInt(I);//连接字符串 

]]>
booktian 2008-4-25 11:18:00
<![CDATA[Format函数说明(For Delphi)]]> http://booktian.blog.esnai.com/archives/2008/86032.html Format函数的详细中文帮助

functionFormat(constFormat:string;constArgs:arrayofconst):string;

Format字符串说明:
"%"[index":"]["-"][width]["."prec]type
(1)格式化字符串必须以%开头
(2)[index":"]索引指的是Args参数列表中要显示的每一项的序号。比如:Args是
['a','c'],那么'a'的索引就是0,而'c'的索引就是1,而且由于只有
两项,所以就不会出现大于1的索引值。
Format('%2:s%1:s%0:s',['1st','2nd','3rd']);
结果:'3rd2nd1st'
(3)["-"]这个标识符的作用是当要显示的字符的个数少于[width]时,在右边填补空格;
如果没加上["-"],则在左边填补空格。
Format('(%4s)',['aa']);结果:'aa'
(4)[width]宽度
规定了要显示的字符的个数。如果要显示的宽度大于[width],则按实际的
宽度来显示;反之,则填补空格或按要求填补其它字符。
(5)["."prec]精度
这是针对浮点数来说的,一般就是指小数点后的位数。
(6)type类型(见下面)

type的可能值有下列这些:
(1)d有符号十进制数
Args必须是有符号整型数。如果在格式化字符串中还加入了["."prec],则如果Args
的长度如果小于给出的精度数时,在前边填补0;如果大于精度数,按实际长度显示。
Format('(%.3d)',[99]);结果:'(099)'

(2)u无符号十进制数
Args必须是无符号整型数。其它特性与d一样。

(3)e科学技术法
用科学技术法显示数据,形式大致如下:'-d.ddd...E+ddd'。
Args必须是一个浮点数。如果是一个负数,则在最前面显示一个符号;在小数点前面
总是显示一位数字;包括小数点前面的数字在内,数字的个数由["."prec]来确定,
如果没有指定["."prec],则默认为15位精度。如果实际的数字长度超出了指定的
["."prec],则刚刚超出的那一位数字四舍五入。指数符号E后面总是要跟着加号或
减号,并且在后面至少跟着三位数字。

(4)f固定的
Args必须为浮点数,转换后的形式大致是'-ddd.ddd...'这样的。
如果要转换的是负值,则前面有一个负号。转换后的数字,在小数点后面的数字的个数
由["."prec]决定。如果没有指定["."prec],默认为2位精度。

(5)g一般的
Args必须为浮点数。
被转换后的数字总是尽可能的简短(有可能是f或e形式的)。有重要意义的数字的长度
由["."prec]来决定,默认为15位(包括整数位和小数位)。数字前后的0都将被去掉,
小数点也只有在必要的时候才显示出来。如果小数点左边的数字小于等于指定的精度,
并且整个值大于或等于0.00001的时候,才使用f的显示格式,否则使用e(科学技术法)

(6)nArgs必须是浮点数。形式和f是一样的,不同的是会显示千位符,如:1,123,444

(7)m货币类型
Args必须是浮点数。能够显示货币符号,可以通过“控制面板”来设置。小数点后
的位数由["."prec]决定,如果没用["."prec],则默认2位。

(8)p指针
Args必须是一个指针值。
将指针转换为8个字符的十六进制字符串。

(9)s字符串
Args必须是字符,字符串或PChar值。
如果指定了["."prec],并且字符串的实际长度大于["."prec],则从左到右截取
精度指定数量的字符串,其余的删除。

(10)x十六进制
Args必须是一个整型数。
如果使用了["."prec],不足部分要用0补齐。

注意:[index":"][width]["."prec]可以使用这样的格式:
Format('%*.*f',[8,2,123.456])
等价于:Format('%8.2f',[123.456])

]]>
booktian 2008-4-25 11:16:00
<![CDATA[键盘对应标识]]> http://booktian.blog.esnai.com/archives/2008/86031.html VK_TAB         Tab  
VK_RETURN   Enter    
VK_SHIFT     Shift  
VK_CONTROL   Ctrl  
VK_MENU         Alt  
VK_LBUTTON 01 鼠标左键  
VK_RBUTTON 02 鼠标右键  
VK_CANCEL    03 用于执行Ctrl+C或Ctrl+Break  
VK_MBUTTON 04 鼠标中键  
VK_BACK 08 Backspace键  
VK_TAB 09 Tab键  
VK_CLEAR                   0C Clear键  
VK_RETURN                   0D Enter键  
VK_SHIFT                   10 Shift键  
VK_CONTROL 11 Ctrl键  
VK_MENU 12 Arl键  
VK_PAUSE                   13 Pause键  
VK_CAPITAL 14 Capslock键  
VK_ESCAPE                   1B Ese键  
VK_SPACE                   20 SpaceBar键  
VK_PRIOR                   21 PgUp键  
VK_NEXT 22 PgDn键  
VK_END 23 End键  
VK_HOME 24 Home键  
VK_LEFT 25 Left   Arrow键  
VK_UP 26 Up   Arrow键  
VK_RIGHT                   27 Right   Arrow键  
VK_DOWN 28 Down   Arrow键  
VK_SELECT                   29 Select键  
VK_EXECUTE 2B Execute键  
VK_SNAPSHOT 2C PrintScreen键  
VK_INSERT                   2D               Ins键  
VK_DELECT                   2E Del键  
VK_HELP 2F Help键  
VK_0 30 0键  
.........
VK_9 39 9键  
VK_A 41 A键  
… … …  
VK_Z 5A Z键  
VK_NUMAPD0 60 数字板0键  
… … …  
VK_NUMAPD9 69 数字板9键  
VK_MULTIPY 6A 乘号键  
VK_ADD 6B 加号键  
VK_SEPARATOR 6C Separator键  
VK_SUBSTRACT 6D 减号键  
VK_DECIMAL 6E 小数点键  
VK_DIVIDE                   6F 除号键  
VK_F1 70 F1键  
… … …  
VK_F24 87 F24键  
VK_NUMLOCK 90 NumLock键  
VK_SCROLL                   91 ScrollLock键  
 
VK_ESCAPE         Esc  
VK_SPACE           Space  
VK_PRIOR           Page   Up  
VK_NEXT             Page   Down  
VK_END               End  
VK_HOME             Home  
VK_LEFT             向左方向键  
VK_UP  
VK_RIGHT  
VK_DOWN  
VK_DELETE         Delete  
VK_INSERT         Inser  
VK_NUMPAD0~VK_NUMPAD9           小键盘上的0-9键  
VK_F1-VK_f12                             F1-F12键]]>
booktian 2008-4-25 11:13:00
<![CDATA[家有中等生(ZT)]]> http://booktian.blog.esnai.com/archives/2008/85346.html 女儿的同学都管她叫“二十三号”。她的班里总共有五十个人,而每每考试,女儿都排名二十三。久而久之,便有了这个雅号,她也就成了名副其实的中等生。

我们觉得这外号刺耳,女儿却欣然接受。老公发愁地说,一碰到公司活动,或者老同学聚会,别人都对自家的“小超人”赞不绝口,他却只能扮深沉。人家的孩子,不仅成绩出类拔萃,而且特长多多。唯有我们家的“二十三号女生”,没有一样值得炫耀的地方。

因此,他一看到娱乐节目里那些才艺非凡的孩子,就羡慕得两眼放光。后来,看到一则九岁孩子上大学的报道,他很受伤地问女儿:孩子,你怎么就不是个神童呢?女儿说,因为你不是神父啊。老公无言以对,我不禁笑出声来。

中秋节,亲友相聚,坐满了一个宽大的包厢。众人的话题,也渐渐转向各家的小儿女。趁着酒兴,要孩子们说说将来要做什么。

钢琴家,明星,政界要人,孩子们毫不怯场,连那个四岁半的女孩,也会说将来要做央视的主持人,赢得一阵赞叹。

十二岁的女儿,正为身边的小弟弟小妹妹剔蟹剥虾,盛汤揩嘴,忙得不亦乐乎。人们忽然想起,只剩她没说了。在众人的催促下,她认真地回答:“长大了,我的第一志愿是,当幼儿园老师,领着孩子们唱歌跳舞,做游戏。”

众人礼貌地表示赞许,紧接着追问她的第二志愿。她大大方方地说:“我想做妈妈,穿着印叮当猫的围裙,在厨房里做晚餐,然后,给我的孩子讲故事,领着他在阳台上看星星。”

亲友愕然,面面相觑,不知道该说些什么。老公的神情,极为尴尬。回家后,他叹着气说,你还真打算让女儿将来当个幼儿园老师?咱们难道真的眼睁睁地看着她当中等生?

其实,我们也动过很多脑筋。为提高她的学习成绩,请家教,报辅导班,买各种各样的资料。孩子也蛮懂事,漫画书不看了,剪纸班退出了,周末的懒觉放弃了。像一只疲惫的小鸟,她从一个班赶到另一个班,卷子,练习册,一沓沓地做。

可到底是个孩子,身体先扛不住了,得了重感冒。输着液体,在病床上,她还坚持写作业,最后引发了肺炎。病好后,孩子的脸小了一圈。可期末考试的成绩,仍然是让我们哭笑不得的二十三名。

后来,我们也曾试过增加营养、物质激励等等,几次三番地折腾下来,女儿的小脸越来越苍白。而且,一说要考试,她就开始厌食,失眠,冒虚汗,再接着,考出了令我们瞠目结舌的三十三名。

我和老公,悄无声息地放弃了轰轰烈烈的揠苗助长活动。恢复了她正常的作息时间,还给她画漫画的权利,允许她继续订《儿童幽默》之类的书报,家中安稳了很久。我们对女儿,是心疼的,可面对她的成绩,又有说不出的困惑。

周末,一群同事结伴郊游。大家各自做了最拿手的菜,带着老公和孩子去野餐。一路上笑语盈盈,这家孩子唱歌,那家孩子表演小品。女儿没什么看家本领,只是开心地不停鼓掌。她不时跑到后面,照看着那些食物。把倾斜的饭盒摆好,松了的瓶盖拧紧,流出的菜汁擦净。忙忙碌碌,像个细心的小管家。

野餐的时候,发生了一件意外的事。两个小男孩,一个奥数尖子,一个英语高手,同时夹住盘子里的一块糯米饼,谁也不肯放手,更不愿平分。丰盛的美食,源源不断地摆上来,他们看都不看。大人们又笑又叹,连劝带哄,可怎么都不管用。最后,还是女儿,用掷硬币的方法,轻松地打破了这个僵局。

回来的路上,堵车,一些孩子焦躁起来。女儿的笑话一个接一个,全车人都被逗乐了。她手底下也没闲着,用装食品的彩色纸盒,剪出许多小动物,引得这群孩子赞叹不已。至下车,每个人都拿到了自己的生肖剪纸。听到孩子们连连道谢,老公禁不住露出了自豪的微笑。

期中考试后,我接到了女儿班主任的电话。首先得知,女儿的成绩,仍是中等。不过,他说,有一件奇怪的事想告诉我,他从教三十年了,第一次遇见这种事。

语文试卷上有一道附加题:你最欣赏班里的哪位同学,请说出理由。除女儿之外,全班同学,竟然都写上了女儿的名字。理由很多:热心助人,守信用,不爱生气,好相处等等,写得最多的是,乐观幽默。班主任还说,很多同学建议,由她来担任班长。他感叹道:你这个女儿,虽说成绩一般,可为人,实在很优秀啊。

我开玩笑地对女儿说,你快要成为英雄了。正在织围巾的女儿,歪着头想了想,认真地告诉我说,老师曾讲过一句格言:当英雄路过的时候,总要有人坐在路边鼓掌。她轻轻地说:“妈妈,我不想成为英雄,我想成为坐在路边鼓掌的人。”

我猛地一震,默默地打量着她。她安静地织着绒线,淡粉的线,在竹针上缠缠绕绕,仿佛一寸一寸的光阴,在她手里,吐出星星点点的花蕾。我心里,竟是蓦地一暖。

那一刻,我忽然被这个不想成为英雄的女孩打动了。这世间,有多少人,年少时渴望成为英雄,最终却成了烟火红尘里的平凡人。如果健康,如果快乐,如果,没有违背自己的心意,我们的孩子,又何妨做一个善良的普通人。

长大成人后,她一定会成为:贤淑的妻子,温柔的母亲,甚至,热心的同事,和善的邻居。在那些漫长的岁月里,她都能安然地过着自己想要的生活。作为父母,还想为孩子祈求怎样更好的未来呢?

]]>
booktian 2008-4-19 9:38:00
<![CDATA[数据库基本术语]]> http://booktian.blog.esnai.com/archives/2008/80531.html 在数据库世界中,MySQL归类为关系数据库管理系统(RDBMS)。所谓关系数据库管理系统的含义如下:

■ 数据库(RDBMS 中的“DB”)是存储信息的仓库,以一种简单的、规则的方式进行组织。
■ 数据库中的数据集组织为表。
■ 每个表由行和列组成。
■ 表中每行为一个记录。
■ 记录可包含几段信息;表中每一列对应这些信息中的一段。
■ 管理系统(“MS”)是允许通过插入、检索、修改或删除记录来使用数据的软件。
■ 关系(“R”)一词表示一种特殊种类的DB MS,它通过寻找相互之间的共同元素使存放在一个表中的信息关联到存放在另一个表中的信息。关系数据库的能力在于它能够从这些表中方便地取出数据,并将关联各表中的信息相结合得出问题的答案,这些答案只依据单个表的信息是不可能得到的。

]]>
booktian 2008-2-14 18:03:00