2008年10月13日 星期一

愛情最後的手段

輸家,永遠是痛苦的一方,無論是自己還是周遭的朋友,在必要的時後,都必須用科學的態度,客觀的審視狀況,縮短傷痛的深度與時間,通常男女的搭配都是一強一弱,弱的一方,往往就是愛情裡的輸家,何謂弱的一方呢,舉例來說,男人在外留連夜店不歸,女人在家苦守電話難眠,狀況非常明顯,男人覺得光陰似箭,女人覺得分秒難挨,除非女人在心靈學上有深厚的修養,否則會一直扮演輸家的角色直到最後,但心靈修養高的女人,卻也不屑與這樣的男人深交,那麼這時就必須有破釜沈舟的決心逆轉已成的敗局,雖然這其中帶有報復色彩,但實際上對雙方來說還是具有正面意義的。

失去,是愛情的終點站,當其中一方對"失去"並不在意時,愛情就已經不再存在,所謂最後的手段,就是把失去的角色對調,也就是俗稱的,在對方甩了你之前,先甩了他。

雖然聽起來有點老套,但重點在於這個"甩"字,要用得高明,就必須有勇氣與心機。

雙方只要仍有愛情(尚未出軌),就會對"失去"產生過敏,這也是反敗為勝的最後機會,比對方更變本加厲,更加明顯的透露著第三者.....That's All.....很簡單吧...

不過大部分人都不敢這麼做(尤其是女人),這一篇有點無聊,剛好聽到個酒鬼聽她的女朋友在訴苦,兩個人苦來苦去的,卻不想想反敗為勝的方法.......好....打完收工...

2008年9月28日 星期日

軟體防駭小招數

辛苦寫的程式一下被破解了,那種感覺真的是很XXX....

目前有很多加殼程式,但只要遇到低階語言高手,還是會被破解,只是多花點時間而已,所以我花了幾天,設法在高階語言上造成破解障礙。

一般來說破解者常用的方是就是修改程式內的日期,讓程式以為還沒到期,或是用跳躍的方式,讓程式跳過驗證序號或是日期的那一段函數,所以不管設多少關卡,只要破解者有耐心一一跳過,還是可以破解成功的,況且設太多關卡,對撰寫者來說也是一種困擾。

程式的執行是具有連續性的,某個動作後發生某個事件,這也讓破解人只要依著順序去找出關鍵位置就能輕易跳過,所以這個位置就是雙方鬥智的關鍵。

我想到的方法必須依賴到網路伺服器做驗證,一旦驗證端是在程式內,無論如何都會被跳過,所以改由伺服器來做驗證,以日期來說,程式先送軟體過期日給伺服器,這時第一個問題來了,破解者可以輕易的變造這個日期,所以日期在傳送之前必須先經過加密,例如

myDate:= 'alsdkfjsks233+==';
SendmyDate(myDate); ////傳送到伺服器

伺服器收到後做解密的動作然後進行驗證,關鍵就在此處,如果伺服器驗證後傳回布林值或是其他帶碼,程式收到後勢必還需要再做判斷,例如

if serverBack = true then 驗證過關 else 驗證失敗

像這樣判斷,一下子就被破解了,破解者只要直接跳到驗證成功,程式就會正常的執行下去,所以在程式中不可出現像這樣的判斷,我的作法是伺服器直接傳回Event名稱。

舉例來說,假設程式是寫在一個Timer的onTimer上,那麼這個Timer的EventName就由伺服器回傳,也就是說必須在程式中有兩個onTimer事件,一個是驗證過關 onGoodTimer ,一個是驗證失敗 onBadTimer ,而Timer在初始狀態下是不賦予任何事件的(也可以先賦予失敗事件),當伺服器驗證失敗後,直接傳 "onBadTimer" 回來,然後直接將這個字串所代表的事件賦予Timer,注意,千萬不要寫成

if serverBack = 'onBadTimer' then xxx (這跟前面沒兩樣)

必須直接賦予,代碼如下


procedure TmainForm.ExecMethod(OnObject: TObject; MethodName: string) ;
var
Routine: TMethod;
begin

//事件所在位置是mainForm,所以OnObject指定為mainForm

myTimer.OnTimer:= nil;

Routine.Data := Pointer(OnObject);
Routine.Code := OnObject.MethodAddress(MethodName) ; //由mainForm調出事件的指標位置
myTimer.OnTimer:= TNotifyEvent(Routine);


end;

執行:

ExecMethod(mainForm, ServerBack);


這樣一來,即使破解者跳過驗證這一段,Timer也無法得到正確的Event而變成沒有作用,即使破解者知道這個作法,也必須從你的程式碼中找出正確的事件來,這會讓他們很頭痛,況且他不一定會朝這方面去想,更增加了破解難度,如果再加上CodeVisual或Themida這種難纏的殼,軟體被破解的機率就比較小了。
由於Pascal跟C++是屬於編譯型程式,所以無法把ASC碼當作機械碼用,如果是直譯型程式(如Flash, JavaScript),用這方式就更方便了,甚至可以將整個Function放在Server,回傳時只要調用Eval函數轉換即可。

2008年8月19日 星期二

該逃的時後要快逃

就在打完上一篇文後,跟我表妹在MSN起了一番不小的爭論,似乎是讓她覺得有(受傷)的感覺,她最後說:「男人買單付帳是一種禮貌」,我說:「那女人讓男人娶二房納小妾,也該算是一種傳統禮貌嘍?」,她無話可駁的怒氣似乎從電腦裡飄出來,其實這個爭論一開始時我就有想結束逃開的念頭,但終究還是被那時的情緒淹沒,"爭論"某方面就代表著敵對,實際上除了破壞感情外,並沒有實質的好處。
沒有人能從爭論中改變對方,這是早有科學根據的事,儘管其中一方論點正確且發自善意,也不可能有好結果,試想,去跟一個每天泡在麥當勞的小五生爭論,麥當勞吃多了到底怎麼不好,就算你的舉證再有理,他也會誓死捍衛麥當勞甚至不惜跟你翻臉,其實他心理知道你是對的,但絕不會在當下有任何妥協,即使吃到得心臟病,他也不會想聽到你講:「你看吧...當初告訴你...」。


有些事情必須隨著時間的消逝才能有所體會,工地裡打零工的老工人,或許某天醒來,才真正體會到母親為何叫他好好唸書。
每個人都有自己的人生體驗,聰明的人之所以愛看書,是因為在書中可以縱情想像並體驗別人的人生,胸中的體驗多了,對於人生的視野自然更加遼闊。
然而要將別人的經驗融化成自我的氣質卻不是容易的事,只有不斷的自我檢視與思考,否則,書仍就是書,別人終究是別人。


我想,明天,我會去跟我那氣呼呼的表妹道歉,把 "請對自己沒意思(又不算朋友)的女人吃飯是冤大頭行為" ,改為 "沒事請妳吃飯的一定不安好心",她或許就接受了。

這個爭論,我有所得,希望她也是....

"性"是起點還是終點

在台灣,如果一個女子跟認識兩天的人上床(兩頓晚餐...或一頓),可能會被說成隨便或不檢點(到底要多久,目前還沒一個說法)。
不過以數學的角度來看的話,求出結果的空間才會更大,根據統計,一個人要遇到完全適合自己的另一半,其機率是五十萬分之一(偏偏台灣偶像劇裡的都能註死遇到),也就是說,倒楣一點的人,必須跟四九萬九千九百九十九人約會後,才會遇到。

什麼叫完全適合呢?可粗分兩種,生理跟心理,心裡的契合決不是兩頓晚餐可以知道的(有些人一輩子都不知道),但生理的契合呢,二十分鐘就知道了。

洋片常見的橋段是前一幕還在說Hello...下一幕就到了床上(慾望城市這種橋段最多),如果對方有怪癖,例如性虐待,男方不舉,或女方沒感覺,隔天大家就ByeBye了,雖然看起來很濫情,但卻絕對有利於雙方(運動嘛..),因為如果進入了心靈層次,那麼生理上的不契合就會產生痛苦(為了愛情、其他都可以忍..)...

台灣(中國)男人,常把性當作終點,好像跟他上過床,就變成"他的人",漸漸的形象沒了、禮貌沒了、幽默風趣也沒了,根據專家統計,台灣失戀被甩的男人其痛苦指數非常高,因失戀而做出蠢事的比例更是高過於女性,其實造成這樣的痛苦,跟本與愛情無關,其痛苦的根源來自於自己的財產被奪,甚至幻想出別人正在"享用"他財產的畫面,熟可忍,熟不可忍啊,古今中外皆然...


把性當作起點來認識對方,在東方的道德裡似乎很難被接受,但在問題的解決上卻是合理的,生理與心靈,對雙方而言,本身就是存在的未知數,就程式來說叫變數,能夠儘速求出值的變數,何必拖時間呢。

台灣(中國)的女性較注重階段性,認為每一階段都有其必要性,從牽手的臉紅心跳到床上的底死纏綿,不能太快,需得細火慢熬才能領會箇中滋味,但就我個人覺得28歲以後的女性就不適合這一套了,如果花了半年享受這種感覺,最後發現男方的"那個"只有兩公分,保證什麼臉紅心跳都想不起來了...
當然...妳可以用"愛情"去克服,但如果花了一年發現克服不了....那個時後就是29歲半,然後還要承受心靈上的痛苦...因為妳們是真的有"愛情"嘛

男性的佔有慾從某方面來講可說是由女性的衿持所培養出來的,女人在"做"完後,會有一種自己獻身給對方的感覺,接著自願成為他人的財產(當真是甜蜜無限),男人更可憐了,此後為這"財產"所做的一切都是應該的。

曾聽一個老外講過,台灣女人很好騙,只要跟她上床,她就可以當女朋友,而且可以"非常"的包容自己的缺點,在歐美,上床跟男女朋友之間還差了一大截呢,更遑論結婚。


"性"可以不是起點,但絕不是終點...

2008年7月15日 星期二

可恨的Access日期

procedure TForm1.Button11Click(Sender: TObject);
var
tmpd,tmpt:tdatetime;
tmpd1,tmpt1:string;
begin
query1.Close;
query1.SQL.Clear;
tmpd := strtodate(edit4.text);
tmpt := strtotime(maskedit5.text);
tmpd1 := formatdatetime('yyyy-mm-dd',tmpd); // 'yyyy/mm/dd' 'yyyy/m/d' 都行
tmpt1 := formatdatetime('hh::mm',tmpt); // 必须是::否则错!
query1.SQL.Add('insert into dd(短日期,短时间,文本,备注,文本) values(#'+tmpd1+'#,#'+tmpt1+'#,:v1,:v2,:v3)');
query1.Params[0].AsString := edit5.Text;//‘111’
query1.Params[1].AsString := edit6.Text;//‘试验试验试验’
query1.Params[2].AsString := edit7.Text;//‘小王’

query1.Prepare;
query1.ExecSQL;

end;

2008年6月30日 星期一

我請你吃飯與我們一起吃飯的奧妙

台灣男人能分辨,但經常不會貫徹這兩句話的差別,最後導致台灣女人隨身帶著好人卡白吃白喝。

男女之間的買單問題,一向是比較敏感而難解的,也有可能是兩情相悅或是會錯意的開始,許多女性習慣在離開的時候(該買單的時候)會去洗手間,姑且不論這是有意或是習慣,一般男性(台灣)都會乖乖的去買單,此時都作不得準,你可以暫時解讀為這個女孩對你有興趣,這是比較自我陶醉的解讀,你會產生已投資的意識(鈔票確實是花了嘛)。

既然投資了,不管嘴上說得多漂亮,都會有得到回報的期待(這叫人性)

第一次吃飯,在男性買單後女性通常會做出拿錢或是看帳單的動作,其實用膝蓋就可以看出她是否有心要付,如果連做作樣子都沒有,勸你就不用再聯絡了,這是明顯的公主病,她心裡說不定還會嫌餐廳不夠高級。

想知道對方是對你有興趣,亦或是公主病,只要在回家後等等,如果她有打電話給你,謝謝你請她吃飯,且你們約定了下次或是她說要回請你,那麼恭喜你,很快的你們就會進入狀況,且這樣的女性在氣質教養上都有一定的程度。

如果她沒有打給你,也不用太灰心,女性的衿持嘛,但你就必須心裡要有底,這樣的女性並沒有很好的社交教養,你可以主動打去並嘗試性的約下一次,這個時候才是觀察的重點期,無論你們吃飯的時候聊得多愉快,如果她推託你的邀約,且又沒有提出她有空的日期,那你可以馬上掛掉電話了(已經浪費的一頓,別再浪費電話費),對她而言,你只是個會說笑話又肯買單的路人甲,而且請注意,不單要掛電話,最好以後沒事都別聯絡,因為跟這樣的女性,即使只是作朋友都不會有好處,因為她連最基本的禮儀都沒有(你的前面一定排了一堆冤大頭)。

再來說到會付帳的女性,一般男人的天性都會往壞處想,台灣男人尤是,她是不是對我沒感覺,她是不是不想跟我有牽扯等等好笑的念頭,其實不管戀愛與否,這樣的女性都是值得結交與敬重的,她可能不是拿一半的錢給你,也可能是回請你一頓,如果是後者,恭喜你,她在沒有誰請誰的條件下想見到你這個人,那是一件美好的事。

付帳絕不是風度的表現,但有可能是冤大頭,有些公主症病重的女性,甚至認為不買單的男性沒風度,卻不知她在要男性買單的同時,把自己變成了陪吃飯的妓女。

通常,對那些要離開時會先去洗手間的女性,我會"禮貌"的等她出來再買單,時代越來越進步,禮貌卻越來越差,然而禮貌又反應氣質,適當的禮貌會讓一個女人閃閃發亮。

2008年6月10日 星期二

微軟又耍怪招了

在Access內用SQL語法查詢日期,除了前面要加#號外,如果還要兼著查時間,得要多加一個冒號,為了這個冒號,多花了一天......

select * from table

where startime between #2003-2-23 23::12::00# and #2004-3-12 12::01::34#


真是快被微軟氣瘋了,每次都愛自己耍怪招,偏偏其他資料庫廠商不爭氣,讓Access在DeskTop上獨大.......唉

2008年6月8日 星期日

最後的愛

小時候姑姑是開漫畫店的,不過生性懶散的她,開沒多久就倒了,倒是便宜了我這個小鬼,每天都抱著漫畫書不放,尤其是她買新書的時候,真想高唱"世上只有姑姑好"...

那個時候的漫畫,很多都是單本的短篇故事,作者不詳,書名也是台灣亂編的,那些故事雖然沒有像現在的灌籃高手、第一神拳那麼那麼引人入勝,但有些深度卻是非常夠的,一直到現在,仍讓我念念不忘....

故事發生在很久很久以後的未來,地球環境已經惡化到無法居住,有錢的人紛紛坐著太空船移民到新的星球,只留下了年老與窮苦的人,這些人也因為沒有食物,且受到輻射感染,慢慢的都死亡了。

有一對兄妹,哥哥12歲,妹妹9歲,兩人住在廢棄的太空船上相依為命,由於太空船的外殼有防輻射的功能,且船內有一些冷凍食品及醫療用品,所以兩人的身體還算健康。

哥哥每天忙進忙出的修補太空船,他告訴妹妹這艘船沒有壞很多地方,只要好好修補,他們就可以飛到遙遠的新家,妹妹則為哥哥準備茶水,食物,儘管生活相當艱難,兩人依就充滿希望。

後來,船內的食物已經不夠他們吃了,妹妹也因為受到輕微的輻射感染而發高燒,哥哥對妹妹說,太空船已經修好,就是明天了,明天他們就可以往美麗的新家出發,妹妹顯得很開心,在哥哥懷裡沈沈的睡去。

隔天早上,他們吃了一噸豐盛的早餐,哥哥說到了太空就要冬眠,不需要再吃東西,所以他們將僅存的食物全吃完了。

哥哥讓妹妹穩坐在太空椅上,告訴她等一下太空船起飛的時候要閉上眼睛,接著他打開了啟動太空船的按鈕,太空船發出了轟轟的聲響,電腦也發出倒數計時的語音...10,9,8,7....妹妹緊緊閉上雙眼等待起飛...


在語音數到0的時候,一聲巨響,然後.....一切都安靜下來了,太空船並沒有起飛,而哥哥手裡拿著一把鎗,剛把最後一顆子彈打出去的鎗。

他面無表情的放下槍,輕輕的摟住已經氣絕的妹妹,望著充滿輻射晦暗的天空,喃喃的唸著...妳看到了嗎?我們的新家.......

2008年6月5日 星期四

鎖住任務欄

var  
hTray : THandle;
begin
hTray :
= FindWindow('shell_traywnd', nil);
if hTray > 0 then
begin
EnableWindow(hTray, false);
//恢复设置成true就可以
end;
end;

2008年6月1日 星期日

Delphi 字串函數大全

記下來,省得以後找不到

uses StrUtils; 【字符串函数大全】
首部 function AnsiResemblesText(const AText, AOther: string): Boolean;
$[StrUtils.pas
功能 返回两个字符串是否相似
说明 ANSI(American National Standards Institute)美国国家标准协会;不区分大小写
参考 function StrUtils.SoundexProc; var StrUtils.AnsiResemblesProc
例子 CheckBox1.Checked := AnsiResemblesText(Edit1.Text, Edit2.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function AnsiContainsText(const AText, ASubText: string): Boolean;
$[StrUtils.pas
功能 返回字符串AText是否包含子串ASubText
说明 不区分大小写
参考 function StrUtils.AnsiUppercase; function StrUtils.AnsiPos
例子 CheckBox1.Checked := AnsiContainsText(Edit1.Text, Edit2.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function AnsiStartsText(const ASubText, AText: string): Boolean;
$[StrUtils.pas
功能 返回字符串AText是否以子串ASubText开头
说明 不区分大小写
参考 function Windows.CompareString
例子 CheckBox1.Checked := AnsiStartsText(Edit1.Text, Edit2.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function AnsiEndsText(const ASubText, AText: string): Boolean;
$[StrUtils.pas
功能 返回字符串AText是否以子串ASubText结尾
说明 不区分大小写
参考 function Windows.CompareString
例子 CheckBox1.Checked := AnsiEndsText(Edit1.Text, Edit2.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function AnsiReplaceText(const AText, AFromText, AToText: string):
string; $[StrUtils.pas
功能 返回字符串AText中用子串AFromText替换成子串AToText的结果
说明 不区分大小写
参考 function SysUtils.StringReplace; type SysUtils.TReplaceFlags
例子 Edit4.Text := AnsiReplaceText(Edit1.Text, Edit2.Text, Edit3.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function AnsiMatchText(const AText: string; const AValues: array of
string): Boolean; $[StrUtils.pas
功能 返回字符串数组AValues中是否包含字符串AText
说明 不区分大小写
参考 function StrUtils.AnsiIndexText
例子 CheckBox1.Checked := AnsiMatchText(Edit1.Text, ['a1', 'a2', 'a3',
'a4']);
━━━━━━━━━━━━━━━━━━━━━
首部 function AnsiIndexText(const AText: string; const AValues: array of
string): Integer; $[StrUtils.pas
功能 返回字符串AText在字符串数组AValues中的位置
说明 不区分大小写;如果不包含则返回-1
参考 function SysUtils.AnsiSameText
例子 SpinEdit1.Value := AnsiIndexText(Edit1.Text, ['a1', 'a2', 'a3', 'a4']);
━━━━━━━━━━━━━━━━━━━━━
首部 function AnsiContainsStr(const AText, ASubText: string): Boolean;
$[StrUtils.pas
功能 返回字符串AText是否包含子串ASubText
说明 区分大小写
参考 function StrUtils.AnsiPos
例子 CheckBox1.Checked := AnsiContainsStr(Edit1.Text, Edit2.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function AnsiStartsStr(const ASubText, AText: string): Boolean;
$[StrUtils.pas
功能 返回字符串AText是否以子串ASubText开头
说明 区分大小写
参考 function SysUtils.AnsiSameStr
例子 CheckBox1.Checked := AnsiStartsStr(Edit1.Text, Edit2.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function AnsiEndsStr(const ASubText, AText: string): Boolean;
$[StrUtils.pas
功能 返回字符串AText是否以子串ASubText结尾
说明 区分大小写
参考 function SysUtils.AnsiSameStr
例子 CheckBox1.Checked := AnsiEndsStr(Edit1.Text, Edit2.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function AnsiReplaceStr(const AText, AFromText, AToText: string):
string; $[StrUtils.pas
功能 返回字符串AText中用子串AFromText替换成子串AToText的结果
说明 区分大小写
参考 function SysUtils.StringReplace; type SysUtils.TReplaceFlags
例子 Edit4.Text := AnsiReplaceStr(Edit1.Text, Edit2.Text, Edit3.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function AnsiMatchStr(const AText: string; const AValues: array of
string): Boolean; $[StrUtils.pas
功能 返回字符串数组AValues中是否包含字符串AText
说明 区分大小写
参考 function StrUtils.AnsiIndexStr
例子 CheckBox1.Checked := AnsiMatchStr(Edit1.Text, ['a1', 'a2', 'a3', 'a4']);
━━━━━━━━━━━━━━━━━━━━━
首部 function AnsiIndexStr(const AText: string; const AValues: array of
string): Integer; $[StrUtils.pas
功能 返回字符串AText在字符串数组AValues中的位置
说明 区分大小写
参考 function SysUtils.AnsiSameStr
例子 SpinEdit1.Value := AnsiIndexStr(Edit1.Text, ['a1', 'a2', 'a3', 'a4']);
━━━━━━━━━━━━━━━━━━━━━
首部 function DupeString(const AText: string; ACount: Integer): string;
$[StrUtils.pas
功能 返回字符串AText的ACount个复本
说明 当ACount为0时返回''
参考 function System.SetLength
例子 Edit3.Text := DupeString(Edit1.Text, SpinEdit1.Value);
━━━━━━━━━━━━━━━━━━━━━
首部 function ReverseString(const AText: string): string; $ [StrUtils.pas
功能 返回字符串AText的反序
说明 ReverseString('1234') = '4321'
参考 function System.SetLength
例子 Edit3.Text := ReverseString(Edit1.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function StuffString(const AText: string; AStart, ALength: Cardinal;
const ASubText: string): string; $[StrUtils.pas
功能 返回嵌套字符串
说明 AStart:嵌套开始位置;ALength:嵌套长度;StuffString('abcd', 2, 0, '12') = 'a12bcd'
参考 function System.Copy
例子 Edit3.Text := StuffString(Edit1.Text, SpinEdit1.Value, SpinEdit2.Value,
Edit2.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function RandomFrom(const AValues: array of string): string; overload;
$[StrUtils.pas
功能 随机返回字符串数组AValues中的一个元素
说明 之前建议执行Randomize
参考 function System.Random
例子 Randomize; Edit3.Text := RandomFrom(['a1', 'a2', 'a3', 'a4']);
━━━━━━━━━━━━━━━━━━━━━
首部 function IfThen(AValue: Boolean; const ATrue: string; AFalse: string =
''): string; overload; $[StrUtils.pas
功能 返回指定的逻辑字符串
说明 IfThen(True, '是', '否') = '是';IfThen(False, '是', '否') = '否'
参考
例子 Edit3.Text := IfThen(CheckBox1.Checked, Edit1.Text, Edit2.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function LeftStr(const AText: string; const ACount: Integer): string;
$[StrUtils.pas
功能 返回字符串AText左边的ACount个字符
说明 LeftStr('123456', 3) = '123'
参考 function System.Copy
例子 Edit3.Text := LeftStr(Edit1.Text, SpinEdit1.Value);
━━━━━━━━━━━━━━━━━━━━━
首部 function RightStr(const AText: string; const ACount: Integer): string;
$[StrUtils.pas
功能 返回字符串AText右边的ACount个字符
说明 RightStr('123456', 3) = '456'
参考 function System.Copy
例子 Edit3.Text := RightStr(Edit1.Text, SpinEdit1.Value);
━━━━━━━━━━━━━━━━━━━━━
首部 function MidStr(const AText: string; const AStart, ACount: Integer):
string; $[StrUtils.pas
功能 返回字符串AText从AStart开始的ACount个字符
说明 其实就是Copy
参考 function System.Copy
例子 Edit3.Text := MidStr(Edit1.Text, SpinEdit1.Value, SpinEdit2.Value);
━━━━━━━━━━━━━━━━━━━━━
首部 function SearchBuf(Buf: PChar; BufLen: Integer; SelStart, SelLength:
Integer; SearchString: String; Options: TStringSearchOptions = [soDown]):
PChar; $[StrUtils.pas
功能 返回第一个搜索到的指针位置
说明 这函数常用于文本中搜索字符串
参考
例子
///////Begin SearchBuf
function SearchEdit(EditControl: TCustomEdit; const SearchString: String;
SearchOptions: TStringSearchOptions; FindFirst: Boolean = False): Boolean;
var
Buffer, P: PChar;
Size: Word;
begin
Result := False;
if (Length(SearchString) = 0) then Exit;
Size := EditControl.GetTextLen;
if (Size = 0) then Exit;
Buffer := StrAlloc(Size + 1);
try
EditControl.GetTextBuf(Buffer, Size + 1);
P := SearchBuf(Buffer, Size, EditControl.SelStart, EditControl.SelLength,
SearchString, SearchOptions);
if P <> nil then begin
EditControl.SelStart := P - Buffer;
EditControl.SelLength := Length(SearchString);
Result := True;
end;
finally
StrDispose(Buffer);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
SearchOptions: TStringSearchOptions;
begin
SearchOptions := [];
if CheckBox1.Checked then
Include(SearchOptions, soDown);
if CheckBox2.Checked then
Include(SearchOptions, soMatchCase);
if CheckBox3.Checked then
Include(SearchOptions, soWholeWord);
SearchEdit(Memo1, Edit1.Text, SearchOptions);
Memo1.SetFocus;
end;
///////End SearchBuf
━━━━━━━━━━━━━━━━━━━━━
首部 function Soundex(const AText: string; ALength: TSoundexLength = 4):
string; $[StrUtils.pas
功能 返回探测字符串
说明 根据探测法(Soundex)可以找到相进的字符串;
参考
例子 Edit2.Text := Soundex(Edit1.Text, SpinEdit1.Value);
━━━━━━━━━━━━━━━━━━━━━
首部 function SoundexInt(const AText: string; ALength: TSoundexIntLength =
4): Integer; $[StrUtils.pas
功能 返回探测整数
说明 ALength的值越大解码准确率越高
参考
例子 SpinEdit2.Value := SoundexInt(Edit1.Text, SpinEdit1.Value);
━━━━━━━━━━━━━━━━━━━━━
首部 function DecodeSoundexInt(AValue: Integer): string; $ [StrUtils.pas
功能 返回探测整数的解码
说明 DecodeSoundexInt(SoundexInt('hello')) 相当于 Soundex('hello')
参考
例子 Edit2.Text := DecodeSoundexInt(SpinEdit2.Value);
━━━━━━━━━━━━━━━━━━━━━
首部 function SoundexWord(const AText: string): Word; $[StrUtils.pas
功能 返回探测文字数值
说明 没有参数ALength已经固定为4
参考
例子 SpinEdit2.Value := SoundexWord(Edit1.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function DecodeSoundexWord(AValue: Word): string; $ [StrUtils.pas
功能 返回探测文字数值的解码
说明 DecodeSoundexWord(SoundexWord('hello')) 相当于 Soundex('hello')
参考
例子 Edit2.Text := DecodeSoundexWord(SpinEdit2.Value);
━━━━━━━━━━━━━━━━━━━━━
首部 function SoundexSimilar(const AText, AOther: string; ALength:
TSoundexLength = 4): Boolean; $[StrUtils.pas
功能 返回两个字符串的探测字符串是否相同
说明 Result := Soundex(AText, ALength) = Soundex(AOther, ALength)
参考
例子 CheckBox1.Checked := SoundexSimilar(Edit1.Text, Edit2.Text,
SpinEdit1.Value);
━━━━━━━━━━━━━━━━━━━━━
首部 function SoundexCompare(const AText, AOther: string; ALength:
TSoundexLength = 4): Integer; $[StrUtils.pas
功能 返回比较两个字符串的探测字符串的结果
说明 Result := AnsiCompareStr(Soundex(AText, ALength), Soundex (AOther,
ALength))
参考 function SysUtils.AnsiCompareStr
例子 SpinEdit2.Value := SoundexCompare(Edit1.Text, Edit2.Text,
SpinEdit1.Value);
━━━━━━━━━━━━━━━━━━━━━
首部 function SoundexProc(const AText, AOther: string): Boolean;
$[StrUtils.pas
功能 调用SoundexSimilar返回两个字符串的探测字符串是否相同
说明 系统变量AnsiResemblesProc的默认值
参考 function StrUtils.AnsiResemblesText
例子 [var AnsiResemblesProc: TCompareTextProc = SoundexProc;]
━━━━━━━━━━━━━━━━━━━━━
首部 function NewStr(const S: string): PString; deprecated; $ [SysUtils.pas
功能 返回一个新的字符串指针地址
说明 字符串S为空时返回NullStr
参考 procedure System.New
例子
////////Begin NewStr,DisposeStr
procedure TForm1.Button1Click(Sender: TObject);
var
P: PString;
begin
P := NewStr(Edit1.Text);
Edit2.Text := P^;
DisposeStr(P);
end;
////////End NewStr,DisposeStr
━━━━━━━━━━━━━━━━━━━━━
首部 procedure DisposeStr(P: PString); deprecated; $[SysUtils.pas
功能 释放字符串指针P资源
说明 配合函数NewStr使用
参考 procedure System.Dispose
例子 <如上参见,如下参见>
━━━━━━━━━━━━━━━━━━━━━
首部 procedure AssignStr(var P: PString; const S: string); deprecated;
$[SysUtils.pas
功能 将字符串S更新给字符串指针P
说明 更新值时会释放以前字符串指针的资源
参考 function SysUtils.NewStr;function SysUtils.DisposeStr
例子
////////Begin AssignStr
procedure TForm1.Button1Click(Sender: TObject);
var
P: PString;
begin
P := nil;
AssignStr(P, Edit1.Text);
Edit2.Text := P^;
DisposeStr(P);
end;
////////End AssignStr
━━━━━━━━━━━━━━━━━━━━━
首部 procedure AppendStr(var Dest: string; const S: string); deprecated;
$[SysUtils.pas
功能 在字符串Dest后追加字符串S
说明 相当于Dest := Dest + S;Delphi6已经不建议使用
参考
例子
////////Begin AppendStr
procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
begin
S := Edit2.Text;
AppendStr(S, Edit1.Text);
Edit2.Text := S;
end;
////////End AppendStr
━━━━━━━━━━━━━━━━━━━━━
首部 function UpperCase(const S: string): string; $[SysUtils.pas
功能 返回字符串S的大写形式
说明 非小写字符不处理
参考 procedure System.SetLength
例子 Edit2.Text := UpperCase(Edit1.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function LowerCase(const S: string): string; $[SysUtils.pas
功能 返回字符串S的小写形式
说明 非大写字符不处理
参考 procedure System.SetLength
例子 Edit2.Text := LowerCase(Edit1.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function CompareStr(const S1, S2: string): Integer; $ [SysUtils.pas
功能 返回比较两个字符
说明 当S1>S2返回值>0;当S1<0;当s1=s2返回值=0;区分大小写>
例子 SpinEdit1.Value := CompareStr(Edit1.Text, Edit2.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function CompareMem(P1, P2: Pointer; Length: Integer): Boolean;
assembler; $[SysUtils.pas
功能 返回比较两个内存指针
说明 CompareMem(PChar('12a'), PChar('12c'), 2)=True;CompareMem(PChar ('12a'),
PChar('12c'), 3)=False
参考
例子 CheckBox1.Checked := CompareMem(Self, Form1, 8);
━━━━━━━━━━━━━━━━━━━━━
首部 function CompareText(const S1, S2: string): Integer; $ [SysUtils.pas
功能 返回比较两个字符串
说明 不区分大小写
参考
例子 SpinEdit1.Value := CompareText(Edit1.Text, Edit2.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function SameText(const S1, S2: string): Boolean; $ [SysUtils.pas
功能 返回两个字符串是否相等
说明 不区分大小写
参考
例子 CheckBox1.Checked := SameText(Edit1.Text, Edit2.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function AnsiUpperCase(const S: string): string; $[SysUtils.pas
功能 返回字符串S的大写形式
说明 ANSI(American National Standards Institute)美国国家标准协会;非小写的字符不变
参考 function Windows.CharUpperBuff
例子 Edit2.Text := AnsiUpperCase(Edit1.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function AnsiLowerCase(const S: string): string; $[SysUtils.pas
功能 返回字符串S的小写形式
说明 非大写字符不处理
参考 function Windows.CharLowerBuff
例子 Edit2.Text := AnsiLowerCase(Edit1.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function AnsiCompareStr(const S1, S2: string): Integer; $ [SysUtils.pas
功能 反回比较两个字符串
说明 当S1>S2返回值>0;当S1<0;当s1=s2返回值=0;区分大小写>S2返回值>0;当S1<0;当s1=s2返回值=0;不区分大小写>S2返回值>0;当S1<0;当s1=s2返回值=0;区分大小写>S2返回值>0;当S1<0;当s1=s2返回值=0;不区分大小写;ignore(忽>S2返回值>0;当S1<0;当s1=s2返回值=0;区分大小写;length(长>S2返回值>0;当S1<0;当s1=s2返回值=0;不区分大小写>S2返回值>0;当S1<0;当s1=s2返回值=0;区分大小写>S2返回值>0;当S1<0;当s1=s2返回值=0;不区分大小写 ttextlinebreakstyle =" {$IFDEF">
━━━━━━━━━━━━━━━━━━━━━
首部 function IsValidIdent(const Ident: string): Boolean; $ [SysUtils.pas
功能 返回字符串Ident是否是正确的标识符
说明 标识符::字母|下划线[字母|下划线|数字]...
参考
例子 CheckBox1.Checked := IsValidIdent(Edit1.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function IntToStr(Value: Integer): string; overload; $ [SysUtils.pas
首部 function IntToStr(Value: Int64): string; overload; $ [SysUtils.pas
功能 返回整数Value转换成字符串
说明 Format('%d', [Value])
参考 function SysUtils.FmtStr
例子 Edit2.Text := IntToStr(SpinEdit1.Value);
━━━━━━━━━━━━━━━━━━━━━
首部 function IntToHex(Value: Integer; Digits: Integer): string; overload;
$[SysUtils.pas
首部 function IntToHex(Value: Int64; Digits: Integer): string; overload;
$[SysUtils.pas
功能 返回整数Value转换成十六进制表现结果;Format('%.*x', [Digits, Value])
说明 参数Digits指定字符最小宽度;最小宽度不足时将用0填充
参考 function SysUtils.FmtStr
例子 Edit2.Text := IntToHex(SpinEdit1.Value, SpinEdit2.Value);
━━━━━━━━━━━━━━━━━━━━━
首部 function StrToInt(const S: string): Integer; $[SysUtils.pas
功能 返回字符串S转换成整数
说明 字符串非整数表达时将引起异常
参考 procedure System.Val
例子 SpinEdit1.Value := StrToInt(Edit1.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function StrToIntDef(const S: string; Default: Integer): Integer;
$[SysUtils.pas
功能 返回字符串S转换成整数
说明 字符串非整数表达时则返回默认值Default
参考 procedure System.Val
例子 SpinEdit1.Value := StrToIntDef(Edit1.Text, 0);
━━━━━━━━━━━━━━━━━━━━━
首部 function TryStrToInt(const S: string; out Value: Integer): Boolean;
$[SysUtils.pas
功能 返回字符串S转换成整数Value是否成功
说明 字符串非整数表达时返回False并且Value将输出为0

nbsp; 参考 procedure System.Val
例子
///////Begin TryStrToInt
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin
CheckBox1.Checked := TryStrToInt(Edit1.Text, I);
SpinEdit1.Value := I;
end;
///////End TryStrToInt
━━━━━━━━━━━━━━━━━━━━━
首部 function StrToInt64(const S: string): Int64; $[SysUtils.pas
功能 返回字符串S转换成六十四位整数
说明 字符串非六十四位整数表达时将引起异常
参考 procedure System.Val
例子 SpinEdit1.Value := StrToInt64(Edit1.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function StrToInt64Def(const S: string; const Default: Int64): Int64;
$[SysUtils.pas
功能 返回字符串S转换成六十四位整数
说明 字符串非六十四位整数表达时则返回默认值Default
参考 procedure System.Val
例子 SpinEdit1.Value := StrToInt64Def(Edit1.Text, 0);
━━━━━━━━━━━━━━━━━━━━━
首部 function TryStrToInt64(const S: string; out Value: Int64): Boolean;
$[SysUtils.pas
功能 返回字符串S转换成六十四位整数Value是否成功
说明 字符串非六十四位整数表达时返回False并且Value将输出为0
参考 procedure System.Val
例子
///////Begin TryStrToInt64
procedure TForm1.Button1Click(Sender: TObject);
var
I: Int64;
begin
CheckBox1.Checked := TryStrToInt64(Edit1.Text, I);
SpinEdit1.Value := I;
end;
///////End TryStrToInt64
━━━━━━━━━━━━━━━━━━━━━
首部 function StrToBool(const S: string): Boolean; $[SysUtils.pas
功能 返回字符串S转换成逻辑值
说明 字符非逻辑表达时将引起异常
参考 function SysUtils.TryStrToBool
例子 CheckBox1.Checked := StrToBool(Edit1.Text);
━━━━━━━━━━━━━━━━━━━━━
首部 function StrToBoolDef(const S: string; const Default: Boolean):
Boolean; $[SysUtils.pas
功能 返回字符串S转换成逻辑值
说明 字符非逻辑表达时则返回默认值Default
参考 function SysUtils.TryStrToBool
例子 CheckBox1.Checked := StrToBoolDef(Edit1.Text, False);
━━━━━━━━━━━━━━━━━━━━━
首部 function TryStrToBool(const S: string; out Value: Boolean): Boolean;
$[SysUtils.pas
功能 返回字符串S转换成逻辑值Value是否成功
说明 [注意]0为假非0为真;不是'True'和'False';Delphi6 Bug 如下修正
参考 function SysUtils.AnsiSameText;var SysUtils.TrueBoolStrs;var
SysUtils.FalseBoolStrs
例子
///////Begin TryStrToBool
procedure TForm1.Button1Click(Sender: TObject);
var
B: Boolean;
begin
SetLength(TrueBoolStrs, 2);
SetLength(FalseBoolStrs, 2);
TrueBoolStrs[0] := 'True';
FalseBoolStrs[0] := 'False';
TrueBoolStrs[1] := 'Yes';
FalseBoolStrs[1] := 'No';
CheckBox1.Checked := TryStrToBool(Edit1.Text, B);
CheckBox2.Checked := B;
end;
///////End TryStrToBool
附加
///////Begin TryStrToBool
function TryStrToBool(const S: string; out Value: Boolean): Boolean;
function CompareWith(const aArray: array of string): Boolean;
var
I: Integer;
begin
Result := False;
for I := Low(aArray) to High(aArray) do
if AnsiSameText(S, aArray[I]) then
begin
Result := True;
Break;
end;
end;
var
LResult: Extended;
begin
Result := TryStrToFloat(S, LResult);
if Result then
Value := LResult <> 0
else
begin
Result := True; //修正处
VerifyBoolStrArray;
if CompareWith(TrueBoolStrs) then
Value := True
else if CompareWith(FalseBoolStrs) then
Value := False
else
Result := False;
end;
end;
///////End TryStrToBool
━━━━━━━━━━━━━━━━━━━━━
首部 function BoolToStr(B: Boolean; UseBoolStrs: Boolean = False): string;
$[SysUtils.pas
功能 返回逻辑值B转换成字符串
说明 BoolToStr(False, False)='0';BoolToStr(False, True)='-1'
参考 var SysUtils.TrueBoolStrs;var SysUtils.FalseBoolStrs
例子 Edit1.Text := BoolToStr(CheckBox1.Checked, CheckBox2.Checked);
━━━━━━━━━━━━━━━━━━━━━
首部 function LoadStr(Ident: Integer): string; $[SysUtils.pas
功能 返回根据标识Ident的字符串资源
说明 字符串资源是指程序的内部资源
参考 function SysUtils.FindStringResource
例子 Edit2.Text := LoadStr(StrToIntDef(Edit1.Text, 0));
━━━━━━━━━━━━━━━━━━━━━
首部 function FmtLoadStr(Ident: Integer; const Args: array of const):
string; $[SysUtils.pas
功能 返回格式化的字符串资源
说明 字符串资源是指程序的内部资源
参考 function SysUtils.FmtStr;function SysUtils.FindStringResource
例子 ;
━━━━━━━━━━━━━━━━━━━━━
首部 function StrLen(const Str: PChar): Cardinal; $[SysUtils.pas
功能 返回指针字符串的长度
说明 当指针字符串Str为nil时将触发异常
参考
例子 SpinEdit2.Value := StrLen(PChar(Edit1.Text));
━━━━━━━━━━━━━━━━━━━━━
首部 function StrEnd(const Str: PChar): PChar; $[SysUtils.pas
功能 返回指针字符串的结尾
说明 当指针字符串Str为nil时将触发异常
参考
例子 Edit2.Text := StrEnd(PChar(Edit1.Text)) - SpinEdit1.Value;
━━━━━━━━━━━━━━━━━━━━━
首部 function StrMove(Dest: PChar; const Source: PChar; Count: Cardinal):
PChar; $[SysUtils.pas
功能 返回将指针字符串Source指定内存数量Count复制覆盖到指针字符串Dest中
说明 Dest没有分配资源将触发异常s
参考 function System.Move
例子
///////Begin StrMove
procedure TForm1.Button1Click(Sender: TObject);
var
vBuffer: PChar;
begin
vBuffer := '0123456789';
StrMove(vBuffer, PChar(Edit1.Text), SpinEdit1.Value);
Edit2.Text := vBuffer;
end;
///////End StrMove
━━━━━━━━━━━━━━━━━━━━━
首部 function StrCopy(Dest: PChar; const Source: PChar): PChar;
$[SysUtils.pas
功能 返回将指针字符串Source复制到指针字符串Dest中; 说明 Dest应已经分配足够的空间非则将触发异常
参考
例子
///////Begin StrCopy
procedure TForm1.Button1Click(Sender: TObject);
var
vBuffer: PChar;
begin
GetMem(vBuffer, Length(Edit1.Text) + 1);
StrCopy(vBuffer, PChar(Edit1.Text));
Edit2.Text := vBuffer;
FreeMem(vBuffer);
end;
///////End StrCopy
━━━━━━━━━━━━━━━━━━━━━
首部 function StrECopy(Dest:PChar; const Source: PChar): PChar;
$[SysUtils.pas
功能 返回将指针字符串Source复制到指针字符串Dest中的结尾
说明 可以连接指针字符串
参考
例子
///////Begin StrECopy
procedure TForm1.Button1Click(Sender: TObject);
var
vBuffer: array[0..255] of Char;
begin
StrECopy(StrECopy(vBuffer, PChar(Edit1.Text)), PChar(Edit2.Text));
Edit3.Text := vBuffer;
end;
///////End StrECopy
━━━━━━━━━━━━━━━━━━━━━
首部 function StrLCopy(Dest: PChar; const Source: PChar; MaxLen: Cardinal):
PChar; $[SysUtils.pas
功能 返回将指针字符串Source指定长度MaxLen复制到指针字符串Dest中
说明 Dest应已经分配足够的空间非则将触发异常
参考
例子
///////Begin StrLCopy
procedure TForm1.Button1Click(Sender: TObject);
var
vBuffer: array[0..255] of Char;
begin
StrLCopy(vBuffer, PChar(Edit1.Text), SpinEdit1.Value);
Edit2.Text := vBuffer;
end;
///////End StrLCopy
━━━━━━━━━━━━━━━━━━━━━
首部 function StrPCopy(Dest: PChar; const Source: string): PChar;
$[SysUtils.pas
功能 返回将指针字符串Source粗频街刚胱址瓺est中
说明 StrLCopy(Dest, PChar(Source), Length(Source))
参考 function SysUtils.StrLCopy
例子
///////Begin StrPCopy
procedure TForm1.Button1Click(Sender: TObject);
var
vBuffer: array[0..255] of Char;
begin
StrPCopy(vBuffer, PChar(Edit1.Text));
Edit2.Text := vBuffer;
end;
///////End StrPCopy
━━━━━━━━━━━━━━━━━━━━━
首部 function StrPLCopy(Dest: PChar; const Source: string; MaxLen:
Cardinal): PChar; $[SysUtils.pas
功能 返回将字符串Source指定长度MaxLen复制到指针字符串Dest中
说明 StrLCopy(Dest, PChar(Source), MaxLen)
参考 function SysUtils.StrLCopy
例子
///////Begin StrPLCopy
procedure TForm1.Button1Click(Sender: TObject);
var
vBuffer: array[0..255] of Char;
begin
StrPLCopy(vBuffer, Edit1.Text, SpinEdit1.Value);
Edit2.Text := vBuffer;
end;
///////End StrPLCopy
━━━━━━━━━━━━━━━━━━━━━
首部 function StrCat(Dest: PChar; const Source: PChar): PChar;
$[SysUtils.pas
功能 返回连接指针字符串Dest和指针字符串Source
说明 StrCopy(StrEnd(Dest), Source)
参考 function SysUntils.StrCopy
例子
///////Begin StrCat
procedure TForm1.Button1Click(Sender: TObject);
var
vBuffer: array[0..255] of Char;
begin
StrPCopy(vBuffer, Edit1.Text);
StrCat(vBuffer, PChar(Edit2.Text));
Edit3.Text := vBuffer;
end;
///////End StrCat
━━━━━━━━━━━━━━━━━━━━━
首部 function StrLCat(Dest: PChar; const Source: PChar; MaxLen: Cardinal):
PChar; $[SysUtils.pas
功能 返回连接指针字符串Dest和指针字符串Source
说明 [注意]MaxLen指定连接后的最大长度不是指针字符串Source的长度
参考
例子
///////Begin StrLCat
procedure TForm1.Button1Click(Sender: TObject);
var
vBuffer: array[0..255] of Char;
begin
StrPCopy(vBuffer, Edit1.Text);
StrLCat(vBuffer, PChar(Edit2.Text), SpinEdit1.Value);
Edit3.Text := vBuffer;
end;
///////End StrLCat
━━━━━━━━━━━━━━━━━━━━━
首部 function StrComp(const Str1, Str2: PChar): Integer; $ [SysUtils.pas
功能 返回比较两个指针字符串
说明 当S1>S2返回值>0;当S1<0;当s1=s2返回值=0;区分大小写;[注意]返回第一个>
例子 SpinEdit1.Value := StrComp(PChar(Edit1.Text), PChar (Edit2.Text));
━━━━━━━━━━━━━━━━━━━━━
首部 function StrIComp(const Str1, Str2: PChar): Integer; $ [SysUtils.pas
功能 返回比较两个指针字符串
说明 当S1>S2返回值>0;当S1<0;当s1=s2返回值=0;不区分大小写;[注意]返回第一>
例子 SpinEdit1.Value := StrIComp(PChar(Edit1.Text), PChar (Edit2.Text));
━━━━━━━━━━━━━━━━━━━━━
首部 function StrLComp(const Str1, Str2: PChar; MaxLen: Cardinal): Integer;
$[SysUtils.pas
功能 返回比较两个指针字符串指定长度
说明 当S1>S2返回值>0;当S1<0;当s1=s2返回值=0;区分大小写;length(长>
例子 SpinEdit1.Value := StrLComp(PChar(Edit1.Text), PChar (Edit2.Text),
SpinEdit2.Value)
━━━━━━━━━━━━━━━━━━━━━
首部 function StrLIComp(const Str1, Str2: PChar; MaxLen: Cardinal): Integer;
$[SysUtils.pas
功能 返回比较两个指针字符串指定长度
说明 当S1>S2返回值>0;当S1<0;当s1=s2返回值=0;不区分大小写;[注意]返回第一>
例子 SpinEdit1.Value := StrLIComp(PChar(Edit1.Text), PChar (Edit2.Text),
SpinEdit2.Value)
━━━━━━━━━━━━━━━━━━━━━
首部 function StrScan(const Str: PChar; Chr: Char): PChar; $ [SysUtils.pas
功能 返回在指针字符串Str搜索字符Chr第一个出现的地址
说明 没有找到则返回空指针
参考
例子 Edit2.Text := StrScan(PChar(Edit1.Text), '*');
━━━━━━━━━━━━━━━━━━━━━
首部 function StrRScan(const Str: PChar; Chr: Char): PChar; $ [SysUtils.pas
功能 返回在指针字符串Str搜索字符Chr最后一个出现的地址
说明 没有找到则返回空指针
参考
例子 Edit2.Text := StrRScan(PChar(Edit1.Text), '*');
━━━━━━━━━━━━━━━━━━━━━
首部 function StrPos(const Str1, Str2: PChar): PChar; $[SysUtils.pas
功能 返回指针字符串Str2在Str1中第一个出现的地址
说明 没有找到则返回空指针;StrPos('12345', '3') = '345'
参考
例子 Edit3.Text := StrPos(PChar(Edit1.Text), PChar(Edit2.Text))

2008年5月2日 星期五

右邊的音樂搜尋

其實有點練功的成分,還好現在沒幾個人,人多的話就得收起來啦...^^||

輸入歌名後按Go就行勒,找不找得到只有看運氣啦,輸入的歌名越完整,找到的機率就越高,歌名越短的就越不容易找到,就算找到也不一定正確,總之......好玩嘛

2008年4月27日 星期日

想寫一個MSN新工具

MSN雖然有刪除、封鎖的功能,但不知道大家有沒有那種經驗,想刪掉總是讓你心情不好的某人,又有點捨不得,日後若是要加回來,對方又會知道你把他刪了。
所以想寫個-----假刪除。
被加入假刪除的人,不會真的被刪除,但會被歸類在未上線,這樣,你可以阻止自己去找他,高興的時候再幫他復原,也不會讓他發現。

不保證寫得出來......如果能寫出來,就掛在Himimi上吧....

那一夜、與永恆擦身而過(後記)

這是我第一次寫短篇故事,在許多轉折處表達的並不好(書讀太少...汗顏中),不過寫一篇吸血鬼的故事,一直是我想要做的,卻從來沒開始過.....現在總算是完成了(好壞不管勒...)....^^||

文中的血宴論壇,是真的有這個論壇
http://blooddestiny.dz.forumable.net/tc/index.php

在看完電影--一路玩到掛---之後,忽然覺得,該做的就別去猶豫....下次,我想做什麼呢?

買一台鋼琴來彈吧....

那一夜、與永恆擦身而過(上)

這一晚,又把夜訪吸血鬼(布萊得彼特與湯姆克魯斯主演)拿出來從頭練過一遍,也不知道是第幾遍看這部電影,吳橋總是醉心於吸血鬼的高雅與殘忍,他喜歡在天氣好的時候看這部電影,然後走下樓,在月色前,讓自己浸沈於影片中的神秘氣氛。

只是今晚天空飄起了細雨,他只好打消了下樓散步的念頭,改坐在電腦前瀏覽網路,30歲的吳橋,是一個路邊隨便撿都一大把的Java工程師,有一個美麗又安全的妻子(吳橋真的會看到這篇文章),還有一個可愛到不行的女兒,雖然一切看起來都是如此平凡,但每個人,都有讓自己不平凡的獨特方式,吳橋的方是就是吸血鬼,他不單是吸血鬼迷,同時對吸血鬼的歷史、傳說、甚至輩份階級都瞭若指掌。

除了工作外,他最愛的就是在網路上收集吸血鬼的相關資訊,對於那些醜化吸血鬼的影片、文章,他都深感厭惡,那些導演製片難道都是白癡嗎?
當一個吸血鬼累積了數百、上千年的智慧,還會跟恐怖片裡沒大腦僵屍一樣到處亂咬亂吸?
難道吸血鬼就不會用吸管或易開罐?
況且現在愛滋病猖狂,在吸之前總得驗一下吧?

什麼?吸血鬼不怕愛滋?
如果你這麼跟他說,他一定回答你:病死豬也吃不死人,你吃不吃?
只要一看到這種影片,他必定在自己的部落格裡大肆攻擊,從導演到演員,每個都變成了智障。


這一晚,在Google裡尋了幾個網站,都是自己早就瀏覽過的老八股,了無新意,正準備關機睡覺時,卻看到了一個不顯眼的連結-----血宴論壇-只有真正相信吸血鬼的人才準進入

這個標題引起了他的好奇心,雖然在國外早有很多吸血鬼相關資訊的論壇,但在繁體中文上倒是第一次見到,吳橋立刻連上了論壇,整個網站的用色非常講究,採用黑色與暗紅色的搭配,將吸血鬼一貫冷酷高雅的氣質表達無遺,論壇的內容亦相當豐富,吳橋當下就決定加入會員,看看論壇內有哪些自己沒看過的文章。

這個論壇必須站長親自審視方可加入,一般來說論壇都是巴不得會員越多越好,也多採自動認證的方式,像這樣站長親審的機制並不多見,也讓這論壇增加些許神秘氣息。

在註冊時,除了一般資訊外,還多了一個欄位---註冊原因,於是吳橋打了一篇自己如何喜歡,如何瞭解吸血鬼的短文,按下註冊後心滿意足的關機睡覺。

接下來的幾天,他每晚都在電腦前,希望能收到站長認證通過的Email,但始終沒有音訊,讓吳橋有些失望,不知自己為何無法通過認證,無奈論壇又沒有任何聯絡站長的方式,他只能望著許多自己沒看過的文章標題嘆氣。

又過了幾天,他終於收到了認證的信件,非常興奮的連上了論壇,進入後吳橋自然去找尋他想看的文章,一般來說第一次登入論壇,都會有歡迎的短訊,吳橋從不會去理會,但這個論壇的短訊內容很奇特

-----新進會員請看-不看後果自負-----

吳橋心裡犯滴估,認證慢還得被恐嚇,但他還是點了短訊,以免辛苦等來的帳號被砍掉,短訊內容如下:

新進會員需於 2008/xx/xx 日 19:30 至指定地點參加論壇聚會,凡不到者皆取消其會員資格
地址:XXXXXXXXXXXXXXXXXXXXXXXX

不會吧!!!還有這種事?吳橋瞪大了眼睛不敢相信,再看聚會地址,離自己公司倒是蠻近的,時間也剛好,於是鬆了一口氣,但心裡仍罵...太不合理了,萬一我住美國怎麼辦?


不管了,先看看文章好不好再說,吳橋隨便點了一個標題進入,沒想到僅一篇文章就看到天亮,接下來幾天他都沈迷於論壇內的文章,對站長這號人物也就越加好奇,雖然有許多文章是早已看過,但顯然經過高人潤筆,讀起來更加生動,吳橋已決定要參加這個聚會。


這一天陰雨綿綿,果然是個吸血鬼集會的好日子,吳橋好不容易挨到下班,看看時間還有一個半鐘頭,也不知道聚會有沒有提供食物,他是一個耐不住餓的人,於是先到公司附近飽餐一頓,到達聚會地點時,比約定時間尚早了半個鐘頭。


聚會地點是在一棟商業大樓的11樓,吳橋心想,總會有人早到,跟先到的人聊聊天也不錯,逕自上了11樓,電梯一打開就看到了標示著血宴論壇聚會區的告示牌,循著告示牌他來到一扇透明自動門前,門內的電燈並沒有打開,但確有光亮透出,似乎是蠟燭的光亮。

吳橋心想,這倒是挺有氣氛的,大家要輪流說吸血鬼的故事嗎?
進入自動門後,映入眼簾的是一個非常古典的房間,地上鋪著有暗紅色的地毯,兩旁放了不少白蠟燭,而牆壁上則許許多多吸血鬼的肖像,好在房間多了一個喝酒的吧台,地板上也沒有畫六茫星,不然吳橋還真以為要參加的是惡魔召喚儀式。

整個房間只有一個女子坐在吧台前,她背對著吳橋,由於地上鋪滿了長毛地毯,女子似乎沒有發現他的到來,吳橋有些尷尬,他並不善於跟女性攀談,但此刻房間內只有兩個人,不說話似乎有些奇怪,於是乾咳了一聲。

女孩回過頭來,剎那間吳橋彷彿有種靈魂被吸走的感覺,在這個美女滿天飛的時代,看到再美的女人,也不至於有此反應。

這女子有著一頭似金色又似銀色的長髮,搭配著無懈可擊的輪廓,而她的肌膚似乎散發著某種光澤,只有在不實化妝品廣告中才看得到,然而這些都不是主要的原因,那一對紅色的瞳孔,竟讓他一時間無法動彈,甚至喪失思考的本能,就像是坐雲霄飛車的那一剎那,只覺胸中空無一物。

女子微微一笑說:『我們來早了,他們還沒到呢。』

吳橋勉力的點點頭,用盡全力讓自己恢復正常,女子從吧台上方拿下一個高腳杯,倒了一杯紅酒

『喝一點吧,你看起來有點緊張呢,吸血鬼有那麼可怕嗎?』女子將紅酒遞給吳橋。

吳橋一口氣喝了大半杯,說也奇怪,喝完酒再看那女子時,雖仍覺得她美得太過異常,卻已沒有了第一眼時的震撼。
這時吳橋才真正的打量眼前的女子,儘管他知道時下的年輕人常戴上有色的隱形眼鏡,但這樣的血紅色實在非常少見,不但沒有任何突兀感,反而覺得她天生就該是紅色的瞳孔,而所披的白色長袍,雖然像是戲服,卻更將她與生俱來的古典氣質表露無遺,活像是中世紀圖畫裡走出的人物。

女子繞富興致的看著他:『我叫 Dario.Dansel.Substantia,中文是 達莉兒.登賽爾.莎伯史坦蒂雅,你可以叫我達莉兒。』

吳橋點點頭,對於這樣神話般外型的人物,擁有一個沈長的名字,真是相襯至極。
(美女永遠無須為自己作任何解釋,這些事男人都會自動辦好)

『我叫吳橋.....妳...也是來參加血宴的聚會嗎... 』這一句還沒問完,吳橋就在心裡大罵自己蠢蛋,她若不是來參加聚會,難不成會是站長請來的調酒小妹。

達莉兒不可至否的啜了一口紅酒:『既然他們人都還沒到,不如...我們來玩一個遊戲..』

吳橋仍處於茫茫然的狀態,達莉兒的每個動作,似乎都經過了精雕玉啄,無不恰到好處,這一刻吳橋似乎連眨眼都捨不得。

達莉兒見他沒說話,又繼續說:『遊戲規則很簡單,既然聚會的主題是吸血鬼,那麼,我就以一個吸血鬼的身份與你對話,好嗎?』

吳橋點點頭,心裡想的,卻又是另一件事,如果他老婆看到這一幕(蠟燭、紅酒、加上一個美到爆的女人),不知作何感想,想到這裡忽然覺得好笑,老婆肯定不會誤會,等級差太多了....,不由得自形慚穢,後悔今天沒穿好看一點。


『那就由我先開始吧...』達莉兒微微一笑,眼神露出一絲感慨:『我...幾天前剛睡醒,這一覺睡得並不是很好,只睡了七十年,你是我睡醒後第一個接觸的人類,這世界變化好大啊,人類真是越來越聰明了。』


雖然只是遊戲,但吳橋的心裡還是震撼莫名,一般人在說這種鬼話的時候,多少會有些不自在,沒經驗的恐怕還會笑場,而她卻說得如此自然,若不是經過專業的演技訓練是很難辦到的,除非她說的是實話。
吳橋當然相信她有可能是演員,只是覺得奇怪,這種好萊塢都找不到的美女怎麼可能不出名。

對吸血鬼的認識,吳橋是很有自信的,於是接口說道:『妳受了傷嗎?據我所知吸血鬼在受傷後,需要較長的睡眠,如果提早醒來,傷勢無法痊癒的,可是...』。

達莉兒揚起眉毛,似乎對他的"專業疑問"感到興趣,吳橋剎那間有種飄上雲端的感覺,能讓這種美女對自己的話感興趣,當真是不枉此生啊,他接著又說:『一般來說,即使受了很重的傷,依吸血鬼的復原本能,也沒有理由沈睡十年以上,妳卻說妳睡了七十年...我倒沒聽過有貪睡的吸血鬼』。

達莉兒迷死人不賠命的笑了,吳橋卻沒有看到,因為他想起一件重要的事情:『即使是活上三百年的吸血鬼,也不可能連續五十年不吸人血,更沒有如此長眠的需求,除非是...』。


吳橋抬起頭來看著她:『除非妳是 Methuselah!』。

Methuselah(麥修撒拉)在吸血鬼中已屬於半神狀態,歲數通常在一千到二千歲之間,他們只需數百年飲一次血,即可永恆不朽的存活下去,但在一千歲後會面臨精神崩潰的危機,所以睡眠的需求會大大增加,以中和情感上的負荷。
Methuselah大多獨居,遠離人類與吸血鬼之間的鬥爭,他們對人類是友善的,但這種友善並非站在對等地位,就像人類對可愛的小狗特別親切一樣。
反而是對同族的吸血鬼感到厭惡,他們認為新的吸血鬼只會仗著自己的異能來享受人類進步的果實,而不思進取,所以大多數吸血鬼也不敢招惹Methuselah,隨著歲月的逝去,Methuselah是否仍存在地球上,也無從考證。


達莉兒眼中散發出讚賞的光芒,但她並沒有回答吳橋的疑問,然而吳橋卻一點都不覺得她是回答不出來,反而覺得她好似胸有成竹,那種淡然的表情實在太具說服力了。

『我剛剛才睡醒,力量太強盛,所以你第一眼見到我時,帶給你精神上的壓力,真對不起,後來我收斂了一些,希望沒有讓你不舒服...』。達莉兒露出歉意的微笑。

吳橋忽然升起了一個---這好像是真話的念頭,但隨即又覺得荒唐,這女人一定是看到自己剛才的窘態,才抓住機會,想讓自己信以為真,等一下聚會開始時再拿出來取笑,想到這裡,不由得激起了一股男子氣慨。

『雖說在中世紀吸血鬼幾乎是所向無敵,但以現在來說可就不一定了,如果一顆核彈飛進吸血鬼的老窩,這種分子等級的破壞,恐怕是睡再久也是補不回來的』。

一向以來吳橋都是替吸血鬼說話的,像這樣站在人類這一方還是第一次,連自己都覺得奇怪,好像真的把她當作吸血鬼了。

沒想到這段話卻引起了達莉兒的興趣,頻頻向他詢問關於核彈的知識。

吳橋微感訝異,達莉兒似乎從未聽過核子彈這種連小學生都知道的東西,他一邊用自己有限的核彈知識回答,一邊想著.....她說...睡了七十年.....七十年前....

看著達莉兒認真的神情,他開始有點相信她真的沒有聽過核子彈,甚至不知道愛因斯坦,吳橋心中的驚駭慢慢的擴大,她說第一眼看到我,沒有控制力量,而我喝過紅酒後,真的是感覺輕鬆不少.......『不!不可能....』吳橋在心裡抗拒著,這女人一定受過演員訓練。

這時達莉兒陷入了沈思,眼中閃動著紅色的光芒,吳橋征征的看著她,甚至不敢移動。

過了好半響,她才發出了一聲嘆息,喃喃說道:『說不定,最後還是人類幫了我....』。


她拿起酒瓶,替自己與吳橋斟上紅酒,緩緩的說道:『我原是不願接觸人類的,這或許就是悉達多所說的緣法吧,他是我最喜歡的人類,我遇到他時,他還只是個孩子...』達莉兒緩緩說著,眼神變得迷濛起來,吳橋則是瞪大了眼,他雖然近視卻沒有色盲,他看到達莉兒的瞳孔顏色正在改變。

吳橋告訴自己,這一定是蠟燭晃動造成的效果,現在的隱形眼鏡做得太好了,但心中卻是隱隱覺得不對。


達莉兒回過神來,笑著說:『我又想到他了,每次想到他都會出神...』

『多謝你告訴我這些,否則我恐怕要很久以後才會知道,我也告訴你我的事吧,就當作回報。』

她歪著頭想了一下:『實際的歲數我真的記不得了,究竟是三千,還是四千多歲,總之,吸血鬼裡沒有比我更老的了』。

吳橋瞪大了眼,脫口而出:『Antediluvian!』。

達莉兒點點頭:『沒想到這個名字流傳了下來,我很久沒有聽到過了...說說你對Antediluvian的認識吧..』。


Antediluvian 屬於神話時代的吸血鬼,連吸血鬼都認為是神話的一種存在,在許多吸血鬼的祭拜儀式中,已將Antediluvian當作是神而非同類, Antediluvian也是最古老的吸血鬼,傳說他們擁有毀滅天使的力量,同時憑藉著無比的智慧,突破了吸血鬼的禁制,可以在陽光下行動,也不需要依靠人血或是睡眠,可說是人類最嚮往的一種自由與永恆的存在,與Methuselah不同,Antediluvian由於力量太過強大,除非他們自己願意,否則沒有人類或是吸血鬼能探知他們的行蹤,所以Antediluvian並不會選擇避世,而是隱居在人類或吸血鬼之中,由於地位太過超然,已沒有人會去探究 Antediluvian是否是真實的,而只是當作神祇一般的膜拜。

2008年4月26日 星期六

那一夜、與永恆擦身而過(下)

吳橋一邊描述 Antediluvian,心裡一邊想,真是厲害的女人,竟然會選 Antediluvian ,這樣就很難在言語上拆穿她,關於Antediluvian的記述,幾乎都是屬於神話故事,在西洋傳說中,甚至牽扯到了路西法、加百列等巨大神靈,不像近代吸血鬼那般的有跡可考。

待吳橋說完,達莉兒拍手笑道:『真是精彩呢,有些連我都沒聽說過,真希望事實也是這麼精彩,吸血鬼就是缺乏了人類的想像力...』。


『那麼真實情況又是如何呢?』吳橋的語氣略帶挑釁。

『恐怕會讓你失望了,你所說的神我從沒見過,不過有一點倒是說對了,透過精神上的修練,我在一千多歲後就不再懼怕陽光,這都是悉達多給的啟示...』 。

她雙眼看著吳橋,但吳橋並不覺得她是在看自己,而是穿透自己,看到非常遙遠的過去。

『很久以前,我有一個伴侶...剛開始的時候,我們非常相愛,就這樣幾百年過去了,慢慢的...我們開始互相憎恨,為了殺死對方,我們積極的培育自己的勢力,製造了你們所說的 Methuselah,而他們又製造了更多的吸血鬼..』。

吳橋點點頭,在吸血鬼文化中,本來就存在著千年聖戰的傳說,卻不知原來是情侶翻臉。

達莉兒接著說道:『我與他經歷了無數次的戰爭,始終都無法殺死對方,那時候,殺遍了全世界,死了很多的人類,也死了很多吸血鬼,後來,在印度...我遇到了悉達多』。

悉達多是誰?,吳橋努力的思索,達莉兒卻好像看透了他,說道:『後來的人都稱他為釋迦摩尼,但他原本的名字也是廣為流傳的』。

吳橋乾咳了兩聲,不知是因為達莉兒扯得太離譜,或是為自己的無知掩飾。

達莉兒沒理會他,自顧地說著:『人類是很脆弱的生物,對人類,我們根本不需動手,只要讓人類見到自己最深的恐懼,就會發狂而死..比殺死一隻螞蟻還要容易.....只有悉達多例外』。

吳橋心想:『開什麼玩笑,佛祖耶,怎會怕吸血鬼..』

『人類中也有些精神力很強的人可以略微抵抗,但悉達多不一樣,他似乎是完全感受不到我的力量,那一天...我還記得,他一個人走到我的面前,他說:『我有些問題還沒有想通,如果妳想殺我,可以等到我想通之後嗎?』,我問他:『是什麼樣的問題?』,他笑了:『我也不知道是什麼問題,但這些問題一直在等我』。於是我答應了他,不但如此,我還保護他避免陷入王室爭奪的危機內』。

吳橋心想:『這倒是挺有趣的,吸血鬼保護佛祖....』

達莉兒頓了一下,又繼續說道:『我的伴侶,在知道我保護一個人類之後,非常的氣憤,誓言要殺死這個人類,於是,在悉達多身邊,常發生人類想像之外的戰爭,悉達多的弟子們受到戰爭的影響,常見到怪物,神明等等幻象,這些幻象後來就變成了佛教裡的鬼神』。

吳橋心裡不由得想:『這種說法倒是蠻合邏輯的,催眠大師或是有特異功能的人,都能讓普通人產生幻覺。』吳橋心裡越來越發毛,一個即興的遊戲,她怎能想出這些情節。

『在幾次戰鬥後,我的伴侶也察覺了悉達多的奇特,慢慢的,我們對悉達多的興趣,比殺死對方來得更濃厚,戰爭也就停止了,我們讓悉達多在一棵菩提樹下思考他的問題,後來的情節,與佛經內所記述的就沒有太大差異』。

達莉兒眼中露出了非常溫暖的光芒:
『他從菩提樹下站起來的那天,伸出雙手撫摸我們的臉,那是世上最溫暖的手了,就在那一刻,我什麼都明白了,而我的伴侶也是,我們本來就可以不需要言語來溝通,但他想訴說的事,連力量強大如我們,都無法全部瞭解,更別說是人類的文字,我們同時對悉達多說:『讓我們陪伴著你吧,你將擁有無限的時間來訴說這個答案』』

說到這裡,達莉兒的紅色瞳孔變得黯淡,吳橋心裡湧出一股辛酸,莫名其妙的陪著傷心。

『其實,我們都知道悉達多的答案,這樣問反而讓他失望了.....後來,我們一直守護著他,直到他離開世間,這其間,我們不斷削弱吸血鬼的力量,讓他們不能再對人類為所欲為,到現在,你們所說的Methuselah,已經完全不存在了』。

她顯得更加的哀傷:『當時,我們為了殺死對方,在製造Methuselah時,充滿了太多負面的情緒,導致他們在一千歲之後,心理上產生無法負荷的變化,嚴重的還會影響到外表,而由他們所製造的吸血鬼,也是邪惡的居多。』

吳橋點點頭,心想:『原來吸血鬼邪惡的形象是由此而來...可是Methuselah這麼強大的吸血鬼怎麼會消失...』。


『難道,你們殺了所有的Methuselah ?』吳橋大感意外,要知道吸血鬼雖然是依靠吸血作為途徑,但其間的情感跟人類的父母與小孩或是情人是相同的。

達莉兒緩緩搖頭:『我們雖然想幫助他們度過難關,但仍然沒有任何 Methuselah 能存活下來,有伴侶的可以互相毀滅,沒有的...就會透過儀式召喚我們,由我們來了結』。

吳橋感到不寒而慄,試想自己的孩子苦苦哀求自己殺了他,那會是怎樣的感受...

達莉兒不再說話,只是凝望著手中的酒杯,吳橋不忍見她傷心,於是問道:『那妳的伴侶呢?他應該會一直陪著妳吧』


『他也在兩百年前死了,是我親手毀滅他的...』說到這裡,達莉兒露出微笑,彷彿這是一件喜事,瞳孔也慢慢恢復成鮮紅色,吳橋心中驚異莫名,漸漸忘記遊戲這回事。

她看出吳橋的驚愕,說道:『我們的狀況跟Methuselah是不一樣的..完全不一樣...』她思索著該如何用言語表達,好在吳橋也不是太蠢,他試探性的問:『妳是指,像是佛家所說的入滅嗎?』

入滅意指超脫一切生死輪迴,雖然在物理上都屬死亡,但其精神意義卻是大不相同,吳橋知道那種感覺完全是兩回事。

達莉兒露出讚賞的眼神:『我越來越喜歡你了...』,吳橋從臉紅到腳指頭,竟不敢再看她。

『我們並不會像Methuselah一樣陷入瘋狂的情感中,尤其是經過悉達多之後.....但是,我們仍受不了那日復一日的折磨..』。

『日復一日的折磨...』...吳橋細細的品味這句話,人類是絕對無法感受到這種折磨,但他可以想像得到,日復一日是怎麼一回事。

『原本,我們應該是可以互相讓對方得到解脫,但不幸的,他在離開前,力量已經減弱,只能讓我受到重傷,卻殺不死我了,現在還存在的吸血鬼若要自毀,還有許多方法,可我卻沒有辦法了,我曾試過很多種方法.....唉....你不會想聽的..』

達莉兒的苦笑,包含了數千年的淒涼與無奈,一個連死都辦不到的,算是"神"嗎?

『所以.....妳...對核彈感興趣,是希望....核彈能幫妳解脫嗎?』 吳橋的聲音有點顫抖

達莉兒想到人類所發展的毀滅性武器,顯然很開心,點點頭,俏皮的說:『聽你說起來好像很厲害,可以試試看,我救過的人類可比殺過的多太多了,希望善有善報...你會為我祈禱吧? 如果核彈也沒用,我只好繼續做貪睡的吸血鬼了...』 說著嘟起了嘴唇。

達莉兒可能幾千年沒裝過可愛了,忽然來這麼一下,卻不是任何男人能抗拒得了的

『我一定幫妳,叫我作什麼都行!』吳橋熱血上湧,脫口而出,雖然他不知道自己能幫什麼,但這一刻達莉兒好像是個遇難的小女人,而他吳橋則是路見不平的大俠。

達莉兒拖著腮子凝視他,似笑非笑,眼中散發出奇異的光芒,吳橋不好意思的低下頭:『我...可能沒什麼用處,可是,只要我能幫忙的...我...』

話還沒說完,達莉兒來到他身前一步之處,吳橋感到自己的心臟彷彿要跳出來,達莉兒溫柔的望著他:『那.....你願意陪著我嗎?』。

吳橋腦中嗡嗡作響,此刻就算心臟真的跳出來他也不會覺得奇怪,達莉兒又更靠近了他一些:『你是由現在的我....嗯,你知道的.....不會像以前的Methuselah一樣...』。

吳橋當然知道,她連"製造"這個字眼都不願用,自己若成了吸血鬼,地位自然大不相同。
吸血鬼的能力是越傳越弱的,他若是直接由達莉兒而成為吸血鬼,那他將成為達莉兒以外,世上最強大的存在,況且達莉兒此時不再有負面的情緒,也代表他不會像Methuselah一樣感情崩潰。

『只會痛一下,很快的.....我們會永遠在一起....』達莉兒的頭慢慢的移向吳橋的脖子,吳橋全身僵硬,心中混亂到極點,達莉兒緩緩的張嘴,原本的虎牙已然變長,吳橋感受到一陣炙熱的氣息,達莉兒猶如一團火球般包圍著他,他知道這是吸血鬼準備吸血的前奏,熱氣將會加速對方血液的流動。


就在咬下的那一刻,吳橋不知哪裡來的力氣,從嘴裡併出了一個"不"字,聲音小到連自己都聽不清,但他確實說了。

剎那間熱氣消失,吳橋只覺得天旋地轉,整個人跌坐在地,在暈眩中,他看到達莉兒發亮的紅色瞳孔與悲傷的微笑。


此時四周的燈忽然全部被打開。


『Suprise!!!,老同學,果然厲害,哈哈哈』 吳橋耳邊傳來一陣耳熟的笑聲,但他仍是頭昏腦脹,聽不出是誰。
『老公!你還好吧?』他的妻子在旁關切的詢問,不知何時身旁已圍了一群人。

吳橋扶正眼鏡後,看到拿著DV的那個人,是他大學同學兼損友林高,兩人都是吸血鬼迷,大學時期本要成立吸血鬼研習社,但因乏人問津而作罷,後來林高去了英國,兩人之間的互動才慢慢變少。

『安娜,妳的演技實在太差了,撐不到五分鐘....』林高對著其中一個金髮女子說。

這是整人遊戲嗎?可是.....吳橋心裡一片混亂,他緩緩站起身來。

林高遞了一杯紅酒給他,也將整件事的來龍去脈告訴他

『血宴論壇其實還沒對外開放,裡面的會員都是我朋友,可能是Google的爬蟲太厲害了(搜尋引擎用的工具),還是被你找到..』說著拍拍他肩膀:『我一看這暱稱就知道是你,於是跟妳老婆商量了這個整人遊戲,你老婆倒是對你很有信心,哈哈』。

吳橋一邊聽他說,一邊往扮演達莉兒的女子看去,正巧這女子剛好回過頭來,他知道,這女子不會是達莉兒,他搶過林高手中的DV問道:『剛剛過程你都拍下來了?』。

林高點點頭:『是啊!剛剛安娜撐不到五分鐘就破功了,你...不是早看穿了嗎?』。看到吳橋的表情,林高不禁一陣錯愕。

吳橋將DV從頭看一次,果然跟林高說的一樣,自己在DV裡早就拆穿了這個遊戲,甚至跟那金髮女子大開玩笑,整個過程不過五分鐘而已,但他的記憶卻完全不是這回事。

吳橋只覺得胃裡一陣翻攪,同時頭痛欲裂,勉強說了一句:『我去洗手間...』。跌跌撞撞的往門外走出。


雖然是商業大樓,但在一樓處有一個不算小的中庭花園,吳橋走到此處,再也忍不住的跪倒在地,想吐卻又吐不出來,心裡湧出一股打自他出生以來從未感受過的傷心,那種傷痛的感覺彷彿要將他整個人撕裂,他只能竭力的嘶吼吶喊,雙眼因過渡流淚而產生劇痛,就這樣持續了十分鐘,情緒才漸漸平復下來。

他知道這是達莉兒給他的一點"小小懲罰",就在吳橋看她最後一眼時,她將自己的悲傷分了一點給吳橋,只這麼一點,已教他無法承受。

吳橋擦掉眼淚,眼睛已經紅腫起來。

『老公....你怎麼了?你還好吧?哪裡不舒服?』吳橋的妻子在旁關切的問,好在她是剛剛才到,否則一定以為吳橋得了失心瘋。

吳橋哭得有點脫力,坐在木椅上:『我沒事,只是剛剛胃有點痛..』。

他看著滿臉關切的妻子,忽然明白自己為什麼會說出"不"這個字,在那混亂的一瞬間,浮現在腦中的就是妻子與女兒的笑臉。



DV中的畫面,自然是達莉兒的手筆,雖然她對吳橋的拒絕有點不滿,但同時也欣賞他的專情,於是在心情上略施懲罰,而DV的畫面卻算是獎賞了。

雨停了,露出了滿天星星,達莉兒去哪裡了呢?她的核彈計畫會成功嗎?

吳橋望著星空,他這一輩子都會記得,那一夜、與永恆擦身而過。

音樂進化論

人類需要音樂是天性,數千年前如此,數千年後依就是如此,但很快的(個人預計10年),當壓縮技術更加進步(一首不失真音樂50K時),唱片公司、音樂通路將消失殆盡。

歌手、音樂創作人、演奏家卻不會消失,而是被各大企業收購用以製造更多商機,而非販售目前廉價到不行的CD(那時恐怕也沒有CD了)。

所有的音樂、創作等等都將變成免費,歌手、創作人所競爭的是下載率、廣告效率,假設一天有五十萬人到IBM的網站下載孫豔姿的歌,那麼IBM能多賣幾台電腦呢?

也藉由下載率,廣告效應來決定歌手、創作人的年薪待遇,如果屆時CD仍能存活,反而會更加精緻的包裝成收藏品(就像以前的黑膠唱片一樣),會有收藏玩家購買。

下載音樂跟談戀愛一樣,越禁越愛,當所有的音樂都是免費時,所謂的音樂P2P,盜版(目前這麼稱呼),都將沒有意義,反而會消失,但音樂人的壓力不減,只是從唱片銷售量,變成了下載率、收聽率(目前跑得最快的就是iTune),到時說不定還要請個人網站多多放歌。

常聽到某某某的唱片賣幾萬張或幾十萬張,這些效益在往後雖然沒有實體數字,但為所有大企業帶來的商機是難以估計的,如果賣汽車零件的小公司,卻推出了成功的歌手,進而帶來龐大的利益,誰說不可能呢?

無論如何,產業一直進化,淘汰是無可避免的,目前傳統的音樂唱片,早已進入淘汰階段,而當初從這裡海撈一票的公司卻是捨不得放手,到處找人開刀,展現死亡前的憤怒。


而IFPI看準了這一點,大賺唱片業的錢(老婆批腿,憤怒的老公會計較花多少錢給徵信嗎?),
IFPI左手收錢,右手隨便找個學生開刀,算是跟付錢的人有個交代,去看看IFPI的網站,連個留言版都不敢放...

說到告KURO,若不是KURO廣告打得太凶,多半跟EZPeer一樣會勝訴,科技
中立嘛,法官的NB裡搞不好就一堆MP3IFPI就像是投機客一樣,近年來卡奴越來越多,就出現了專門"救"卡奴的協調律師,這些沒道德的律師,不就是想再從卡奴身上炸出油來嗎?

唱片業也是一樣,被科技打得像豬頭,無助的向投機客求助,卻不去想真正的活路在哪裡,鴕鳥與到賊,活該毛被拔光。

剛剛說到,創作人、歌手、演奏家等都將被大企業收購,或許有人會問,若是開個網站,放上從IBM下載的歌呢?

這是個有趣的問題,但又完全不是問題,除非你自認頻寬比IBM提供的來得快,來得穩,否則也是乏人問津,當你有一台iPod時,還會去看那些台幣一兩千的土製MP3播放器嗎?

IBM是iPod,而你的網站就是土製的,就像Google從來不怕別人在網站裡坎入他的搜尋引擎。

相信唱片業,很快就會意識到,該死的絕對跑不掉,死前還要被IFPI狂噱,落個又臭又蠢的名聲。

可能有人會這麼問,既然唱片會落得如此下場、那電影、軟體呢?

電影還是有天生的保護膜、不是誰都願意用電腦螢幕來看,十年後,還是有人喜歡帶著爆米花進戲院,至於軟體的話,各位以為這些科技發源中樞,會任序號、破解器滿天飛嗎?

軟體公司要的是佔有率,沒有破解版的軟體,相當於沒有佔有率(這裡指的是一般人用的軟體),而軟體業最大的營收來自於B2B,而非一般大眾,當一般大眾使用某種軟體習慣(如Word),是否也意味著,這個人所上班的公司,"必須購買Word",而且一次就是一大筆錢。


IFPI抓了一個學生,還有千千萬萬個學生,自以為可以殺雞儆猴,但卻不知惹惱了多少學生瘋狂的散播音樂,原本不會散播的也加入行列,說不定日後哪個天才學生,將5MB的MP3壓到變50K,就是被IFPI惹火的。


唱片業拼命的叫苦叫屈,一片賣四百他們也不願意啊,廣告、通路費那麼貴,但只能說他們命不好,用了DVD、CD這種大家都知道一片多少錢的東西。

一輛五十萬的車,請問引擎多少錢?擋風玻璃多少錢?大概不會有人真的這樣來替車估價,所謂江湖法術,說出來就不值錢了,錄音室滿天飛,製作唱片的門檻並不高,多數成本都花費在行銷上,但這些成本對大企業來說,其實是可以中和掉的,誰說以後不會有(新車發表會...來就送蔡依琳新專輯)註.是給喜歡實體CD的人,即使在車的售價上,加上了這些行銷成本,用戶其實也感覺不出來。

而唱片公司發表會,賣的是成本5塊的CD(加印刷算15好了),就算通路、廣告費用再怎麼高,購買端看到的,得到的,永遠都是15塊的東西,卻要花400大洋去付其他看不見的費用。

不符合人性需求的事物,終將被淘汰,在死前還要不甘心的到處亂咬的話,那跟做困獸之鬥的畜生就沒什麼兩樣了,何苦呢?只是便宜了旁邊的狐狸

帶頭去查的員警,心裡說不定在想,自己也常聽別人燒的MP3、說不定自己也有下載,只是沒那麼倒楣被野狗咬到。

人性所認同的事,最後就會變成正義,我相信,大多數人都認同音樂要免費,也認同歌手、創作人要得到合理的待遇,所以呢? 遲早會有符合人性的方式出現

只是在此之前,別被野狗咬了

打完了.........................................舒服多了

2008年4月21日 星期一

迷戀吸血鬼

我隱身於陰暗的角落裡,注視著你,我愛你,或者說我更愛你脖子上那爆起的青筋。要上一口,你的新鮮血液溫暖著我冰冷的身體,或許會痛一下,但我們會永遠在一起........健康和美麗與你同在....

嚴格來說,這是我第一個自己編輯的部落格,雖然小辣椒以前幫我做過一個,但總覺得Yahoo的部落格少了一點Feel....果然Google才是王道啊....

儘管我迷戀吸血鬼,但這部落格不是為這個主題而設的,只是在這樣的氣氛下,更有心情寫些東西吧.....^^