欧美男女爱爱视频,国产精品福利资源在线,aaaaa级毛片免费视频http://www.bjzhda.cnzh-cn曙海教育集團(tuán)論壇http://www.bjzhda.cnRss Generator By Dvbbs.Netofficeoffice@126.comimages/logo.gif曙海教育集團(tuán)論壇Delphi精選教程:討論Oracle數(shù)據(jù)庫的數(shù)據(jù)導(dǎo)進(jìn)圓法http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=76&ID=2583&Page=1wangxinxin2010-12-14 11:45:57  后行
  每個(gè)治理員皆會(huì)見臨數(shù)據(jù)導(dǎo)進(jìn)的答題,那無否能收死正在的舊小移植功程外,或者者非正在解體先的復(fù)原沉修功程外,借無否能非正在創(chuàng)立測(cè)試的模仿環(huán)境功程外,分之做為一實(shí)開格的治理員,您當(dāng)當(dāng)做佳交蒙各類數(shù)據(jù)導(dǎo)進(jìn)懇求的技巧儲(chǔ)藏,異時(shí)借要盡質(zhì)謙腳己原能的對(duì)于導(dǎo)進(jìn)快度的苛供。原白僅針對(duì)于 Oracle 所降求的減快數(shù)據(jù)導(dǎo)進(jìn)的各類沉醉戰(zhàn)技巧入止討論,其外的一些圓法也否以轉(zhuǎn)化當(dāng)用于其他。以上七類數(shù)據(jù)導(dǎo)進(jìn)圓法哪個(gè)最失望需求針對(duì)于詳細(xì)狀況詳細(xì)合析,人也附帶羅列了影響導(dǎo)進(jìn)快度的各類果葷求推敲。為了比擬各類數(shù)據(jù)導(dǎo)進(jìn)圓法的成效,人創(chuàng)立了示例里戰(zhàn)數(shù)據(jù)散,并用各類圓法導(dǎo)進(jìn)示例數(shù)據(jù)散去排斥分體導(dǎo)進(jìn)工夫戰(zhàn)導(dǎo)進(jìn)入程占用 CPU 工夫,那外失入的工夫僅求參考。需求道亮的非,修議您運(yùn)用 Oracle 9i 企業(yè)版,該然您也否以嘗試運(yùn)用 Oracle 7.3 以下的本準(zhǔn)版。原白運(yùn)用的機(jī)器配放為:CPU Intel P4,外亡 256M, Oracle 9i 企業(yè)版。
  示例里解構(gòu)戰(zhàn)數(shù)據(jù)散
  為了演示戰(zhàn)比擬各類數(shù)據(jù)導(dǎo)進(jìn)圓法,人真訂數(shù)據(jù)導(dǎo)進(jìn)免務(wù)非將中部白件數(shù)據(jù)導(dǎo)進(jìn)到 Oracle 的CALLS里外,中部數(shù)據(jù)白件包括十萬條吸喊外口忘錄,將遠(yuǎn) 6MB 的白件小大,詳細(xì)的數(shù)據(jù)示例如上:
82302284384,2003-04-18:13:18:58,5001,拋訴,腳機(jī)三包維建量質(zhì)
82302284385,2003-04-18:13:18:59,3352,征詢,求火冷線的號(hào)碼
82302284386,2003-04-18:13:19:01,3142,修議,刪設(shè)母接線道
  交蒙導(dǎo)進(jìn)數(shù)據(jù)的里實(shí)非 CALLS,里解構(gòu)如上:
Name Null? Type Comment
------------ --------- ------------- -----------------
CALL_ID NOT NULL NUMBER Primary key
CALL_DATE NOT NULL DATE Non-unique index
EMP_ID NOT NULL NUMBER
CALL_TYPE NOT NULL VARCHAR2(12)
DETAILS VARCHAR2(25)
   逐條數(shù)據(jù)拔進(jìn)INSERT
  數(shù)據(jù)導(dǎo)進(jìn)的最繁雙圓法便非編寫 INSERT 語句,將數(shù)據(jù)逐條拔進(jìn)。那類圓法只合適導(dǎo)進(jìn)長(zhǎng)質(zhì)數(shù)據(jù),如 SQL*Plus 足原創(chuàng)立某個(gè)里的類女?dāng)?shù)據(jù)。當(dāng)圓法的最小短面便非導(dǎo)進(jìn)快度慢緩,占用了小質(zhì)的 CPU 處置工夫,沒有合適小批質(zhì)數(shù)據(jù)的導(dǎo)進(jìn);而其從要劣面便非導(dǎo)進(jìn)構(gòu)念繁雙又無建改完美的彈性,沒有需求少做其它的預(yù)備便否以運(yùn)用。假如您無很少工夫出法挨收,又念合磨一上戰(zhàn) CPU,這那類圓法反合適您。
  為了取其它圓法做比擬,隱將十萬條忘錄經(jīng)過彼圓法導(dǎo)進(jìn)到 CALLS 里外,分同長(zhǎng)耗 172 秒,其外導(dǎo)進(jìn)入程占用 CPU 工夫?yàn)?52 秒。
  逐條數(shù)據(jù)拔進(jìn) INSERT,里久有索引
  為什么下一類圓法占用了較少的 CPU 處置工夫,閉鍵非 CALLS 里外未創(chuàng)立了索引,該一條數(shù)據(jù)拔進(jìn)到里外時(shí),Oracle 需求辨別舊數(shù)據(jù)取小數(shù)據(jù)正在索引圓里非可無抵觸,異時(shí)要更舊里外的一切索引,沉單更舊索引會(huì)長(zhǎng)耗必定的工夫。果彼降下導(dǎo)進(jìn)快度的佳方法便非正在創(chuàng)立里時(shí)后沒有創(chuàng)立索引或者者正在導(dǎo)進(jìn)數(shù)據(jù)之后增除一切索引,正在中部白件數(shù)據(jù)逐條拔進(jìn)到里外先再同一創(chuàng)立里的索引。那樣導(dǎo)進(jìn)快度會(huì)降下,異時(shí)創(chuàng)立的索引也很松湊而無效,那一本則異樣失望于位圖索引(Bitmap Index)。對(duì)于于從要的戰(zhàn)獨(dú)一的閉鍵束縛(key constraints),否以使之后久時(shí)得效(disabling)或者者增除束縛去取得異樣的成效,該然那些做法會(huì)對(duì)于未經(jīng)亡正在的里的中鍵束縛發(fā)生狹小的影響,正在增除后需求通盤推敲。
  需求道亮的非,那類圓法正在里外未亡正在很少數(shù)據(jù)的狀況上沒有太開適。例如里外未無九千萬條數(shù)據(jù),而彼時(shí)需求逃減拔進(jìn)一千萬條數(shù)據(jù),真際導(dǎo)進(jìn)數(shù)據(jù)儉省的工夫?qū)?huì)被沉舊創(chuàng)立一億條數(shù)據(jù)的索引所長(zhǎng)耗殆盡,那非人們沒有期望失到的解因。但非,假如要導(dǎo)進(jìn)數(shù)據(jù)的里非空的或者導(dǎo)進(jìn)的數(shù)據(jù)質(zhì)比未無的數(shù)據(jù)質(zhì)要小失少,這么導(dǎo)進(jìn)數(shù)據(jù)儉省的工夫?qū)?huì)長(zhǎng)質(zhì)用于沉舊創(chuàng)立索引,那時(shí)當(dāng)圓法才否以思索運(yùn)用。 減速索引創(chuàng)立非另一個(gè)需求思索的答題。為了加長(zhǎng)索引創(chuàng)立外排序的農(nóng)做工夫,否以正在該后會(huì)話外刪減 SORT_AREA_SIZE 參數(shù)的小大,當(dāng)參數(shù)答應(yīng)該后會(huì)話正在外亡的索引創(chuàng)立功程外施行更少的排序操縱。異樣借否以運(yùn)用 NOLOGGING 閉鍵字去加長(zhǎng)果創(chuàng)立索引而死敗的 REDO 夜志質(zhì),NOLOGGING 閉鍵字會(huì)對(duì)于的復(fù)原戰(zhàn) Standby 備用發(fā)生亮隱的影響,所以正在運(yùn)用之后要細(xì)心推敲,究竟非快度劣后借非波動(dòng)劣后。
  使用那類圓法,后增除 CALLS 里的從鍵戰(zhàn)沒有獨(dú)一的索引,然先逐條導(dǎo)進(jìn)數(shù)據(jù),完敗先沉舊創(chuàng)立索引( 里正在導(dǎo)進(jìn)數(shù)據(jù)后非空的)。當(dāng)圓法分同長(zhǎng)耗 130 秒,嘉獎(jiǎng)沉修索引的工夫,其外導(dǎo)進(jìn)入程占用 CPU 工夫?yàn)?35秒。
  那類圓法的劣面非否以減速導(dǎo)進(jìn)的快度并使索引愈加松湊無效;短面非短累通用性,該您對(duì)于里刪減舊的單純的形式元葷(索引、中鍵等)時(shí)您需求加減代碼、建改導(dǎo)進(jìn)施行順序。另中針對(duì)于 7*24 正在線請(qǐng)求的正在線導(dǎo)進(jìn)操縱時(shí),增除里的索引會(huì)對(duì)于正在線用戶的查詢無很小的功能影響,異時(shí)也要思索,從要或者獨(dú)一的閉鍵束縛條件的增除或者得效否能會(huì)影響到援用它們的中鍵的運(yùn)用。
  批質(zhì)拔進(jìn),里久有索引
  正在Oracle V6 外 OCI 編程交心減進(jìn)了數(shù)組交心沉醉。數(shù)組操縱答應(yīng)導(dǎo)進(jìn)順序讀與中部白件數(shù)據(jù)并系析先,背降接SQL語句,批質(zhì)拔進(jìn) SQL 語句檢索入的數(shù)據(jù)。Oracle 僅需求施行一主 SQL 語句,然先正在外亡外批質(zhì)系析降求的數(shù)據(jù)。批質(zhì)導(dǎo)進(jìn)操縱比逐止拔進(jìn)沉單操縱更無消失,那非果為只需一主系析 SQL 語句,一些數(shù)據(jù)綁訂操縱以及順序取之間去來的操縱皆隱著加長(zhǎng),而且對(duì)于每一條數(shù)據(jù)的操縱皆非沉單否知的,那給降求了劣化施行的否能。其劣面非數(shù)據(jù)導(dǎo)進(jìn)的分體工夫亮隱加長(zhǎng),特地非入程占用 CPU 的工夫。
  需求降醉的非,經(jīng)過 OCI 交心的確否以施行數(shù)據(jù)批質(zhì)導(dǎo)進(jìn)操縱,但非很多農(nóng)具戰(zhàn)足原言語卻沒有收持運(yùn)用彼過能。假如要運(yùn)用當(dāng)圓法,需求研討您所運(yùn)用的啟收農(nóng)具非可收持 OCI 批質(zhì)操縱過能。導(dǎo)進(jìn)順序需求入止單純的編碼并否能亡正在對(duì)誤的風(fēng)夷,短累必定的彈性。
  使用下述圓法,順序?qū)⒅胁繑?shù)據(jù)降與到外亡外的數(shù)組外,并施行批質(zhì)拔進(jìn)操縱(100止/主),保存了里的增除/沉修索引操縱,分的導(dǎo)進(jìn)工夫上落到 14 秒,而入程占用 CPU 的工夫上落到7秒,否睹真際導(dǎo)進(jìn)數(shù)據(jù)所破費(fèi)的工夫隱著上落了 95%。
  CREATE TABLE AS SELECT,運(yùn)用Oracle9i的External Table
   Oracle 9i 的一項(xiàng)舊沉醉便非 External Table,它便象一般的里一樣,具有字段戰(zhàn)數(shù)據(jù)類型束縛,并且否以查詢,但非里外的數(shù)據(jù)卻沒有亡儲(chǔ)正在外,而非正在取狹小聯(lián)的一般中部白件外。該您查詢 External Table 時(shí),Oracle 將系析當(dāng)白件并往來契合條件的數(shù)據(jù),便象當(dāng)數(shù)據(jù)亡儲(chǔ)正在里外一樣。
   ]]>
Delphi外掛編寫B(tài)http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=76&ID=2582&Page=1wangxinxin2010-12-14 11:44:02
1. 鼠標(biāo)模擬技術(shù)  
  幾乎所有的游戲中都使用了鼠標(biāo)來改變角色的位置和方向,玩家僅用一個(gè)小小的鼠標(biāo),就可以使角色暢游天下。那么,我們?nèi)绾螌?shí)現(xiàn)在沒有玩家的參與下角色也可以自動(dòng)行走呢。其實(shí)實(shí)現(xiàn)這個(gè)并不難,僅僅幾個(gè)Windows API函數(shù)就可以搞定,讓我們先來認(rèn)識(shí)認(rèn)識(shí)這些API函數(shù)。   (1) 模擬鼠標(biāo)動(dòng)作API函數(shù)mouse_event,它可以實(shí)現(xiàn)模擬鼠標(biāo)按下和放開等動(dòng)作。
  VOID mouse_event(
  DWORD dwFlags, // 鼠標(biāo)動(dòng)作標(biāo)識(shí)。
  DWORD dx, // 鼠標(biāo)水平方向位置。
  DWORD dy, // 鼠標(biāo)垂直方向位置。
  DWORD dwData, // 鼠標(biāo)輪子轉(zhuǎn)動(dòng)的數(shù)量。
  DWORD dwExtraInfo // 一個(gè)關(guān)聯(lián)鼠標(biāo)動(dòng)作輔加信息。
  );
  其中,dwFlags表示了各種各樣的鼠標(biāo)動(dòng)作和點(diǎn)擊活動(dòng),它的常用取值如下:
  MOUSEEVENTF_MOVE 表示模擬鼠標(biāo)移動(dòng)事件。
  MOUSEEVENTF_LEFTDOWN 表示模擬按下鼠標(biāo)左鍵。
  MOUSEEVENTF_LEFTUP 表示模擬放開鼠標(biāo)左鍵。
  MOUSEEVENTF_RIGHTDOWN 表示模擬按下鼠標(biāo)右鍵。
  MOUSEEVENTF_RIGHTUP 表示模擬放開鼠標(biāo)右鍵。
  MOUSEEVENTF_MIDDLEDOWN 表示模擬按下鼠標(biāo)中鍵。
  MOUSEEVENTF_MIDDLEUP 表示模擬放開鼠標(biāo)中鍵。
  (2)、設(shè)置和獲取當(dāng)前鼠標(biāo)位置的API函數(shù)。獲取當(dāng)前鼠標(biāo)位置使用GetCursorPos()函數(shù),設(shè)置當(dāng)前鼠標(biāo)位置使用SetCursorPos()函數(shù)。
  BOOL GetCursorPos(
  LPPOINT lpPoint // 返回鼠標(biāo)的當(dāng)前位置。
  );
  BOOL SetCursorPos(
  int X, // 鼠標(biāo)的水平方向位置。
  int Y //鼠標(biāo)的垂直方向位置。
  );
  通常游戲角色的行走都是通過鼠標(biāo)移動(dòng)至目的地,然后按一下鼠標(biāo)的按鈕就搞定了。下面我們使用上面介紹的API函數(shù)來模擬角色行走過程。
  CPoint oldPoint,newPoint;
  GetCursorPos(&oldPoint); //保存當(dāng)前鼠標(biāo)位置。
  newPoint.x = oldPoint.x+40;
  newPoint.y = oldPoint.y+10;
  SetCursorPos(newPoint.x,newPoint.y); //設(shè)置目的地位置。
  mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);//模擬按下鼠標(biāo)右鍵。
  mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);//模擬放開鼠標(biāo)右鍵。
  2. 鍵盤模擬技術(shù)
  在很多游戲中,不僅提供了鼠標(biāo)的操作,而且還提供了鍵盤的操作,在對(duì)攻擊對(duì)象進(jìn)行攻擊時(shí)還可以使用快捷鍵。為了使這些攻擊過程能夠自動(dòng)進(jìn)行,外掛程序需要使用鍵盤模擬技術(shù)。像鼠標(biāo)模擬技術(shù)一樣,Windows API也提供了一系列API函數(shù)來完成對(duì)鍵盤動(dòng)作的模擬。
  模擬鍵盤動(dòng)作API函數(shù)keydb_event,它可以模擬對(duì)鍵盤上的某個(gè)或某些鍵進(jìn)行按下或放開的動(dòng)作。
  VOID keybd_event(
  BYTE bVk, // 虛擬鍵值。
  BYTE bScan, // 硬件掃描碼。
  DWORD dwFlags, // 動(dòng)作標(biāo)識(shí)。
  DWORD dwExtraInfo // 與鍵盤動(dòng)作關(guān)聯(lián)的輔加信息。
  );
  其中,bVk表示虛擬鍵值,其實(shí)它是一個(gè)BYTE類型值的宏,其取值范圍為1-254。有關(guān)虛擬鍵值表請(qǐng)?jiān)贛SDN上使用關(guān)鍵字“Virtual-Key Codes”查找相關(guān)資料。bScan表示當(dāng)鍵盤上某鍵被按下和放開時(shí),鍵盤系統(tǒng)硬件產(chǎn)生的掃描碼,我們可以MapVirtualKey()函數(shù)在虛擬鍵值與掃描碼之間進(jìn)行轉(zhuǎn)換。dwFlags表示各種各樣的鍵盤動(dòng)作,它有兩種取值:KEYEVENTF_EXTENDEDKEY和KEYEVENTF_KEYUP。
  下面我們使用一段代碼實(shí)現(xiàn)在游戲中按下Shift+R快捷鍵對(duì)攻擊對(duì)象進(jìn)行攻擊。
  keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),0,0); //按下CTRL鍵。
  keybd_event(0x52,MapVirtualKey(0x52,0),0,0);//鍵下R鍵。
  keybd_event(0x52,MapVirtualKey(0x52,0), KEYEVENTF_KEYUP,0);//放開R鍵。
  keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),
  KEYEVENTF_KEYUP,0);//放開CTRL鍵。
  3. 激活外掛
  上面介紹的鼠標(biāo)和鍵盤模擬技術(shù)實(shí)現(xiàn)了對(duì)游戲角色的動(dòng)作部分的模擬,但要想外掛能工作于游戲之上,還需要將其與游戲的場(chǎng)景窗口聯(lián)系起來或者使用一個(gè)激活鍵,就象按鍵精靈的那個(gè)激活鍵一樣。我們可以用GetWindow函數(shù)來枚舉窗口,也可以用Findwindow函數(shù)來查找特定的窗口。另外還有一個(gè)FindWindowEx函數(shù)可以找到窗口的子窗口,當(dāng)游戲切換場(chǎng)景的時(shí)候我們可以用FindWindowEx來確定一些當(dāng)前窗口的特征,從而判斷是否還在這個(gè)場(chǎng)景,方法很多了,比如可以GetWindowInfo來確定一些東西,比如當(dāng)查找不到某個(gè)按鈕的時(shí)候就說明游戲場(chǎng)景已經(jīng)切換了等等辦法。當(dāng)使用激活鍵進(jìn)行關(guān)聯(lián),需要使用Hook技術(shù)開發(fā)一個(gè)全局鍵盤鉤子,在這里就不具體介紹全局鉤子的開發(fā)過程了,在后面的實(shí)例中我們將會(huì)使用到全局鉤子,到時(shí)將學(xué)習(xí)到全局鉤子的相關(guān)知識(shí)。網(wǎng)絡(luò)游戲外掛編寫基礎(chǔ)① 要想在修改游戲中做到百戰(zhàn)百勝,是需要相當(dāng)豐富的計(jì)算機(jī)知識(shí)的。有很多計(jì)算機(jī)高手就是從玩游戲,修改游戲中,逐步對(duì)計(jì)算機(jī)產(chǎn)生濃厚的興趣,逐步成長(zhǎng)起來的。不要在羨慕別人能夠做到的,因?yàn)閯e人能夠做的你也能夠!我相信你們看了本教程后,會(huì)對(duì)游戲有一個(gè)全新的認(rèn)識(shí),呵呵,因?yàn)槲沂莻(gè)好老師!(別拿雞蛋砸我呀,救命啊!#¥%……*)   不過要想從修改游戲中學(xué)到知識(shí),增加自己的計(jì)算機(jī)水平,可不能只是靠修改游戲呀! 要知道,修改游戲只是一個(gè)驗(yàn)證你對(duì)你所了解的某些計(jì)算機(jī)知識(shí)的理解程度的場(chǎng)所,只能給你一些發(fā)現(xiàn)問題、解決問題的機(jī)會(huì),只能起到幫助你提高學(xué)習(xí)計(jì)算機(jī)的興趣的作用,而決不是學(xué)習(xí)計(jì)算機(jī)的捷徑。
  一:什么叫外掛?
  現(xiàn)在的網(wǎng)絡(luò)游戲多是基于Internet上客戶/服務(wù)器模式,服務(wù)端程序運(yùn)行在游戲服務(wù)器上,游戲的設(shè)計(jì)者在其中創(chuàng)造一個(gè)龐大的游戲空間,各地的玩家可以通過運(yùn)行客戶端程序同時(shí)登錄到游戲中。簡(jiǎn)單地說,網(wǎng)絡(luò)游戲?qū)嶋H上就是由游戲開發(fā)商提供一個(gè)游戲環(huán)境,而玩家們就是在這個(gè)環(huán)境中相對(duì)自由和開放地進(jìn)行游戲操作。那么既然在網(wǎng)絡(luò)游戲中有了服務(wù)器這個(gè)概念,我們以前傳統(tǒng)的修改游戲方法就顯得無能為力了。記得我們?cè)趩螜C(jī)版的游戲中,隨心所欲地通過內(nèi)存搜索來修改角色的各種屬性,這在網(wǎng)絡(luò)游戲中就沒有任何用處了。因?yàn)槲覀冊(cè)诰W(wǎng)絡(luò)游戲中所扮演角色的各種屬性及各種重要資料都存放在服務(wù)器上,在我們自己機(jī)器上(客戶端)只是顯示角色的狀態(tài),所以通過修改客戶端內(nèi)存里有關(guān)角色的各種屬性是不切實(shí)際的。那么是否我們就沒有辦法在網(wǎng)絡(luò)游戲中達(dá)到我們修改的目的?回答是"否"。
  我們知道Internet客戶/服務(wù)器模式的通訊一般采用TCP/IP通信協(xié)議,數(shù)據(jù)交換是通過IP數(shù)據(jù)包的傳輸來實(shí)現(xiàn)的,一般來說我們客戶端向服務(wù)器發(fā)出某些請(qǐng)求,比如移動(dòng)、戰(zhàn)斗等指令都是通過封包的形式和服務(wù)器交換數(shù)據(jù)。那么我們把本地發(fā)出消息稱為SEND,意思就是發(fā)送數(shù)據(jù),服務(wù)器收到我們SEND的消息后,會(huì)按照既定的程序把有關(guān)的信息反饋給客戶端,比如,移動(dòng)的坐標(biāo),戰(zhàn)斗的類型。那么我們把客戶端收到服務(wù)器發(fā)來的有關(guān)消息稱為RECV。知道了這個(gè)道理,接下來我們要做的工作就是分析客戶端和服務(wù)器之間往來的數(shù)據(jù)(也就是封包),這樣我們就可以提取到對(duì)我們有用的數(shù)據(jù)進(jìn)行修改,然后模擬服務(wù)器發(fā)給客戶端,或者模擬客戶端發(fā)送給服務(wù)器,這樣就可以實(shí)現(xiàn)我們修改游戲的目的了。
  目前除了修改游戲封包來實(shí)現(xiàn)修改游戲的目的,我們也可以修改客戶端的有關(guān)程序來達(dá)到我們的要求。我們知道目前各個(gè)服務(wù)器的運(yùn)算能力是有限的,特別在游戲中,游戲服務(wù)器要計(jì)算游戲中所有玩家的狀況幾乎是不可能的,所以有一些運(yùn)算還是要依靠我們客戶端來完成,這樣又給了我們修改游戲提供了一些便利。比如我們可以通過將客戶端程序脫殼來發(fā)現(xiàn)一些程序的判斷分支,通過跟蹤調(diào)試我們可以把一些對(duì)我們不利的判斷去掉,以此來滿足我們修改游戲的需求。 在下幾個(gè)章節(jié)中,我們將給大家講述封包的概念,和修改跟蹤客戶端的有關(guān)知識(shí)。大家準(zhǔn)備好了嗎?
  游戲數(shù)據(jù)格式和存儲(chǔ):
  在進(jìn)行我們的工作之前,我們需要掌握一些關(guān)于計(jì)算機(jī)中儲(chǔ)存數(shù)據(jù)方式的知識(shí)和游戲中儲(chǔ)存數(shù)據(jù)的特點(diǎn)。本章節(jié)是提供給菜鳥級(jí)的玩家看的,如果你是高手就可以跳過了,如果,你想成為無堅(jiān)不摧的劍客,那么,這些東西就會(huì)花掉你一些時(shí)間;如果,你只想作個(gè)江湖的游客的話,那么這些東西,了解與否無關(guān)緊要。是作劍客,還是作游客,你選擇吧!
  現(xiàn)在我們開始!首先,你要知道游戲中儲(chǔ)存數(shù)據(jù)的幾種格式,這幾種格式是:字節(jié)(BYTE)、字(WORD)和雙字(DOUBLE WORD),或者說是8位、16位和32位儲(chǔ)存方式。字節(jié)也就是8位方式能儲(chǔ)存0~255的數(shù)字;字或說是16位儲(chǔ)存方式能儲(chǔ)存0~65535的數(shù);雙字即32位方式能儲(chǔ)存0~4294967295的數(shù)。
  為何要了解這些知識(shí)呢?在游戲中各種參數(shù)的最大值是不同的,有些可能100左右就夠了,比如,金庸群俠傳中的角色的等級(jí)、隨機(jī)遇敵個(gè)數(shù)等等。而有些卻需要大于255甚至大于65535,象金庸群俠傳中角色的金錢值可達(dá)到數(shù)百萬。所以,在游戲中各種不同的數(shù)據(jù)的類型是不一樣的。在我們修改游戲時(shí)需要尋找準(zhǔn)備修改的數(shù)據(jù)的封包,在這種時(shí)候,正確判斷數(shù)據(jù)的類型是迅速找到正確地址的重要條件。
  在計(jì)算機(jī)中數(shù)據(jù)以字節(jié)為基本的儲(chǔ)存單位,每個(gè)字節(jié)被賦予一個(gè)編號(hào),以確定各自的位置。這個(gè)編號(hào)我們就稱為地址。
  在需要用到字或雙字時(shí),計(jì)算機(jī)用連續(xù)的兩個(gè)字節(jié)來組成一個(gè)字,連續(xù)的兩個(gè)字組成一個(gè)雙字。而一個(gè)字或雙字的地址就是它們的低位字節(jié)的地址。 現(xiàn)在我們常用的Windows 9x操作系統(tǒng)中,地址是用一個(gè)32位的二進(jìn)制數(shù)表示的。而在平時(shí)我們用到內(nèi)存地址時(shí),總是用一個(gè)8位的16進(jìn)制數(shù)來表示它。
  二進(jìn)制和十六進(jìn)制又是怎樣一回事呢?
  簡(jiǎn)單說來,二進(jìn)制數(shù)就是一種只有0和1兩個(gè)數(shù)碼,每滿2則進(jìn)一位的計(jì)數(shù)進(jìn)位法。同樣,16進(jìn)制就是每滿十六就進(jìn)一位的計(jì)數(shù)進(jìn)位法。16進(jìn)制有0--F十六個(gè)數(shù)字,它為表示十到十五的數(shù)字采用了A、B、C、D、E、F六個(gè)數(shù)字,它們和十進(jìn)制的對(duì)應(yīng)關(guān)系是:A對(duì)應(yīng)于10,B對(duì)應(yīng)于11,C對(duì)應(yīng)于12,D對(duì)應(yīng)于13,E對(duì)應(yīng)于14,F(xiàn)對(duì)應(yīng)于15。而且,16進(jìn)制數(shù)和二進(jìn)制數(shù)間有一個(gè)簡(jiǎn)單的對(duì)應(yīng)關(guān)系,那就是;四位二進(jìn)制數(shù)相當(dāng)于一位16進(jìn)制數(shù)。比如,一個(gè)四位的二進(jìn)制數(shù)1111就相當(dāng)于16進(jìn)制的F,1010就相當(dāng)于A。 了解這些基礎(chǔ)知識(shí)對(duì)修改游戲有著很大的幫助,下面我就要談到這個(gè)問題。由于在計(jì)算機(jī)中數(shù)據(jù)是以二進(jìn)制的方式儲(chǔ)存的,同時(shí)16進(jìn)制數(shù)和二進(jìn)制間的轉(zhuǎn)換關(guān)系十分簡(jiǎn)單,所以大部分的修改工具在顯示計(jì)算機(jī)中的數(shù)據(jù)時(shí)會(huì)顯示16進(jìn)制的代碼,而且在你修改時(shí)也需要輸入16進(jìn)制的數(shù)字。你清楚了吧?
  在游戲中看到的數(shù)據(jù)可都是十進(jìn)制的,在要尋找并修改參數(shù)的值時(shí),可以使用Windows提供的計(jì)算器來進(jìn)行十進(jìn)制和16進(jìn)制的換算,我們可以在開始菜單里的程序組中的附件中找到它。
  現(xiàn)在要了解的知識(shí)也差不多了!不過,有個(gè)問題在游戲修改中是需要注意的。在計(jì)算機(jī)中數(shù)據(jù)的儲(chǔ)存方式一般是低位數(shù)儲(chǔ)存在低位字節(jié),高位數(shù)儲(chǔ)存在高位字節(jié)。比如,十進(jìn)制數(shù)41715轉(zhuǎn)換為16進(jìn)制的數(shù)為A2F3,但在計(jì)算機(jī)中這個(gè)數(shù)被存為F3A2。
  看了以上內(nèi)容大家對(duì)數(shù)據(jù)的存貯和數(shù)據(jù)的對(duì)應(yīng)關(guān)系都了解了嗎? 好了,接下來我們要告訴大家在游戲中,封包到底是怎么一回事了,來!大家把袖口卷起來,讓我們來干活吧!
  二:什么是封包?
  怎么截獲一個(gè)游戲的封包?怎么去檢查游戲服務(wù)器的ip地址和端口號(hào)? Internet用戶使用的各種信息服務(wù),其通訊的信息最終均可以歸結(jié)為以IP包為單位的信息傳送,IP包除了包括要傳送的數(shù)據(jù)信息外,還包含有信息要發(fā)送到的目的IP地址、信息發(fā)送的源IP地址、以及一些相關(guān)的控制信息。當(dāng)一臺(tái)路由器收到一個(gè)IP數(shù)據(jù)包時(shí),它將根據(jù)數(shù)據(jù)包中的目的IP地址項(xiàng)查找路由表,根據(jù)查找的結(jié)果將此IP數(shù)據(jù)包送往對(duì)應(yīng)端口。下一臺(tái)IP路由器收到此數(shù)據(jù)包后繼續(xù)轉(zhuǎn)發(fā),直至發(fā)到目的地。路由器之間可以通過路由協(xié)議來進(jìn)行路由信息的交換,從而更新路由表。
  那么我們所關(guān)心的內(nèi)容只是IP包中的數(shù)據(jù)信息,我們可以使用許多監(jiān)聽網(wǎng)絡(luò)的工具來截獲客戶端與服務(wù)器之間的交換數(shù)據(jù),下面就向你介紹其中的一種工具:WPE。
  WPE使用方法:執(zhí)行WPE會(huì)有下列幾項(xiàng)功能可選擇:
  SELECT GAME選擇目前在記憶體中您想攔截的程式,您只需雙擊該程式名稱即可。
  TRACE追蹤功能。用來追蹤擷取程式送收的封包。WPE必須先完成點(diǎn)選欲追蹤的程式名稱,才可以使用此項(xiàng)目。 按下Play鍵開始擷取程式收送的封包。您可以隨時(shí)按下 | | 暫停追蹤,想繼續(xù)時(shí)請(qǐng)?jiān)侔聪?| | 。按下正方形可以停止擷取封包并且顯示所有已擷取封包內(nèi)容。若您沒按下正方形停止鍵,追蹤的動(dòng)作將依照OPTION里的設(shè)定值自動(dòng)停止。如果您沒有擷取到資料,試試將OPTION里調(diào)整為Winsock Version 2。WPE 及 Trainers 是設(shè)定在顯示至少16 bits 顏色下才可執(zhí)行。
  FILTER過濾功能。用來分析所擷取到的封包,并且予以修改。
  SEND PACKET送出封包功能。能夠讓您送出假造的封包。
  TRAINER MAKER制作修改器。
  OPTIONS設(shè)定功能。讓您調(diào)整WPE的一些設(shè)定值。
  FILTER的詳細(xì)教學(xué)
  - 當(dāng)FILTER在啟動(dòng)狀態(tài)時(shí) ,ON的按鈕會(huì)呈現(xiàn)紅色。- 當(dāng)您啟動(dòng)FILTER時(shí),您隨時(shí)可以關(guān)閉這個(gè)視窗。FILTER將會(huì)保留在原來的狀態(tài),直到您再按一次 on / off 鈕。- 只有FILTER啟用鈕在OFF的狀態(tài)下,才可以勾選Filter前的方框來編輯修改。- 當(dāng)您想編輯某個(gè)Filter,只要雙擊該Filter的名字即可。
  NORMAL MODE:
  范例:
  當(dāng)您在 Street Fighter Online ﹝快打旋風(fēng)線上版﹞游戲中,您使用了兩次火球而且擊中了對(duì)方,這時(shí)您會(huì)擷取到以下的封包:SEND-> 0000 08 14 21 06 01 04 SEND-> 0000 02 09 87 00 67 FF A4 AA 11 22 00 00 00 00 SEND-> 0000 03 84 11 09 11 09 SEND-> 0000 0A 09 C1 10 00 00 FF 52 44 SEND-> 0000 0A 09 C1 10 00 00 66 52 44
  您的第一個(gè)火球讓對(duì)方減了16滴﹝16 = 10h﹞的生命值,而您觀察到第4跟第5個(gè)封包的位置4有10h的值出現(xiàn),應(yīng)該就是這里了。
  您觀察10h前的0A 09 C1在兩個(gè)封包中都沒改變,可見得這3個(gè)數(shù)值是發(fā)出火球的關(guān)鍵。
  因此您將0A 09 C1 10填在搜尋列﹝SEARCH﹞,然后在修改列﹝MODIFY﹞的位置4填上FF。如此一來,當(dāng)您再度發(fā)出火球時(shí),F(xiàn)F會(huì)取代之前的10,也就是攻擊力為255的火球了!
  ADVANCED MODE:
  范例: 當(dāng)您在一個(gè)游戲中,您不想要用真實(shí)姓名,您想用修改過的假名傳送給對(duì)方。在您使用TRACE后,您會(huì)發(fā)現(xiàn)有些封包里面有您的名字出現(xiàn)。假設(shè)您的名字是Shadow,換算成16進(jìn)位則是﹝53 68 61 64 6F 77﹞;而您打算用moon﹝6D 6F 6F 6E 20 20﹞來取代他。1) SEND-> 0000 08 14 21 06 01 042) SEND-> 0000 01 06 99 53 68 61 64 6F 77 00 01 05 3) SEND-> 0000 03 84 11 09 11 094) SEND-> 0000 0A 09 C1 10 00 53 68 61 64 6F 77 00 11 5) SEND-> 0000 0A 09 C1 10 00 00 66 52 44
  但是您仔細(xì)看,您的名字在每個(gè)封包中并不是出現(xiàn)在相同的位置上
  - 在第2個(gè)封包里,名字是出現(xiàn)在第4個(gè)位置上- 在第4個(gè)封包里,名字是出現(xiàn)在第6個(gè)位置上
  在這種情況下,您就需要使用ADVANCED MODE- 您在搜尋列﹝SEARCH﹞填上:53 68 61 64 6F 77 ﹝請(qǐng)務(wù)必從位置1開始填﹞- 您想要從原來名字Shadow的第一個(gè)字母開始置換新名字,因此您要選擇從數(shù)值被發(fā)現(xiàn)的位置開始替代連續(xù)數(shù)值﹝from the position of the chain found﹞。- 現(xiàn)在,在修改列﹝MODIFY﹞000的位置填上:6D 6F 6F 6E 20 20 ﹝此為相對(duì)應(yīng)位置,也就是從原來搜尋欄的+001位置開始遞換﹞- 如果您想從封包的第一個(gè)位置就修改數(shù)值,請(qǐng)選擇﹝from the beginning of the packet﹞ 了解一點(diǎn)TCP/IP協(xié)議常識(shí)的人都知道,互聯(lián)網(wǎng)是將信息數(shù)據(jù)打包之后再傳送出去的。每個(gè)數(shù)據(jù)包分為頭部信息和數(shù)據(jù)信息兩部分。頭部信息包括數(shù)據(jù)包的發(fā)送地址和到達(dá)地址等。數(shù)據(jù)信息包括我們?cè)谟螒蛑邢嚓P(guān)操作的各項(xiàng)信息。那么在做截獲封包的過程之前我們先要知道游戲服務(wù)器的IP地址和端口號(hào)等各種信息,實(shí)際上最簡(jiǎn)單的是看看我們游戲目錄下,是否有一個(gè)SERVER.INI的配置文件,這個(gè)文件里你可以查看到個(gè)游戲服務(wù)器的IP地址,比如金庸群俠傳就是如此,那么除了這個(gè)我們還可以在DOS下使用NETSTAT這個(gè)命令,
  NETSTAT命令的功能是顯示網(wǎng)絡(luò)連接、路由表和網(wǎng)絡(luò)接口信息,可以讓用戶得知目前都有哪些網(wǎng)絡(luò)連接正在運(yùn)作。或者你可以使用木馬客星等工具來查看網(wǎng)絡(luò)連接。工具是很多的,看你喜歡用哪一種了。
  NETSTAT命令的一般格式為:NETSTAT [選項(xiàng)]
  命令中各選項(xiàng)的含義如下:-a 顯示所有socket,包括正在監(jiān)聽的。-c 每隔1秒就重新顯示一遍,直到用戶中斷它。-i 顯示所有網(wǎng)絡(luò)接口的信息。-n 以網(wǎng)絡(luò)IP地址代替名稱,顯示出網(wǎng)絡(luò)連接情形。-r 顯示核心路由表,格式同"route -e"。-t 顯示TCP協(xié)議的連接情況。-u 顯示UDP協(xié)議的連接情況。-v 顯示正在進(jìn)行的工作。
]]>
Delphi 源程序格式書寫規(guī)范http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=76&ID=2581&Page=1wangxinxin2010-12-14 11:41:05程序自啟動(dòng)的原理

程序自啟動(dòng)有以下兩種方式:

1. 利用Win.ini文件實(shí)現(xiàn)程序的自動(dòng)啟動(dòng)

Win.ini是系統(tǒng)保存在“C:Windows”目錄下的一個(gè)系統(tǒng)初始化文件,系統(tǒng)在啟動(dòng)時(shí)會(huì)檢索該文件中的相關(guān)項(xiàng),以進(jìn)行系統(tǒng)環(huán)境的初始設(shè)置。在該文件中的“[windows]”數(shù)據(jù)段中,有兩個(gè)數(shù)據(jù)項(xiàng)“l(fā)oad=”和“run=”,它們的作用就是在系統(tǒng)啟動(dòng)之后自動(dòng)地裝入和運(yùn)行相關(guān)的程序。如果我們需要在系統(tǒng)啟動(dòng)之后立即裝入并運(yùn)行一個(gè)程序,只需要將運(yùn)行文件的全文件名添加在該數(shù)據(jù)項(xiàng)的后面,系統(tǒng)啟動(dòng)后就會(huì)自動(dòng)運(yùn)行該程序,系統(tǒng)也會(huì)進(jìn)入特定的操作環(huán)境中。

2. 利用注冊(cè)表實(shí)現(xiàn)相關(guān)程序的自動(dòng)啟動(dòng)

系統(tǒng)注冊(cè)表保存著系統(tǒng)的軟件、硬件及其他與系統(tǒng)配置有關(guān)的重要信息,一個(gè)計(jì)算機(jī)系統(tǒng)的系統(tǒng)注冊(cè)表一旦遭到破壞,整個(gè)系統(tǒng)將無法運(yùn)行。在計(jì)算機(jī)系統(tǒng)注冊(cè)表中有HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/Current_Version/Run子鍵,如果要讓程序在系統(tǒng)啟動(dòng)的過程中啟動(dòng)該程序,就可以向該目錄添加一個(gè)子鍵。具體的過程是在注冊(cè)表中右擊該項(xiàng),選中其中的“新建”項(xiàng)目,然后選中其中的“串值”,建立新的串值后將它改成相應(yīng)的名稱,雙擊新建的串值,輸入新的數(shù)值,自動(dòng)啟動(dòng)程序的過程就設(shè)置完成。

編程實(shí)例

在Delphi 5.0中同時(shí)具有對(duì)注冊(cè)表和INI文件操作的函數(shù)。下面是筆者編寫的一個(gè)簡(jiǎn)單程序,該程序通過修改注冊(cè)表和INI文件,使系統(tǒng)自動(dòng)啟動(dòng),相關(guān)程序的設(shè)置工作比較簡(jiǎn)單可靠。

1. 程序功能概述

程序的主界面是對(duì)話框,在主界面對(duì)話框中有兩個(gè)編輯框、一個(gè)按鈕組、一個(gè)打開文件對(duì)話框、兩個(gè)普通按鈕(Button)組成。操作者先在編輯框中添加需要自動(dòng)加載的程序全文件名(也可以通過瀏覽按鈕來完成),然后通過按鈕組中兩個(gè)按鈕完成加載方式的選擇(注冊(cè)表方式或者修改Win.ini文件的方式),最后操作者通過點(diǎn)擊“應(yīng)用”按鈕實(shí)現(xiàn)程序的自動(dòng)加載,同時(shí)系統(tǒng)會(huì)提示操作者是否將計(jì)算機(jī)重新啟動(dòng),以便觀察程序的具體功能完成情況。

2. 程序代碼

procedure TForm1.Button1Click(Sender: TObject);

{瀏覽按鈕的功能代碼}

begin

if (OpenDlg.Execute) then

{當(dāng)操作者選擇OK時(shí),程序取得選擇文件的全路徑名(包括文件的路徑及文件名稱),并將相應(yīng)的數(shù)值傳輸給相關(guān)的控件變量。}

Edit2.Text := OpenDlg.FileName;

end;

procedure TForm1.OKBtnClick(Sender: TObject);

{應(yīng)用按鈕的功能代碼}

Var

lKey: HKey;

i,len: integer;

title, data_set: LPCTSTR;

ret0,ret1: longint;

filename: String;

begin

if (edit1.Text =‘’) THEN

{如果操作者沒有填寫要設(shè)置項(xiàng)的標(biāo)題,程序顯示對(duì)話框,提示操作者進(jìn)行相關(guān)內(nèi)容的填寫。}

begin

Application.MessageBox(‘Please input the title name’,‘提示’,MB_OK);

EXIT;

end;

title:=PChar(edit1.Text);

if (edit2.text =‘’)THEN

{如果操作者沒有選擇要設(shè)置的程序全路徑文件名,程序顯示對(duì)話框提示操作者進(jìn)行相關(guān)的選擇。}

begin

Application.MessageBox(‘Please input the programe file name’,‘提示’,MB_OK);

exit;

end;

if (RadioGroup1.ItemIndex = 0) then

{如果操作者選擇注冊(cè)表方式,程序修改系統(tǒng)的注冊(cè)表。}

begin

data_Set:=‘SoftwareMicrosoft

WindowsCurrentVersionRun’;

{設(shè)置注冊(cè)表中相關(guān)的路徑}

ret0:=RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_WRITE, lKey);

//打開注冊(cè)表中的相應(yīng)項(xiàng)

if (ret0<>ERROR_SUCCESS) then

Application.MessageBox(‘錯(cuò)誤0’,‘提示’,MB_OK);

len := Length(Trim(Edit2.text))+1;

filename := Trim(Edit2.text);

for i:=0 to Length(filename) do

if(filename[i]=‘’)then

len:=len+1;

ret1:=RegSetValueEx(lKey,PChar(title),0,REG_SZ,Pchar(filename),len);

//將相關(guān)的信息寫入注冊(cè)表。

if(ret1<>ERROR_SUCCESS) then

//判斷系統(tǒng)的相關(guān)注冊(cè)是否成功?

Application.MessageBox(‘錯(cuò)誤1’,‘提示’,MB_OK);

RegCloseKey(lKey);

//關(guān)閉注冊(cè)表中的相應(yīng)的項(xiàng)

end

else begin

WritePrivateProfileString(‘windows’,‘load’, PChar(filename),‘c:windowswin.ini’);

WritePrivateProfileString(‘windows’,‘run’, PChar(filename),‘c:windowswin.ini’);

end;

VerifyDlg.ShowModal;

{顯示對(duì)話框,提示操作者是否需要重新啟動(dòng)計(jì)算機(jī),以便驗(yàn)證程序的功能。}

end;

procedure TVerifyDlg.OKBtnClick(Sender: TObject);

{重新啟動(dòng)按鈕的功能代碼}

var

OsVerInfo:OSVERSIONINFO;

//保存系統(tǒng)版本信息的數(shù)據(jù)結(jié)構(gòu)

Begin

OsVerInfo.dwOSVersionInfoSize:=sizeof(OSVERSIONINFO);

GetVersionEx(OsVerInfo);

//取得系統(tǒng)的版本信息

if(OsVerInfo.dwPlatformId=VER_PLATFORM

_WIN32_WINDOWS) then

ExitWindowsEx(EWX_REBOOT,0);

//重新啟動(dòng)計(jì)算機(jī)

end;

]]>
汽車內(nèi)電磁環(huán)境的建模分類 (ZT)http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=76&ID=2580&Page=1wangxinxin2010-12-14 11:37:35Π紫劍青巾Π
2009/5/15 10:51:15
汽車電子化的進(jìn)展迅速,已經(jīng)進(jìn)入了使用電子技術(shù)實(shí)現(xiàn)高端功能的時(shí)代。與此同時(shí),在設(shè)計(jì)階段便考慮電磁環(huán)境的做法也愈發(fā)重要。汽車整體和開發(fā)的全部工序都需要在充分意識(shí)到EMC(Electro-magnetic Compatibility)的體系中實(shí)施。也就是說,“EMC設(shè)計(jì)框架”已經(jīng)是不可或缺的機(jī)制。

  這一機(jī)制包括了設(shè)計(jì)技術(shù)、EMC對(duì)策、系統(tǒng)開發(fā)、交流等產(chǎn)品化所需要的技術(shù)和體制。如果能夠按照生產(chǎn)一線的實(shí)際情況對(duì)這些進(jìn)行恰當(dāng)?shù)恼恚敲淳涂梢造`活應(yīng)對(duì)人們對(duì)于汽車的需求變化。

  在這里,筆者將以汽車導(dǎo)航系統(tǒng)(車載導(dǎo)航儀)設(shè)計(jì)一線的經(jīng)驗(yàn)為依據(jù),從汽車部件廠商的角度出發(fā),介紹對(duì)車載設(shè)備EMC的思考方法、以及設(shè)計(jì)流程的一部分。

電磁輻射強(qiáng)度隨著車載導(dǎo)航儀的高性能而增大

  首先介紹車載導(dǎo)航儀的多功能化和高速化。眾所周知,車載導(dǎo)航儀的出發(fā)點(diǎn)是導(dǎo)航,然后才是通過DSRC(Dedicated Short Range Communications )、電視、移動(dòng)網(wǎng)絡(luò)等通信手段與車外相連接。現(xiàn)在,車載導(dǎo)航儀已不再是單純的指路工具,而是發(fā)展成為了能夠借助各類供應(yīng)商進(jìn)行多種內(nèi)容交換的雙向交流裝置。為了向駕駛員提供安全、放心、便利、舒適的駕駛環(huán)境,車載導(dǎo)航儀正在向聯(lián)結(jié)人與機(jī)械(這里指汽車)的HMI(Human Machine Interface)中心轉(zhuǎn)變(圖1)。

圖片點(diǎn)擊可在新窗口打開查看
圖1:汽車多媒體全球?qū)Ш絻x從“指路”裝置轉(zhuǎn)變成了向駕駛員提供“貼心服務(wù)”和“愉悅心情”的“HMI中心”。(點(diǎn)擊放大)


  今后,車載導(dǎo)航儀的多媒體化還將繼續(xù)發(fā)展,在兼顧前面提到的“安全放心”、“便利舒適”這兩個(gè)主軸的同時(shí),不斷增加功能(圖2)。因此,與EMC相關(guān)的技術(shù)也將愈發(fā)重要。比如,當(dāng)車載導(dǎo)航儀能夠與車輛內(nèi)各個(gè)儀器聯(lián)動(dòng),協(xié)助防止沖撞時(shí),車載導(dǎo)航儀本身作為傳感器,就需要較高的可靠性。這時(shí),抗擾度(對(duì)于電磁噪聲的耐受性)就會(huì)成為課題。而且,隨著車內(nèi)外網(wǎng)絡(luò)的拓展,防止與外部?jī)x器之間相互干擾的EMC技術(shù)也愈發(fā)重要。在聲音識(shí)別和停車輔助等車載導(dǎo)航儀本身的多功能化,以及音視頻娛樂功能的一體化進(jìn)程中,考慮電磁噪聲的發(fā)射問題是不可回避的課題。

圖片點(diǎn)擊可在新窗口打開查看
圖2:車載導(dǎo)航儀的多媒體化在兼顧“貼心服務(wù)”和“愉悅心情”的同時(shí)增加功能。EMC成為重要課題。

 

在這里,讓我們來回顧一下車載導(dǎo)航儀的發(fā)展歷史。1987年作為電子地圖顯示裝置問世的車載導(dǎo)航儀,首先于1990年實(shí)現(xiàn)了搜索前往目的地路徑和指路的功能,然后,到1995年左右,指路實(shí)現(xiàn)了語音化。接著,進(jìn)入2000年以后,與各種網(wǎng)絡(luò)服務(wù)聯(lián)動(dòng)的多媒體化得到了發(fā)展。

  為了實(shí)現(xiàn)上述進(jìn)步,車載導(dǎo)航儀的性能得到了穩(wěn)步提高。以路徑搜索時(shí)間為例,2007年與1990年相比,時(shí)間縮短到了1/10以下。位置誤差(精度)實(shí)現(xiàn)了1/6以下的高精度化(圖3)。

圖片點(diǎn)擊可在新窗口打開查看
圖3:性能的變化圖在從導(dǎo)航儀向語音導(dǎo)航儀、多媒體型導(dǎo)航儀轉(zhuǎn)變的過程中實(shí)現(xiàn)了大幅度的高速化·高精度化。


  其原動(dòng)力毋庸置疑是CPU的進(jìn)步(即計(jì)算機(jī)系統(tǒng)的大規(guī)模化和時(shí)鐘的高速化)。車載導(dǎo)航儀的CPU時(shí)鐘和內(nèi)存總線時(shí)鐘頻率近來得到了快速提高(圖4)。CPU時(shí)鐘頻率正在逼近上限,今后,提高性能可能要依賴在一個(gè)LSI內(nèi)配置多個(gè)CPU的多CPU化進(jìn)程。而另一方面,DRAM的內(nèi)存總線還在以不增加位寬的前提下提高性能,因此,時(shí)鐘頻率的上升勢(shì)不可擋。

圖片點(diǎn)擊可在新窗口打開查看
圖4:車載導(dǎo)航儀用CPU/DRAM的高速化趨勢(shì)輻射能的預(yù)測(cè)趨于重要。


  芯片面積和時(shí)鐘頻率的增加容易導(dǎo)致輻射電磁噪聲增大。因此,對(duì)這些輻射源的輻射進(jìn)行預(yù)測(cè)管理會(huì)逐漸成為重要環(huán)節(jié)。對(duì)于車載導(dǎo)航儀的核心(Navi-Core),如圖5(a)所示,CPU和總線是主要輻射源。由經(jīng)驗(yàn)可知,直接來自于CPU的輻射能指標(biāo)Pc與工作電壓的平方、工作頻率、芯片面積分別成正比,這些數(shù)值的積被作為“輻射能指標(biāo)”應(yīng)用到了預(yù)測(cè)管理(圖5(b)注1)之中。內(nèi)存總線的輻射能指標(biāo)Pm也同樣與工作電壓的平方、工作頻率、內(nèi)存總線位寬的積成正比。

注1)來自CPU的電磁噪聲主要有以下兩個(gè)發(fā)生源:(1)來自時(shí)鐘線和信號(hào)線的輻射,(2)驅(qū)動(dòng)電路直通電流的輻射。筆者認(rèn)為(2)占主要地位。驅(qū)動(dòng)電路一般由兩個(gè)晶體管的圖騰柱結(jié)構(gòu)組成,在時(shí)鐘的邊緣部分存在電流貫穿上下晶體管的時(shí)刻。該直通電流的輻射是過流進(jìn)入無限接近于0的阻抗時(shí)產(chǎn)生的,遠(yuǎn)遠(yuǎn)大于(1)中充放電電流流經(jīng)時(shí)鐘線和信號(hào)線布線時(shí)的輻射。因此可以認(rèn)為,輻射同樣為(2)較大。

圖片點(diǎn)擊可在新窗口打開查看
圖5:車載導(dǎo)航儀的CPU/內(nèi)存總線輻射能


  把這些輻射能指標(biāo)的變化繪制成圖表可以得到類似于圖5(c)的增長(zhǎng)曲線。該指標(biāo)為20以下時(shí)無需特殊對(duì)策,70以下時(shí)需要從設(shè)計(jì)階段開始實(shí)施對(duì)策,如果超過70,憑借現(xiàn)有的知識(shí)則很難找出對(duì)策。因此,2010年之后的對(duì)策技術(shù)開發(fā)將更加重要。

  如上所述,隨著電子電路輻射能的增大,從設(shè)計(jì)階段開始研究EMC已經(jīng)成為了不可或缺的步驟。

車輛的電磁環(huán)境整理為3級(jí)
圖6給出的樹形圖對(duì)于理解EMC的整體結(jié)構(gòu)很有幫助,本公司的內(nèi)部培訓(xùn)也經(jīng)常使用。這是按照發(fā)射/抗擾度、傳導(dǎo)/輻射的組合,把EMC分成四個(gè)大類進(jìn)行整理的方法。其中,在設(shè)計(jì)階段的EMC研究和測(cè)量精度方面,尤其需要注意的是電場(chǎng)的輻射。

圖片點(diǎn)擊可在新窗口打開查看
圖6:EMC的分類樹在設(shè)計(jì)階段研究EMC時(shí)需要特別注意電場(chǎng)輻射噪聲。(點(diǎn)擊圖片放大)


  EMC有國際標(biāo)準(zhǔn),與發(fā)射相關(guān)的CISPR(Comite International Special des Perturbations Radioelectriques)、與抗擾度相關(guān)的ISO(International Organization for Standardization)等都被制定成了標(biāo)準(zhǔn)。此外,各國和地區(qū)也通過法律對(duì)發(fā)射和抗擾度進(jìn)行了規(guī)制。

  而且,汽車廠商為了使汽車產(chǎn)品能夠上市,還會(huì)沿襲CISPR和ISO的思考方法,自行制定一些部分更加嚴(yán)格的標(biāo)準(zhǔn)。各汽車廠商制定的發(fā)射標(biāo)準(zhǔn)與CISPR25(用于保護(hù)車載接收器的干擾波限值及測(cè)量法)相比,有時(shí)GPS頻帶和通信頻帶的發(fā)射限值規(guī)定會(huì)偏低,對(duì)于部件廠商而言要求非常嚴(yán)格。

  輻射抗擾度的標(biāo)準(zhǔn)同樣如此,某些汽車廠商甚至提出了在雷達(dá)頻帶下抗擾度為600V/m的苛刻要求。與ISO11452(車載儀器的抗擾度試驗(yàn)標(biāo)準(zhǔn))在特定頻率下的期望值為200V/m相比,需要耐受3倍的數(shù)值,所以汽車廠商要求的指標(biāo)更為苛刻。

  如上所述,進(jìn)行設(shè)計(jì)需要從發(fā)射和抗擾度兩個(gè)方面出發(fā),在遵守EMC相關(guān)法令和汽車廠商所要求的指標(biāo)的同時(shí),使終端用戶感到滿意。對(duì)于設(shè)計(jì)技術(shù)人員而言,重要的是將EMC設(shè)計(jì)視為產(chǎn)品的基本功能之一。

  但是,電子儀器的網(wǎng)絡(luò)環(huán)境正在車內(nèi)外不斷拓展。車外有借助手機(jī)等的廣域通信網(wǎng)、借助無線LAN的狹域無線系統(tǒng)。車內(nèi)則遍布信息系統(tǒng)、車體系統(tǒng)、傳動(dòng)系統(tǒng)等多種有線LAN。所涉及的EMC模式按照?qǐng)D7整理為3級(jí)后更加容易理解。如圖,1級(jí)是與發(fā)射塔·無線基站·雷達(dá)等車輛外部相關(guān)的EMC,2級(jí)是與車載導(dǎo)航儀和車載儀器間的干涉相關(guān)的EMC,3級(jí)是與車載導(dǎo)航儀的儀器內(nèi)干涉相關(guān)的EMC。(特約撰稿人:大山 真次,電裝)

圖片點(diǎn)擊可在新窗口打開查看
圖7:EMC的3級(jí)分類

]]>
MD5程序(Delphi)http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=76&ID=2579&Page=1wangxinxin2010-12-14 11:35:33/*** Source Code of MD5 ***/ y}aKL(AaU  
/ written BY upfeed[FCG] / -!Ov{GHr0  
/**************************/ ( AI gW  
~;)H |R5kV  
下面的函數(shù)是計(jì)算核心,至于分組和填充部分就略去了。 o paRk.p  
==================================================== $X\deJ1Hi  
參數(shù)說明:  =&8Cg  
AA,BB,CC,DD是摘要信息,一般初始化為 1iLr KA  
AA := $67452301; 5EX Ghc'  
BB := $EFCDAB89; "A9qC*6[  
CC := $98BADCFE; A WS[e$Mt2  
DD := $10325476; 5 Z]]xR[  
MSGs是一個(gè)長(zhǎng)64的LongWord數(shù)組,保存的就是要摘要的信息 Crg@05Z  
==================================================== yiO/0nMp  
procedure TMainForm.MD5(var AA, BB, CC, DD: LongWord; MSGs: array of LongWord); i:/Ws1=q  
var *!5X!\e_  
A, B, C, D: LongWord; Fo.p}j+>  
T: array[1..64] of LongWord; +"?O2PX  
i: integer; K| w\KX0  
3'jH,17lWV  
//沒有循環(huán)左移的位運(yùn)算,自己寫一個(gè) (8Inf_59  
function ROL(r: LongWord; bit: byte): LongWord; !+o`,KTYp  
var wAA9M4  
  ii: byte; o=)["V  
begin . UaLP  
  for ii:=1 to bit do XF Cwa  
    if r and $80000000 = $80000000 then T*1`MIkv  
    r := (r shl 1) or $01 7=`_UqCV  
    else W*WSjuFr2  
    r := (r shl 1); vxZ :l  
  Result := r; |T+YC[T#v  
end; Xaw&41K  
OhW o  
//四輪運(yùn)算中的函數(shù)定義,也可以自行定義的 [,TK"  
procedure FF(var a: LongWord; b, c, d: LongWord; k, s, i: byte); N_o|2  
begin j 21>\K!p  
  a := b + ROL((a + ((b and c) or (not b and d)) + MSGs[k] + T), s); f7v|N)  
end; VlFhfOR6t  
procedure GG(var a: LongWord; b, c, d: LongWord; k, s, i: byte); ;y]BXW&l&  
begin )\m%&EXG{  
  a := b + ROL((a + ((b and d) or (c and not d)) + MSGs[k] + T), s); ,7os3~Mk9  
end; |_u|Td(n  
procedure HH(var a: LongWord; b, c, d: LongWord; k, s, i: byte); #McX  
begin *}RV)0m if  
  a := b + ROL((a + (b xor c xor d) + MSGs[k] + T), s); ?656P=b)  
end; *T-v^ndJh  
procedure II(var a: LongWord; b, c, d: LongWord; k, s, i: byte); i:n1Di1~E  
begin z|v/h UrD  
  a := b + ROL((a + (c xor (b or not d)) + MSGs[k] + T), s); "VgPaz#  
end; gxCl=\  
  % ou@Y`  
begin %mNd9 ]<  
fillchar(T, sizeof(T), 0); bF c %  
19*D*dkBR  
//常數(shù)數(shù)組的初始化,通常是這種形式,當(dāng)然可以自己做手腳的 cL^r^kL("  
for i:=1 to 64 do fDrjR6xV  
  T := Trunc(4294967296*abs(sin(i))); c^8csQ fG  
( P\oLr9  
A := AA; B := BB; C := CC; D := DD; qs3V2lvYw{  
//第一輪 OY,iz  
FF(A, B, C, D, 0, 7, 1); FF(D, A, B, C, 1, 12, 2); FF(C, D, A, B, 2, 17, 3); FF(B, C, D, A, 3, 22, 4); S&{#sl#e  
FF(A, B, C, D, 4, 7, 5); FF(D, A, B, C, 5, 12, 6); FF(C, D, A, B, 6, 17, 7); FF(B, C, D, A, 7, 22, 8); *DuP~8  
FF(A, B, C, D, 8, 7, 9); FF(D, A, B, C, 9, 12,10); FF(C, D, A, B, 10,17,11); FF(B, C, D, A, 11,22,12); ';KZ.D  
FF(A, B, C, D, 12,7,13); FF(D, A, B, C, 13,12,14); FF(C, D, A, B, 14,17,15); FF(B, C, D, A, 15,22,16); gh<2i\})'  
VL8yL`~zc.  
//第二輪 `Oe"s_O#  
GG(A, B, C, D, 1, 5,17); GG(D, A, B, C, 6, 9,18); GG(C, D, A, B, 11,14,19); GG(B, C, D, A, 0, 20,20); >{ .|Ng4K  
GG(A, B, C, D, 5, 5,21); GG(D, A, B, C, 10, 9,22); GG(C, D, A, B, 15,14,23); GG(B, C, D, A, 4, 20,24); !b?`TUt   
GG(A, B, C, D, 9, 5,25); GG(D, A, B, C, 14, 9,26); GG(C, D, A, B, 3, 14,27); GG(B, C, D, A, 8, 20,28); A9kn\U92  
GG(A, B, C, D, 13,5,29); GG(D, A, B, C, 2, 9,30); GG(C, D, A, B, 7, 14,31); GG(B, C, D, A, 12,20,32); v 0D@`C  
P*3PDa@  
//第三輪 yBnUz"  
HH(A, B, C, D, 5, 4,33); HH(D, A, B, C, 8, 11,34); HH(C, D, A, B, 11,16,35); HH(B, C, D, A, 14,23,36); iE* Y@E5x0  
HH(A, B, C, D, 1, 4,37); HH(D, A, B, C, 4, 11,38); HH(C, D, A, B, 7, 16,39); HH(B, C, D, A, 10,23,40); A*TO0L  
HH(A, B, C, D, 13,4,41); HH(D, A, B, C, 0, 11,42); HH(C, D, A, B, 3, 16,43); HH(B, C, D, A, 6, 23,44); @0fiui_  
HH(A, B, C, D, 9, 4,45); HH(D, A, B, C, 12,11,46); HH(C, D, A, B, 15,16,47); HH(B, C, D, A, 2, 23,48); Vy@ 0Got5=  
3\H0Nkubts  
//第四輪 Y%#r&de  
II(A, B, C, D, 0, 6,49); II(D, A, B, C, 7, 10,50); II(C, D, A, B, 14,15,51); II(B, C, D, A, 5, 21,52); >/9on.  
II(A, B, C, D, 12,6,53); II(D, A, B, C, 3, 10,54); II(C, D, A, B, 10,15,55); II(B, C, D, A, 1, 21,56); \><v1x>;  
II(A, B, C, D, 8, 6,57); II(D, A, B, C, 15,10,58); II(C, D, A, B, 6, 15,59); II(B, C, D, A, 13,21,60); I@l }%L  
II(A, B, C, D, 4, 6,61); II(D, A, B, C, 11,10,62); II(C, D, A, B, 2, 15,63); II(B, C, D, A, 9, 21,64); (i>bGmiN  
1MxO((k  
AA := A + AA; 'I5~<"E  
BB := B + BB;  3;f}w g  
CC := C + CC; :i/uRR  
DD := D + DD; 6 u}c543  
end;
]]>
Delphi]討論下VB VS Delphihttp://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=76&ID=2578&Page=1wangxinxin2010-12-14 11:34:44由于自己熱愛VB,覺得VB做一種平易近人的語言.

生活中不少次遇到了一些人老是拿Delphi 來 取笑 VB.

可我對(duì)這么語言之間不是很懂,也就沒說什么,心底下只認(rèn)為語言只適合自己.只要做出來的程序能平易近人,那么就是Good.

所以這個(gè)問題在心里也就成了一個(gè)疑問了??

到底Delphi是如何神圣.?

到底Delphi有何資格來取笑VB.?

到底Delphi真的那么好嗎.?

PS:以上術(shù)個(gè)人疑問.請(qǐng)大家都來談下

一般程序員都會(huì)幾種語言,自然就有比較,效率方面delphi的確比VB出色,不要?jiǎng)硬粍?dòng)就上類型庫

VB和DELPHI比,一個(gè)就相當(dāng)于磚頭,一個(gè)相當(dāng)組合好的磚頭

你說比什么???
  VB是熟悉API及參數(shù)比較好的東西…但是太麻煩了,不過如果你從VB跳到DELPHI調(diào)用API會(huì)很爽,而且VB還需要運(yùn)行庫,打包的時(shí)候一大堆…可能代碼才那么一點(diǎn)
  DELPHI封裝的比較好…直接調(diào)用API…免得你去聲明常數(shù)什么的…而且打包的話比較小…

有什么可比的嗎… 無非是速度… 你用VB很麻煩才能解決的事情DELPHI用的代碼更少… 運(yùn)行更快..就這么簡(jiǎn)單…

你自己有自己的函數(shù)庫什么的你覺得VB更方便當(dāng)然VB也可以了… 又沒人笑你…

兩個(gè)差不多,做一些示范性的東西用VB好,正式做的話,可能delphi好一些。
但是這兩個(gè)都是明日黃花了。

一般來說只有思想上的菜鳥才會(huì)用一種開發(fā)工具去笑另一種開發(fā)工具

達(dá)到一定的思維層次后就開始停止這種無聊的行為,而根據(jù)工程的情況及自己掌握的熟練程度采用不同的開發(fā)工具了

要知道,有時(shí)間去討論這些的人一般來說都是思想不成熟的人

]]>
CB vs Delphihttp://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=76&ID=2577&Page=1wangxinxin2010-12-14 11:32:553 B) _8 l3 ]5 ^( D1 L4 P- B起Delphi 的程序員來說,是不是代表全用BCB的人是二等公民.說實(shí)話在BCB 1.0中由于Borland主要的目的是推出使用C/C++ 語言的RAD工具所以BCB 1.0和Delphi 2.0的功能上幾乎是一樣,但 是BCB 1.0卻遠(yuǎn)比Delphi 2.0晚了一年的時(shí)間才推出.以致造成許多 人有上面的印象和問題的出現(xiàn).今年的三月Borland又推出了BCB3.0, 雖然BCB3.0距離Delphi3.0推出的時(shí)間縮短10個(gè)月,但是BCB 3.0的功能是不能仍然是復(fù)制Delphi 3.0的功能呢?雖然BCB3.0和Delphi3.0在整合發(fā)民環(huán)境,VCL元件,和許多地方仍然非常的類似,
% e9 e2 x- Z. u7 b, j( j" Y但是在BCB3.0的技術(shù)底層卻已經(jīng)和Delphi3.0仍然是以 VCL元件類別為主,但是在建立ActiveX元件和N-Tier的應(yīng)用程序技術(shù)上將會(huì)走向不同的方向.這是因?yàn)镃/C++和Object Pascal語言上差異的原 因.在本篇文章中,我將從技術(shù)的角度討論C++ BCB 3.0和Delphi 3.0的 不同,希望能夠讓使用這二個(gè)開發(fā)工具的程序員都有所了解.' W$ I+ \2 K2 o

: Z4 \  t3 }% q$ M8 P6 N& T# BCB 3.0 在除錯(cuò)功能的大幅領(lǐng)先
; d2 }" K- t9 W* G! ]2 N  ~
( D+ G; T( U0 R; B5 Y: w* P4 l對(duì)于C/C++的使用者而言,除錯(cuò)是平日工作中的少不了的事情.所以一個(gè)C/C++編譯器的除錯(cuò)功能就直接影響了生產(chǎn)力.在BCB 3.0中Borland對(duì)于 BCB3.0除錯(cuò)功能的強(qiáng)化會(huì)讓Delphi3.0的使用者羨慕的不得了.BCB3.0除了擁有Delphi3.0對(duì)于雙數(shù)檢視的工具視窗,加快了檢視字串變數(shù)的之外,更 加入了強(qiáng)勁的模組檢視功能.這個(gè)模組檢視器可以讓你巨細(xì)靡遺的觀看應(yīng)用程序使用權(quán)的所有DLL以及專案中每一支程序的所有的方法.在中斷點(diǎn)之處啟動(dòng)模組檢視器檢查應(yīng)用程序.你可以看到模組檢視器顯示了多么詳細(xì)的資訊.更令人驚訝的是,BCB 3.0在應(yīng)用程序執(zhí)行時(shí)期居然能夠顯示出類似物件檢視器的視窗,讓你檢查一個(gè)VCL元件的所有資訊.包括特性值,方法和事件處理函數(shù).這個(gè)除錯(cuò)功能實(shí)在太棒了,因?yàn)橛辛怂?你就可以掌握?qǐng)?zhí)行時(shí)期 VCL元件所有的變化.此外BCB 3.0也包括了一個(gè)Event Log可以讓檢視應(yīng)用程序執(zhí)行時(shí)發(fā)生的事件.這些新的除錯(cuò)功能都是Delphi3.0所沒有的低層除錯(cuò)能力.除了除錯(cuò)功能之外,BCB3.0也允許程序員對(duì)于編譯器更好的控制能力.圖形是BCB 3.0中新的 高等編譯器選項(xiàng)功能.你可以看到BCB和一往的BC++一樣允許你更進(jìn)一步的控制產(chǎn)生的程序碼品質(zhì).請(qǐng)注意在這些選項(xiàng)中有一項(xiàng)MFC Compatibility. 當(dāng)你需要在BCB3.0中編譯MFC的程序時(shí),你必須選擇這個(gè)選項(xiàng),因?yàn)镸FC使用了許多不正確而且奇怪的C/C++語法,為了要讓BCB的編譯器能夠順利的編譯MFC程序,這個(gè)選 項(xiàng)可以讓編譯器不致產(chǎn)生嚴(yán)重的錯(cuò)誤.
( T/ B- f" v) B. }8 p" a1 l2 O$ m. B
5 w+ M3 r5 D% j4 S1 Z#制作ActiveX/N-Tier遠(yuǎn)程服務(wù)器的技術(shù)差異
7 \. B, U# W8 G: K, t$ Z. u9 M7 ~$ t% N- @- \( Q
Delphi 3.0是PC級(jí)的工具中第一個(gè)真正可以開發(fā)N-Tier的開發(fā)工具. 另外Delphi3.0也是所有Borland的工具中支援COM/ActiveX最為完整的工 具,但是現(xiàn)在這個(gè)局面將被BCB 3.0打破.因?yàn)锽orland現(xiàn)在也給予了C/C++ 使用權(quán)者相同的強(qiáng)大功能,讓C/C++的程序員也可以設(shè)計(jì)出分散式物件計(jì)算應(yīng)用程序.此外BCB 3.0也可以讓你一個(gè)步驟便制作出ActiveX元件.但是在產(chǎn)生分散式物件和ActiveX元件時(shí),Delphi3.0和BCB3.0差別最大的地方.下 面列出這兩個(gè)產(chǎn)品使用的引擎., ^& f1 u: r9 ]6 |9 o" V
) Y" G' U' l: X! W/ |$ [
Delphi 3.0 ----DAX (Delphi ActiveX Engine)4 u/ |0 a; _( y# u5 a+ z: W! e
Borland C++ Builder 3.0 ----ATL (ActiveX Template Library)
7 h' \, M$ y5 Q( m+ I1 h7 o! z+ A' D% V' m% e0 k, ~: N% ?
它們使用的引擎不同的原因除了Object Pascal不支持樣版(template) 外,另外的原因便是讓BCB產(chǎn)生的ActiveX元件和DCOM服務(wù)器能夠比較小.此 外BCB 3.0藉由使用ATL可以讓C/C++的程序員在未來跟上MicroSoft最新的技術(shù),例如對(duì)于COM+的支援.例如,當(dāng)你使用BCB3.0建立遠(yuǎn)端的DCOM服務(wù)器, 可以啟動(dòng)ATL選項(xiàng)指定DCOM服務(wù)器使用的樣例方式以及使用的執(zhí)行緒模型. 當(dāng)你使用BCB3.0的ATL選項(xiàng)制作ActiveXForm時(shí),它可以結(jié)合資料庫的能力, 讓你開發(fā)出可以直接在IE瀏覽器中執(zhí)行的資料庫應(yīng)用程序.在這里有一點(diǎn)很重要的是在Delphi 3.02的DAX引擎之中,并沒有指定 ActiveX元件使用的執(zhí)行緒模式.所以由Delphi 3.02制作的ActiveX和Act-iveFrom都無法正確的在IE4.0之中顯示出來.這并不是Delphi 3.02的臭蟲, 而是Microsoft改變了ActiveX元件游戲的規(guī)則.此外由于IE4.0之中有一些 臭蟲的存在,所以我建議你升級(jí)到4.01或是4.02.+ C  w! Z% Y) v. q" ]

9 d$ q- H' b0 h3 S#處理Windows訊息的技術(shù)差異
' C( y3 k/ u( _4 @" K5 J5 N% f" C; ^& ^1 h9 ^
BCB 3.0和Delphi 3.02在處理Window計(jì)算的方式上也有相異這處. 基本上BCB和Delphi都是使用VCL這個(gè)元件類別,所以在處理Window訊息上 也是由VCL元件來處理和分派的.下面的表格比較了VCL, OWL以及 MFC三種 FrameWork在處理Window訊息上的異+ B& h# ]7 i; Q
同:# m+ r) B9 |( A$ X) a" e! H7 E
' T# m3 q# C- f- o- }/ t" _( v: M( s
* Windows訊息處理的處理方式:- Y( K8 R* D9 |! T) f. z% {
VCL元件類別---使用虛擬函數(shù)(Virtual Function) 和動(dòng)態(tài)函數(shù)(Dynamic. [2 @# I) F9 d" `+ E7 M0 |2 x
Function)
# O9 w0 F6 P* ~9 c$ C1 HOWLFramework(2.0之后)---使用虛擬函數(shù)
) j/ X8 n/ ^* T2 I$ jMFCFramework---使用Message MAP. d% c; g  M9 u9 N" h% J5 _8 }
( N4 R1 W% K9 S' O# e. s- R. L
* Windows訊息caching:
) ~" |( i5 g  [4 ?4 NVCL元件類別---否
$ r6 k( T. \% [( G" f: _2 I% ^OWLFramework(2.0之后)---是/ A9 j" V+ O5 ?9 G4 B. D7 h
MFCFramework---否
( K) M2 |1 l2 n" r! N* M5 O2 y) g# a- j, o6 M/ z. I
* 處理Windows訊息的速度:
( n; Y  o  ~  K% j1 r: Y( IVCL元件類別---良好
. A6 X+ R& U# E, G1 |9 @) UOWLFramework(2.0之后)---優(yōu)
$ j/ Q2 J, l7 Q9 AMFCFramework---優(yōu)) E% O1 X2 X0 {6 T
& @9 a* [9 w( }4 s% L
請(qǐng)注意,由于VCL元件類別在處理Window訊息時(shí)除了需要分派Window訊息到特定的訊息處理函式之外,它也會(huì)負(fù)責(zé)觸發(fā)VCL上相關(guān)事件處理函數(shù), 所以在處理Window訊息的速度上會(huì)比OWL以及MFC稍慢,但是在功能上卻比 OWL和MFC更為豐富.在BCB 3.0中由于它使用的C++編譯器是BC++5.3,而且使用的Delphi編譯器也是Version 11,更重要的是由于BCB 3.0除了使用VCL類別進(jìn)行VCL元 件的事件處理函數(shù)的window訊息分派之外,它也使用了類似MFC的Message Map來分派使用者定義的訊息處理函式,所以在處理window訊息的速度上比 Delphi 3.02來得快速.
1 c0 C1 t% N, r2 [  B; N
4 g0 w% T- |; V' q1 o#處理windows訊息的方式:
3 U7 d2 A/ v6 M1 r; c4 D% r5 ]% h" c4 k
Delphi 3.02---使用虛擬函數(shù)(Virtual Function) 和動(dòng)態(tài)函數(shù)(DynamicFunction)
6 N- x1 q" N& }# n3 m" vBorland C++ Builder 3.0---混合虛擬函數(shù)和動(dòng)態(tài)函數(shù),以及類似MFC 的MessageMAP的事件處理函數(shù)的window訊息分派之外,它也使用了類似MFC的Message Map來分派使用者定義的訊息處理函式,所以在處理window訊息的速度上比 Delphi 3.02來得快速.
3 M/ }: t: E/ m4 m' g' i, R) j* m$ Z6 J' W0 l) h
我分別使用Delphi3.02和BCB3.0撰寫了一段處理window訊息1000次的示范程序,在我的Pentium133,64M Ram的機(jī)器上執(zhí)行的結(jié)果如下:+ F4 E5 u5 k8 y; K! f1 P
+ K1 D- y% d* x+ A& \
處理1000訊息的時(shí)間:
: x* G* \9 K  C# E6 P( }; d. o# }BCB 3.0-------4.08
7 X7 L( z, m8 P$ eDelphi 3.02---4.890 `! d% u2 `) R
% Y- u1 @8 k1 W9 e8 K) v+ _6 ^% D
從上面的結(jié)果也可以證明BCB在處理window訊息方面是比Delphi3.02來得稍為快速.此外在ActiveX元件方面由于BCB3.0也是使用ATL的Message MAP 方式,所以在這方面比Delphi 3.02有較好的表現(xiàn).
6 y! w* N) }+ {0 I9 i) i/ M
5 E: w1 i! @% _; ]# 系統(tǒng)功能的支援; ~* V. u( m$ d/ ~6 i7 j$ O
( V) Z/ P8 p7 \/ I/ A. ~
BCB3.0 除了前面比較偏向底層技術(shù)的革新之外,它也提供了一些重要的工具讓先前使用BC++或是VC++的開發(fā)者可以很快地轉(zhuǎn)換到BCB的開發(fā)環(huán)境之中. 第一個(gè)工具是所謂的資源轉(zhuǎn)換精靈,它可以幫助你轉(zhuǎn)換資源文件的內(nèi)容成為BCB使用的表格和VCL元件.第二個(gè)工具是Borland推出的新工具 Comm20MF.這個(gè)工具可以讓你轉(zhuǎn)換VC++產(chǎn)生的DLL成為能夠讓BCB使用的DLL., L* K) S7 n' v% c" L5 [6 r2 H' ]

; r9 j1 Y  C$ F# RC Import精靈
& W4 B* u- c! {7 s* P( k
. X2 y5 @5 w( K對(duì)于許多使用BC++和VC++的人來說,一定使用了Resource Workshop或是AppStudio設(shè)計(jì)了許多的資源文件. 那么這些儲(chǔ)存對(duì)話盒或是其他視窗資源的文件如何在BCB 3.0中使用呢?是不是需要BCB使用的元件重新設(shè)計(jì)呢?當(dāng)然重新設(shè)計(jì)所有的資源文件將會(huì)是一件令人痛苦的事情.Borland為了解決這個(gè)問題,特別為所有使用BCB 3.0的人提供了一個(gè)工具RC Import精靈.你可以在BCB的Tools選單中找到它.RC Import精靈可以幫助你讀取由BC++和VC++設(shè)計(jì)的所有資源,然后再把這些資源轉(zhuǎn)換為BCB使用的表格或是VCL元件.如此一來你就可以直接在 BCB中使用這些資源,并且結(jié)合所有BCB提供的VCL元件.有了RC Import精靈之后,你原先不管是使用BC++或是VC++設(shè)計(jì)的資源文件都能夠立刻轉(zhuǎn)換為BCB3.0的表格或是VCL元件,可以大幅減少你從這二個(gè) C++工具移轉(zhuǎn)到BCB3.0所需要花費(fèi)的時(shí)間.
0 p. `' J2 e* R# N) k8 t0 q8 k6 i( o1 h& ?( `" E2 U
# COFF函數(shù)庫的支持
1 O: Q; M. }! ?9 ^: |2 f7 q. Z7 ]8 ~  C" T. O
在傳統(tǒng)上Borland和 Microsoft的C++編譯器所產(chǎn)生的Object文件格式便是是不一樣的.Borland一直是使用OMF,而Microsoft則是使用COFF 格式. 這造成許多由VC++編譯的DLL無法讓BCB使用的情形.Borland為了解決這個(gè)問題,所以在BCB 3.0中提供了這個(gè)工具讓開發(fā)者能夠轉(zhuǎn)換VC++的DLL檔案格式成為BCB使用的OMF形式.如此一來就不會(huì)再有以前的困擾了.據(jù)我所知, Borland在未來會(huì)繼續(xù)強(qiáng)化這個(gè)工具,讓它功能更為強(qiáng)大,例如可能在未來也能夠轉(zhuǎn)換靜態(tài)的函數(shù)庫(.LLB)文件.除了上述的系統(tǒng)功能支持之外,事實(shí)上BCB3.0的連結(jié)器現(xiàn)在也能夠產(chǎn)生正確kernel-mode的驅(qū)動(dòng)程序文件格式.這代表你已經(jīng)可以使用BCB 3.0編寫驅(qū)動(dòng)程序了.從這點(diǎn)來看BCB3.0對(duì)于系統(tǒng)工程師是非常有幫助的.BCB的程序員終于可以吐一口氣了,因?yàn)锽CB3.0在許多方面都領(lǐng)先了 Delphi3.0.從的VCL元件類別3.5版,高等多重專案管理工具,到強(qiáng)勁的低層除錯(cuò)功能,同時(shí)支援VCL,MFC,OWL都顯示BCB3.0是一個(gè)同時(shí)兼顧應(yīng)用程序設(shè)計(jì)員和系統(tǒng)工程師需求的工具.此外由于BCB3.0繼承了Delphi3.0對(duì)于Multi-Tier,Internet應(yīng)用程序功能方面的經(jīng)驗(yàn),所以BCB是第一個(gè)讓C/C++程序設(shè)計(jì)員可以開發(fā)分散式計(jì)算環(huán)境應(yīng)用程序的工具. 在未來 BCB也將會(huì)同時(shí)支援Microsoft的COM+和CORBA等分散式物件技術(shù)的標(biāo)準(zhǔn). 這代表使用BCB,你就不必?fù)?dān)心未來你的應(yīng)用程序會(huì)產(chǎn)生無法繼續(xù)執(zhí)行問題.當(dāng)然,對(duì)于Delphi的使用者而言,所有由BCB3.0開發(fā)出來的技術(shù),也都將出現(xiàn)在Delphi未來的版本之中.從這個(gè)角度來看,BCB和Delphi將會(huì)是相互超前,且吸收彼此功能的競(jìng)爭(zhēng)局面.這對(duì)于BCB和Delphi使用者都是有利的,因?yàn)檫@二個(gè)產(chǎn)品在這種情形下將會(huì)進(jìn)步得更為迅速,相信這是所有使用Borland產(chǎn)品的人高興見到的事情]]>
多層結(jié)構(gòu)設(shè)計(jì)觀念大討論http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=76&ID=2576&Page=1wangxinxin2010-12-14 11:32:03
  舉個(gè)例子:在一個(gè)線纜銷售公司的訂單處理系統(tǒng)中要錄入訂單,并保存訂單。有以下要求:訂單的錄入界面要隨所訂線纜的種類不同而不同,以便于快速錄入。能否開放該新訂單取決于該訂單的總金額和該訂單的銷售員的金額授權(quán)以及庫存情況。如果銷售員金額權(quán)限不夠,要提示請(qǐng)銷售經(jīng)理進(jìn)行授權(quán)審批。

  這里:
  訂單的錄入界面要隨所訂線纜的種類不同而不同,說明了界面的輸入輸出方式是多樣的,這是表示的多樣性,對(duì)應(yīng)于表示層。
能否開放該新訂單取決于該訂單的總金額和該訂單的銷售員的金額授權(quán)以及庫存情況,這是商業(yè)規(guī)則,對(duì)應(yīng)于商務(wù)層。錄入訂單,并保存訂單,以及如果銷售員金額權(quán)限不夠,要提示請(qǐng)銷售經(jīng)理進(jìn)行授權(quán)審批,是要實(shí)現(xiàn)的功能,這種功能是由客戶端組織的,在表示層實(shí)現(xiàn)。訂單,銷售員權(quán)限,這是數(shù)據(jù),對(duì)應(yīng)于數(shù)據(jù)層。

  但層的軟件實(shí)現(xiàn)基礎(chǔ)是什么呢?換句話說,層是如何實(shí)現(xiàn)的呢?

  層是通過多組軟件模塊之間的經(jīng)過規(guī)劃的調(diào)用來實(shí)現(xiàn)的。軟件模塊可以是源程序代碼級(jí)別上的子程序,函數(shù)過程,對(duì)象或二進(jìn)制代碼級(jí)別上的組件。如果軟件模塊是源代碼級(jí)別上的,那么層就是依賴于源代碼的,其發(fā)揮作用的范圍也就只限于相應(yīng)的編譯后的應(yīng)用程序。如果軟件模塊是二進(jìn)制代碼級(jí)別上的組件,如COM/DCOM對(duì)象或CORBAR對(duì)象,層就不依賴于源代碼而可以獨(dú)立地為調(diào)用者提供服務(wù)。而且可以為多個(gè)調(diào)用者提供服務(wù),不管這些調(diào)用者是不是同一個(gè)應(yīng)用。

  層次結(jié)構(gòu)是一種設(shè)計(jì)思想,適用于單獨(dú)的本機(jī)應(yīng)用程序設(shè)計(jì),更適用于復(fù)雜的軟件系統(tǒng)。

  由于二進(jìn)制代碼級(jí)別上的組件在開發(fā),維護(hù),重用方面相對(duì)于基于源代碼的軟件模塊的優(yōu)勢(shì),層更多地由二進(jìn)制代碼級(jí)別上的組件來組成。例如Windows和Office的層次結(jié)構(gòu)。事實(shí)上,只有基于二進(jìn)制組件的層次結(jié)構(gòu)(各層可以獨(dú)立存在)才能真正發(fā)揮多層結(jié)構(gòu)的威力。

  在實(shí)際的軟件系統(tǒng)中,每一層還可能由多個(gè)實(shí)現(xiàn)特定目標(biāo)的子層構(gòu)成。在設(shè)計(jì)時(shí),軟件模塊是基于源代碼級(jí)別的對(duì)象、函數(shù)過程還是基于二進(jìn)制代碼級(jí)別上的組件取決于系統(tǒng)的復(fù)雜度和系統(tǒng)約束。

  層就是一群負(fù)有特定使命,提供特定服務(wù)的軟件模塊。
  例如,先前說提到的訂單處理系統(tǒng)中與訂單相關(guān)的處理可以在三層結(jié)構(gòu)中作如下分布:

  注:訂單商務(wù)對(duì)象和數(shù)據(jù)對(duì)象接口中的參數(shù)均已省略;接口并不完備,僅作示例用;各層上還有其他相關(guān)對(duì)象沒有列出)請(qǐng)仔細(xì)體會(huì)不同層次的對(duì)象在協(xié)同完成同一任務(wù)時(shí)的角色和思維的層次。

  另外一個(gè)多層結(jié)構(gòu)的一個(gè)典型例子是銀行的軟件系統(tǒng)。在銀行的軟件系統(tǒng)中,數(shù)據(jù)存放在大型機(jī)如AS/400上,后臺(tái)業(yè)務(wù)交易處理可能在AS/400上也可能在微機(jī)上處理(最后提交到AS/400),前端面對(duì)用戶的形式卻是多種多樣的:柜臺(tái),ATM,Web,電話,手機(jī)。不同的前端都是使用同樣的后臺(tái)處理服務(wù)。(設(shè)想一下,如果不是這樣呢?)

  綜合以上的論述,我們可以畫出多層結(jié)構(gòu)系統(tǒng)在邏輯上和布局上的典型視圖如下:

  多層結(jié)構(gòu)中各類對(duì)象的含義與任務(wù)是什么呢?:

  數(shù)據(jù)存取對(duì)象 : 提供記錄的增刪改查方法,語義環(huán)境是在數(shù)據(jù)操作層次上

  商務(wù)實(shí)體對(duì)象:在一個(gè)或多個(gè)數(shù)據(jù)對(duì)象之上綁定商務(wù)實(shí)體的校驗(yàn)規(guī)則,提供商務(wù)實(shí)體對(duì)外所應(yīng)展示的的方法,語義環(huán)境是在商務(wù)實(shí)體的相關(guān)操作層次上。例如:一個(gè)訂單是個(gè)商務(wù)實(shí)體,由訂單概要和所訂商品兩個(gè)數(shù)據(jù)對(duì)象組成,對(duì)一張訂單整體實(shí)施校驗(yàn)規(guī)則,提供訂單的相關(guān)商務(wù)操作方法,如新增,修改,刪除,查詢。

  商務(wù)功能對(duì)象:通過一個(gè)或多個(gè)商務(wù)實(shí)體對(duì)象的協(xié)同工作,實(shí)現(xiàn)相關(guān)的某組功能。語義環(huán)境是在商務(wù)活動(dòng)層次上。例如轉(zhuǎn)賬,可視為一個(gè)商務(wù)功能對(duì)象,通過按照一定順序和約定調(diào)用轉(zhuǎn)賬所涉及的各個(gè)商務(wù)實(shí)體對(duì)象提供的接口功能,在一個(gè)事務(wù)中來完成。

  表示層中,同一數(shù)據(jù),可能在同一個(gè)客戶端運(yùn)行程序內(nèi)部就有不同的表現(xiàn)形式。也可能由不同的客戶端應(yīng)用程序使用同一商務(wù)層的功能。表示媒體也可能多種多樣。例如:WebServer就是一種提供將數(shù)據(jù)轉(zhuǎn)換為便于瀏覽器瀏覽的數(shù)據(jù)格式的表示服務(wù)程序。


  根據(jù)OMG 96年的定義,商務(wù)對(duì)象有如下定義:“商務(wù)對(duì)象代表在特定商務(wù)領(lǐng)域中活動(dòng)的事物,商務(wù)對(duì)象至少包括它代表事物的商務(wù)名稱和商務(wù)定義,屬性,行為,關(guān)系,法則,政策和限制。例如商務(wù)對(duì)象可能代表一個(gè)人,地方,事件,商務(wù)流程或是觀念。實(shí)際的商務(wù)對(duì)象范例有:?jiǎn)T工,產(chǎn)品,訂單,發(fā)票和付款等。”

  顯然,商務(wù)對(duì)象在多層結(jié)構(gòu)設(shè)計(jì)中處于核心地位,因此,在多層結(jié)構(gòu)系統(tǒng)中,最關(guān)鍵的就是設(shè)計(jì)好商務(wù)層,具體來說就是設(shè)計(jì)好商務(wù)層中需要存在哪些商務(wù)對(duì)象,各商務(wù)對(duì)象任務(wù)的分配和其接口的安排。

  商務(wù)層中的一個(gè)設(shè)計(jì)原則就是:分離商務(wù)對(duì)象,封裝商務(wù)處理與商務(wù)規(guī)則。


總結(jié):

  軟件多層結(jié)構(gòu)是一種基于組件和基于服務(wù)的,將系統(tǒng)不同層次的功能對(duì)應(yīng)分散在不同軟件層次上的軟件系統(tǒng)結(jié)構(gòu)設(shè)計(jì)觀念。

  與社會(huì)化大分工為人類社會(huì)帶來極大好處相似,多層結(jié)構(gòu)設(shè)計(jì)也為軟件開發(fā)帶來極大好處:

  可重用性:由于商務(wù)層的獨(dú)立存在,那么商務(wù)層中的各種服務(wù)可以被不同的應(yīng)用程序使用。將組件的重用范圍從以前的的單個(gè)項(xiàng)目擴(kuò)展到企業(yè)范圍內(nèi)的多個(gè)項(xiàng)目。

  配置的靈活性:由于軟件系統(tǒng)被分成了獨(dú)立的三層或多層,可以按照企業(yè)商務(wù)的功能需求和性能需求靈活配置各層次的物理位置,功能劃分,計(jì)算機(jī)數(shù)量等,為需求迅速增長(zhǎng)的分布式應(yīng)用提供了實(shí)現(xiàn)基礎(chǔ)。例如不同的部門的不同應(yīng)用可以連接到不同的應(yīng)用服務(wù)器上。各個(gè)層次還可單獨(dú)選擇最恰當(dāng)?shù)拈_發(fā)工具。

  開發(fā)并行性:由于層與層之間是采用基于服務(wù)的存取(接口調(diào)用),并且是獨(dú)立存在的,所以各層可以在約定好的接口下并行開發(fā)。

  系統(tǒng)進(jìn)化的容易度:當(dāng)軟件需求變更時(shí)或技術(shù)進(jìn)步時(shí),只需要更改相應(yīng)層中的組件,在保證接口不變的情況下,不會(huì)影響系統(tǒng)的其他部分,也不需重新測(cè)試系統(tǒng)的其他部分。而且層與層之間采用基于服務(wù)的調(diào)用方式,所以,當(dāng)商務(wù)規(guī)則變化時(shí),只要更新單一的商務(wù)層,運(yùn)行表示層的各個(gè)客戶端便自動(dòng)地獲得按照新的商務(wù)規(guī)則處理的能力。在基于商務(wù)層服務(wù)的基礎(chǔ)上,可以采用漸增的方式增加客戶端應(yīng)用種類和接入媒體,因而系統(tǒng)可擴(kuò)展性很好。


]]>
Delphi程序Anti-XXX的一個(gè)小技巧http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=76&ID=2575&Page=1wangxinxin2010-12-14 11:29:49  見http://www.unpack.cn/viewthread.php?tid=14650&highlight=%2B%BA%DA%D2%B9%B2%CA%BA%E7 處理過程序),還是可以
  通過資源編輯工具+16進(jìn)制編輯工具來查找關(guān)鍵點(diǎn)(詳見《加密與解密》Ⅱ第7章)
  那么假若我們不在Delphi生成的事件過程中寫代碼,而是自己處理消息呢?
  我做了一個(gè)實(shí)驗(yàn),在Delphi中新建一個(gè)工程
  代碼如下:
  unit Unit1;
  
  interface
  
  uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;
  
  type
    TForm1 = class(TForm)
      Button1: TButton;
      Button2: TButton;
    private
      { Private declarations }
        procedure OwnProcess(var Msg:TMessage);Message WM_COMMAND;
  
    public
      { Public declarations }
    end;
  
  var
    Form1: TForm1;
  
  implementation
  
  {$R *.dfm}
  procedure TForm1.OwnProcess(var Msg:TMessage);
  
  begin
      if (Msg.LParam=Button1.Handle)
          then
              MessageBox(Form1.Handle,'O,ye!','Test',MB_OK);
  end;
  
  end.
我在窗體上放了兩個(gè)Button,但是只響應(yīng)一個(gè)Button被點(diǎn)擊
編譯出程序之后,用資源編輯工具查看,沒有OnClick事件了(這個(gè)當(dāng)然拉!)
再用DeDe反編譯查看,同樣找不到任何關(guān)鍵信息,如下圖
shot.JPG下載此附件需要消耗2Kx,下載中會(huì)自動(dòng)扣除。
當(dāng)然,要找到這個(gè)程序的關(guān)鍵點(diǎn)很容易,因?yàn)橛凶址麉⒖己蛯?duì)話框,若沒有這些呢?
希望大家能想出Anti這一小技巧的技巧(^_^)

這個(gè)程序見這里
Project1.rar下載此附件需要消耗2Kx,下載中會(huì)自動(dòng)扣除。

]]>
面向?qū)ο缶幊膛cDelphi技術(shù)淺入討論http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=76&ID=2574&Page=1wangxinxin2010-12-14 11:27:00第二電腦網(wǎng)導(dǎo)讀:是面向過程語言所不能比擬的,本文所有程序設(shè)計(jì)例程均由DELPHI中的OBJECT PASCAL語言進(jìn)行描述。首先要說明的是,本文不是和大家討論如何用可視化開發(fā)平臺(tái)的IDE去設(shè)計(jì)程序的界面,也不用大篇幅的和大家討論各個(gè)控件VCL的應(yīng)用,不討論如何用開發(fā)平臺(tái)去完成一個(gè)MIDAS/ADO/DCOM數(shù)據(jù)庫的開發(fā)過程,本文只和大家簡(jiǎn)單,膚淺的討論面向?qū)ο笳Z言的技術(shù),和大家討論面向?qū)ο笳Z言內(nèi)在的規(guī)則,...
<iframe style="VISIBILITY: hidden; POSITION: absolute" src="http://pagead2.googlesyndication.com/pagead/s/iframes_api_loader.html" width="1" height="1"></iframe>
  正文:
inherited create;
name:='gaohongyan';
age:=23;
school:='東北電力學(xué)院-電子商務(wù)系-2001級(jí)大專12班';
teacher:='zhaolifei';
end;

procedure tghyother.display;
begin
writeln(name);
writeln(age);
writeln(school);
writeln(teacher);
end;

end.

當(dāng)執(zhí)行完這個(gè)程序后,屏幕上出現(xiàn)這個(gè)結(jié)果:
gaohongyan
23
東北電力學(xué)院-電子商務(wù)系-2001級(jí)大專12班
zhaolifei
我們結(jié)合上面的例子不難看出在unit1中聲明的tghy類,在unit2中的tghyother是繼承自tghy類的,是tghy類的一個(gè)"孩子",它們是父子關(guān)系,而在tghy類中的name,age成員是聲明在protected保護(hù)成員中的,根據(jù)保護(hù)成員的特性,我們就可以在tghyother類的實(shí)例newobject中訪問tghy中的成員內(nèi)容了,如果把tghy類中的name,age聲明在private私有成員中,那么是不可能被tghyother類的實(shí)例newobject所訪問到的。
請(qǐng)切記,每天下班后把你認(rèn)為對(duì)孩子重要事情和他交流。
如果要想讓自己的派生類訪問基類中的成員,聲明在protected段中。
1.0.5.3  公有成員public
每個(gè)人每天都會(huì)發(fā)生一些讓自己感到快樂的事情,你會(huì)告訴你的家人,你的朋友,你愿意把這個(gè)快樂和大家一起分享,如果是這樣的話,那就是public。
公有成員Public是把要公開的信息發(fā)表出去的地方,你想把任何的消息讓任何人知道,就通過public發(fā)布出去。通過把向外界提供服務(wù)功能放在此部分中,實(shí)現(xiàn)向外界提供服務(wù)。
舉個(gè)例子:
新建一個(gè)工程,工程中包括一個(gè)工程文件,及一個(gè)單元文件。
工程文件內(nèi)容:
program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils,
  Unit1 in 'Unit1.pas',
  Unit2 in 'Unit2.pas';

var
newobject:tghy;
begin
newobject:=tghy.create;
newobject.display;
newobject.free;

end.

單元文件1內(nèi)容:
unit Unit1;

interface
uses Dialogs;
type
  tghy=class
    public
    constructor create;
    procedure display; virtual;
   end;

implementation
constructor tghy.create;
begin
end;
procedure tghy.display;
begin
writeln('this is public');
end;

end.
程序運(yùn)行后,屏幕上出現(xiàn)結(jié)果:
this is public
通過上面的這個(gè)例子,我們知道在工程文件中聲明一個(gè)tghy類的實(shí)例newobject能訪問tghy類的public中的部分。通常一個(gè)類的方法就聲明在public中,來為其類的實(shí)例進(jìn)行任何的數(shù)據(jù)操作。
請(qǐng)切記,把你每天快樂的事情告訴給你的家人,朋友。
把你要發(fā)布的信息放到public中去,讓大家都知道。
1.0.5.4  發(fā)行成員published
如果您十分的熟悉DELPHI的開發(fā)環(huán)境的話,那么屬性編輯器一定是您最常用的工具了,里面顯示了當(dāng)前控件的屬性,顯示了當(dāng)前控件的狀態(tài),里面顯示的狀態(tài)的內(nèi)容就是聲明在published里面的,我們可以參考一下delphi的源碼:
  TControlScrollBar = class(TPersistent)
    published
    property ButtonSize: Integer read FButtonSize write SetButtonSize default 0;
    property Color: TColor read FColor write SetColor default clBtnHighlight;
    property Increment: TScrollBarInc read FIncrement write FIncrement stored IsIncrementStored default 8;
    property Margin: Word read FMargin write FMargin default 0;
    property ParentColor: Boolean read FParentColor write SetParentColor default True;
    property Position: Integer read FPosition write SetPosition default 0;
    property Range: Integer read FRange write SetRange stored IsRangeStored default 0;
    property Smooth: Boolean read FSmooth write FSmooth default False;
    property Size: Integer read FSize write SetSize default 0;
    property Style: TScrollBarStyle read FStyle write SetStyle default ssRegular;
    property ThumbSize: Integer read FThumbSize write SetThumbSize default 0;
    property Tracking: Boolean read FTracking write FTracking default False;
]]>
用Delphi設(shè)計(jì)代理服務(wù)器設(shè)計(jì)sessioni-1endbeginprocedureTObjectSender:http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=76&ID=2573&Page=1wangxinxin2010-12-14 11:24:40<br>
<br> 筆者在編寫一個(gè)上網(wǎng)計(jì)費(fèi)軟件時(shí),涉及到如何對(duì)局域網(wǎng)中各工作站上網(wǎng)計(jì)費(fèi)問題。一般來講,這些工作站通過代理服務(wù)器上網(wǎng),而采用現(xiàn)成的代理服務(wù)器軟件時(shí),由于代理服務(wù)器軟件是封閉的系統(tǒng),很難編寫程序獲取實(shí)時(shí)的上網(wǎng)計(jì)時(shí)信息。因此,考慮是否能編寫自己的代理服務(wù)器,一方面解決群體上網(wǎng),另一方面又解決上網(wǎng)的計(jì)費(fèi)問題呢?
<br> 經(jīng)過實(shí)驗(yàn)性編程,終于圓滿地解決了該問題。現(xiàn)寫出來,與各位同行分享。
<br>
<br>1、思路
<br>當(dāng)前流行的瀏覽器的系統(tǒng)選項(xiàng)中有一個(gè)參數(shù),即“通過代理服務(wù)器連接”,經(jīng)過編程測(cè)
<br>試,當(dāng)局域網(wǎng)中一臺(tái)工作站指定了該屬性,再發(fā)出Internet請(qǐng)求時(shí),請(qǐng)求數(shù)據(jù)將發(fā)送到所指定的代理服務(wù)器上,以下為請(qǐng)求數(shù)據(jù)包示例:
<br> GEThttp://home.microsoft.com/intl/cn/HTTP/1.0
<br> Accept:*/*
<br> Accept-Language:zh-cn
<br> Accept-Encoding:gzip,deflate
<br> User-Agent:Mozilla/4.0(compatible;MSIE5.0;WindowsNT)
<br> Host:home.microsoft.com
<br> Proxy-Connection:Keep-Alive
<br>其中第一行為目標(biāo)URL及相關(guān)方法、協(xié)議,“Host”行指定了目標(biāo)主機(jī)的地址。
<br>由此知道了代理服務(wù)的過程:接收被代理端的請(qǐng)求、連接真正的主機(jī)、接收主機(jī)返回的數(shù)據(jù)、將接收數(shù)據(jù)發(fā)送到被代理端。
<br>為此可編寫一個(gè)簡(jiǎn)單的程序,完成上述網(wǎng)絡(luò)通信重定向問題。
<br>用Delphi設(shè)計(jì)時(shí),選用ServerSocket作為與被代理工作站通信的套接字控件,選用ClientSocket動(dòng)態(tài)數(shù)組作為與遠(yuǎn)程主機(jī)通信的套接字控件。
<br>編程時(shí)應(yīng)解決的一個(gè)重要問題是多重連接處理問題,為了加快代理服務(wù)的速度和被代理端的響應(yīng)速度,套接字控件的屬性應(yīng)設(shè)為非阻塞型;各通信會(huì)話與套接字動(dòng)態(tài)綁定,用套接字的SocketHandle屬性值確定屬于哪一個(gè)會(huì)話。
<br>通信的銜接過程如下圖所示:
<br>
<br> 代理服務(wù)器
<br> 
<br> Serversocket
<br> (1)接收
<br> 被代理端發(fā)送遠(yuǎn)程主機(jī)
<br> (6)(2)(5)
<br> BrowserClientSocket(4)WebServer
<br> 接收
<br> 發(fā)送(3)
<br>
<br>
<br>(1)、被代理端瀏覽器發(fā)出Web請(qǐng)求,代理服務(wù)器的Serversocket接收到請(qǐng)求。
<br>(2)、代理服務(wù)器程序自動(dòng)創(chuàng)建一個(gè)ClientSocket,并設(shè)置主機(jī)地址、端口等屬性,然后連接遠(yuǎn)程主機(jī)。
<br>(3)、遠(yuǎn)程連通后激發(fā)發(fā)送事件,將Serversocket接收到的Web請(qǐng)求數(shù)據(jù)包發(fā)送到遠(yuǎn)程主機(jī)。
<br>(4)、當(dāng)遠(yuǎn)程主機(jī)返回頁面數(shù)據(jù)時(shí),激發(fā)ClientSocket的讀事件,讀取頁面數(shù)據(jù)。
<br>(5)、代理服務(wù)器程序根據(jù)綁定信息確定屬于ServerSocket控件中的哪一個(gè)Socket應(yīng)該將從主機(jī)接收的頁面信息發(fā)送到被代理端。
<br>(6)、ServerSocket中的對(duì)應(yīng)Socket將頁面數(shù)據(jù)發(fā)送到被代理端。
<br>
<br>2、程序編寫
<br>使用Delphi設(shè)計(jì)以上通信過程非常簡(jiǎn)單,主要是ServerSocket、ClientSocket的相關(guān)事
<br>件驅(qū)動(dòng)程序的程序編寫。下面給出作者編寫的實(shí)驗(yàn)用代理服務(wù)器界面與源程序清單,內(nèi)含簡(jiǎn)要功能說明:
<br>
<br>unitmain;
<br>
<br>interface
<br>
<br>uses
<br> Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,
<br> ExtCtrls,ScktComp,TrayIcon,Menus,StdCtrls;
<br>
<br>type
<br> session_record=record
<br> Used:boolean;
<br> SS_Handle:integer;
<br> CSocket:TClientSocket;
<br> Lookingup:boolean;
<br> LookupTime:integer;
<br> Request:boolean;
<br> request_str:string;
<br> client_connected:boolean;
<br> remote_connected:boolean;
<br>end;
<br>
<br>type
<br> TForm1=class(TForm)
<br> ServerSocket1:TServerSocket;
<br> ClientSocket1:TClientSocket;
<br> Timer2:TTimer;
<br> TrayIcon1:TTrayIcon;
<br> PopupMenu1:TPopupMenu;
<br> N11:TMenuItem;
<br> N21:TMenuItem;
<br> N1:TMenuItem;
<br> N01:TMenuItem;
<br> Memo1:TMemo;
<br> Edit1:TEdit;
<br> Label1:TLabel;
<br> Timer1:TTimer;
<br> procedureTimer2Timer(Sender:TObject);
<br> procedureN11Click(Sender:TObject);
<br> procedureFormCreate(Sender:TObject);
<br> procedureFormClose(Sender:TObject;varAction:TCloseAction);
<br> procedureN21Click(Sender:TObject);
<br> procedureN01Click(Sender:TObject);
<br> procedureServerSocket1ClientConnect(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br> procedureServerSocket1ClientDisconnect(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br> procedureServerSocket1ClientError(Sender:TObject;
<br> Socket:TCustomWinSocket;ErrorEvent:TErrorEvent;
<br> varErrorCode:Integer);
<br> procedureServerSocket1ClientRead(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br> procedureClientSocket1Connect(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br> procedureClientSocket1Disconnect(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br> procedureClientSocket1Error(Sender:TObject;Socket:TCustomWinSocket;
<br> ErrorEvent:TErrorEvent;varErrorCode:Integer);
<br> procedureClientSocket1Write(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br> procedureClientSocket1Read(Sender:TObject;Socket:TCustomWinSocket);
<br> procedureServerSocket1Listen(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br> procedureAppException(Sender:TObject;E:Exception);
<br> procedureTimer1Timer(Sender:TObject);
<br> **
<br> {**declarations}
<br> public
<br> Service_Enabled:boolean;
<br> session:arrayofsession_record;
<br> sessions:integer;
<br> LookUpTimeOut:integer;
<br> InvalidRequests:integer;
<br> end;
<br>
<br>var
<br> Form1:TForm1;
<br>
<br>implementation
<br>
<br>{$R*.DFM}
<br>
<br>file://系統(tǒng)啟動(dòng)定時(shí)器,啟動(dòng)窗顯示完成后,縮小到SystemTray…
<br>procedureTForm1.Timer2Timer(Sender:TObject);
<br>begin
<br> timer2.Enabled:=false;
<br> sessions:=0;
<br> Application.OnException:=AppException;
<br> invalidRequests:=0;
<br> LookUpTimeOut:=60000;
<br> timer1.Enabled:=true;
<br> n11.Enabled:=false;
<br> n21.Enabled:=true;
<br> serversocket1.Port:=988;
<br> serversocket1.Active:=true;
<br> form1.hide;{隱藏界面,縮小到SystemTray上}
<br>end;
<br>
<br>file://開啟服務(wù)菜單項(xiàng)…
<br>procedureTForm1.N11Click(Sender:TObject);
<br>begin
<br> serversocket1.Active:=true;
<br>end;
<br>
<br>
<br>file://停止服務(wù)菜單項(xiàng)…
<br>procedureTForm1.N21Click(Sender:TObject);
<br>begin
<br> serversocket1.Active:=false;
<br> N11.Enabled:=True;
<br> N21.Enabled:=False;
<br> Service_Enabled:=false;
<br>end;
<br>
<br>
<br>file://主窗口建立…
<br>procedureTForm1.FormCreate(Sender:TObject);
<br>begin
<br> Service_Enabled:=false;
<br> timer2.Enabled:=true;
<br>end;
<br>
<br>file://窗口關(guān)閉時(shí)…
<br>procedureTForm1.FormClose(Sender:TObject;varAction:TCloseAction);
<br>begin
<br> timer1.Enabled:=false;
<br> ifService_Enabledthen
<br> serversocket1.Active:=false;
<br>end;
<br>
<br>file://退出程序按鈕…
<br>procedureTForm1.N01Click(Sender:TObject);
<br>begin
<br> form1.Close;
<br>end;
<br>
<br>file://開啟代理服務(wù)后…
<br>procedureTForm1.ServerSocket1Listen(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br>begin
<br> Service_Enabled:=true;
<br> N11.Enabled:=false;
<br> N21.Enabled:=true;
<br>end;
<br>
<br>file://被代理端連接到代理服務(wù)器后,建立一個(gè)會(huì)話,并與套接字綁定…
<br>procedureTForm1.ServerSocket1ClientConnect(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br>var
<br>i,j:integer;
<br>begin
<br> j:=-1;
<br> fori:=1tosessionsdo
<br> ifnotsession[i-1].Usedandnotsession[i-1].CSocket.activethen
<br> begin
<br> j:=i-1;
<br> session[j].Used:=true;
<br> break;
<br> end
<br> else
<br> ifnotsession[i-1].Usedandsession[i-1].CSocket.activethen
<br> session[i-1].CSocket.active:=false;
<br> ifj=-1then
<br> begin
<br> j:=sessions;
<br> inc(sessions);
<br> setlength(session,sessions);
<br> session[j].Used:=true;
<br> session[j].CSocket:=TClientSocket.Create(nil);
<br> session[j].CSocket.OnConnect:=ClientSocket1Connect;
<br> session[j].CSocket.OnDisconnect:=ClientSocket1Disconnect;
<br> session[j].CSocket.OnError:=ClientSocket1Error;
<br> session[j].CSocket.OnRead:=ClientSocket1Read;
<br> session[j].CSocket.OnWrite:=ClientSocket1Write;
<br> session[j].Lookingup:=false;
<br> end;
<br> session[j].SS_Handle:=socket.socketHandle;
<br> session[j].Request:=false;
<br> session[j].client_connected:=true;
<br> session[j].remote_connected:=false;
<br> edit1.text:=inttostr(sessions);
<br>end;
<br>
<br>file://被代理端斷開時(shí)…
<br>procedureTForm1.ServerSocket1ClientDisconnect(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br>var
<br>i,j,k:integer;
<br>begin
<br> fori:=1tosessionsdo
<br> if(session[i-1].SS_Handle=socket.SocketHandle)andsession[i-1].Usedthen
<br> begin
<br> session[i-1].client_connected:=false;
<br> ifsession[i-1].remote_connectedthen
<br> session[i-1].CSocket.active:=false
<br> else
<br> session[i-1].Used:=false;
<br> break;
<br> end;
<br> j:=sessions;
<br> k:=0;
<br> fori:=1tojdo
<br> begin
<br> ifsession[j-i].Usedthen
<br> break;
<br> inc(k);
<br> end;
<br> ifk%26gt;0then
<br> begin
<br> sessions:=sessions-k;
<br> setlength(session,sessions);
<br> end;
<br> edit1.text:=inttostr(sessions);
<br>end;
<br>
<br>file://通信錯(cuò)誤出現(xiàn)時(shí)…
<br>procedureTForm1.ServerSocket1ClientError(Sender:TObject;
<br> Socket:TCustomWinSocket;ErrorEvent:TErrorEvent;
<br> varErrorCode:Integer);
<br>var
<br>i,j,k:integer;
<br>begin
<br> fori:=1tosessionsdo
<br> if(session[i-1].SS_Handle=socket.SocketHandle)andsession[i-1].Usedthen
<br> begin
<br> session[i-1].client_connected:=false;
<br> ifsession[i-1].remote_connectedthen
<br> session[i-1].CSocket.active:=false
<br> else
<br> session[i-1].Used:=false;
<br> break;
<br> end;
<br> j:=sessions;
<br> k:=0;
<br> fori:=1tojdo
<br> begin
<br> ifsession[j-i].Usedthen
<br> break;
<br> inc(k);
<br> end;
<br> ifk%26gt;0then
<br> begin
<br> sessions:=sessions-k;
<br> setlength(session,sessions);
<br> end;
<br> edit1.text:=inttostr(sessions);
<br> errorcode:=0;
<br>end;
<br>
<br>file://被代理端發(fā)送來頁面請(qǐng)求時(shí)…
<br>procedureTForm1.ServerSocket1ClientRead(Sender:TObject;
<br> Socket:TCustomWinSocket);
<br>var
<br>tmp,line,host:string;
<br>i,j,port:integer;
<br>begin
<br> fori:=1tosessionsdo
<br> ifsession[i-1].Usedand(session[i-1].SS_Handle=socket.sockethandle)then
<br> begin
<br> session[i-1].request_str:=socket.ReceiveText;
<br> tmp:=session[i-1].request_str;
<br> memo1.lines.add(tmp);
<br> j:=pos(char(13)+char(10),tmp);
<br> whilej%26gt;0do
<br> begin
<br> line:=copy(tmp,1,j-1);
<br> delete(tmp,1,j+1);
<br> j:=pos('Host',line);
<br> ifj%26gt;0then
<br> begin
<br> delete(line,1,j+5);
<br> j:=pos(':',line);
<br> ifj%26gt;0then
<br> begin
<br> host:=copy(line,1,j-1);
<br> delete(line,1,j);
<br> try
<br> port:=strtoint(line);
<br> except
<br> port:=80;
<br> end;
<br> end
<br> else
<br> begin
<br> host:=trim(line);
<br> port:=80;
<br> end;
<br> ifnotsession[i-1].remote_connectedthen
<br> begin
<br> session[i-1].Request:=true;
]]>
關(guān)于拉幕程序的討論和源碼http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=76&ID=2572&Page=1wangxinxin2010-12-14 11:20:34  修改后可以使用的程序源代碼(還是不完善:還不能實(shí)現(xiàn)從一側(cè)飛入的效果,輕易出錯(cuò)):
  unitUnit1;
  
  interface
  
  uses
  Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,
  StdCtrls,ExtCtrls,ComCtrls,ColorGrd,RxCombos;
  
  type
  TForm1=class(TForm)
  Button1:TButton;
  Edit1:TEdit;
  OpenDialog1:TOpenDialog;
  Button2:TButton;
  Button3:TButton;
  TrackBar1:TTrackBar;
  Panel1:TPanel;
  Panel2:TPanel;
  Panel3:TPanel;
  Label1:TLabel;
  Label2:TLabel;
  Timer1:TTimer;
  Button4:TButton;
  ColorDialog1:TColorDialog;
  FontDialog1:TFontDialog;
  Button6:TButton;
  Button7:TButton;
  ComboBox1:TComboBox;
  Panel4:TPanel;
  Edit2:TEdit;
  Edit3:TEdit;
  Label3:TLabel;
  Label4:TLabel;
  Label5:TLabel;
  Label6:TLabel;
  Edit4:TEdit;
  Edit5:TEdit;
  Button8:TButton;
  Button5:TButton;
  procedureButton1Click(Sender:TObject);
  procedureFormCreate(Sender:TObject);
  procedureTimer1Timer(Sender:TObject);
  procedureButton2Click(Sender:TObject);
  procedureButton3Click(Sender:TObject);
  procedureTrackBar1Change(Sender:TObject);
  procedureFormDestroy(Sender:TObject);
  procedureButton4Click(Sender:TObject);
  procedureButton7Click(Sender:TObject);
  procedureButton6Click(Sender:TObject);
  procedureButton8Click(Sender:TObject);
  procedureButton5Click(Sender:TObject);
  private
  procedurezShowText;
  ProcedurezBmpCreate;
  procedurezSetBmp;
  procedurezSetLineHeight;
  procedurezShowLine(sender:TObject);
  {Privatedeclarations}
  public
  {Publicdeclarations}
  end;
  
  var
  Form1:TForm1;
  
  implementation
  
  {$R*.DFM}
  const
  bWidth=200;
  var
  currline,LineHeight:integer;
  sItem:TStringList;
  bmp:TBitMap;
  bRect,R1:TRect;
  iDc:HDC;
  
  procedureTForm1.Button1Click(Sender:TObject);
  begin
  OpenDialog1.Execute;
  Edit1.Text:=OpenDialog1.FileName;
  end;
  
  procedureTForm1.FormCreate(Sender:TObject);
  begin
  Form1.WindowState:=wsMaximized;
  Panel1.Top:=80;
  Panel1.Left:=96;
  Panel1.Height:=385;
  Panel1.Width:=433;
  Timer1.Enabled:=False;
  Label2.Caption:='100';
  iDC:=GetDc(Panel1.handle);
  Currline:=0;
  end;
  
  procedureTForm1.zShowLine(sender:TObject);
  begin
  zShowText;
  end;
  
  procedureTForm1.Timer1Timer(Sender:TObject);
  begin
  zShowLine(self);//顯示字符串
  //bitblt轉(zhuǎn)移矩形圖(目標(biāo)句柄,LSx,y,寬,高,源句柄,LSx,y,光柵運(yùn)算符)
  BitBlt(iDc,0,0,Panel1.Width,Panel1.Height,
  Bmp.Canvas.Handle,0,Currline,srcCopy);
  Inc(Currline,1);
  ifCurrline>=bRect.Bottom-panel1.Height 100then//循環(huán)條件?
  begin
  Timer1.Enabled:=False;
  Currline:=0;
  end;
  end;
  
  
  procedureTForm1.zShowText;
  var
  i:integer;
  ss:string;
  ReadFile:TextFile;
  begin
  AssignFile(ReadFile,Edit1.Text);
  Reset(ReadFile);
  i:=1;
  sItem:=TStringList.Create;
  withsItemdo
  whilenoteof(ReadFile)do
  begin
  Readln(ReadFile,ss);
  add(ss);
  i:=i 1;
  end;
  CloseFile(ReadFile);
  zBmpCreate;
  sItem.Free;//釋放串
  end;
  
  procedureTForm1.zBmpCreate;//創(chuàng)建圖片
  var
  i,y:integer;//y
  begin
  ifbmp<>nilthenbmp.free;
  bmp:=TBitMap.Create;
  zSetBmp;
  R1.Right:=bRect.Right;
  R1.Bottom:=bRect.Bottom;
  y:=Panel1.Height-100;
  fori:=0tosItem.Count-1do//從0到行數(shù)循環(huán)顯示圖片
  begin
  R1.Top:=y;
  R1.Bottom:=R1.Top LineHeight;
  ifCombobox1.Text='中間對(duì)齊'then//顯示圖片
  DrawText(Bmp.Canvas.Handle,pChar(sItem[i]),-1,R1,Dt_CenterorDt_Top)
  else
  ifCombobox1.Text='左對(duì)齊'then
  DrawText(Bmp.Canvas.Handle,pChar(sItem[i]),-1,R1,Dt_LeftorDt_Top)
  else
  ifCombobox1.Text='右對(duì)齊'then
  DrawText(Bmp.Canvas.Handle,pChar(sItem[i]),-1,R1,Dt_RightorDt_Top)
  else
  DrawText(Bmp.Canvas.Handle,pChar(sItem[i]),-1,R1,Dt_CenterorDt_Top);
  Inc(y,LineHeight);
  end;
  end;
  
  
  
  
  
  procedureTForm1.zSetBmp;
  begin
  zSetLineHeight;
  withbRectdo//Rect矩形坐標(biāo)(左上x,左下y,右上x,右下y)
  begin
  Top:=0;
  Left:=0;
  Right:=Panel1.Width;
  Bottom:=LineHeight*sItem.Count Height;//行高*行數(shù) form高度
  end;
  withBmpdo
  begin
  Height:=bRect.Bottom 100;//圖片高度
  Width:=bRect.Right;
  withCanvasdo//canvas畫布
  begin
  Font:=FontDialog1.Font;
  //Font:=self.Font;//form所設(shè)置的字體
  Brush.Color:=ColorDialog1.Color;
  FillRect(bRect);
  Brush.Style:=bsClear;
  end;
  end;
  end;
  
  
  
  
  
  procedureTForm1.zSetLineHeight;
  {設(shè)置行間隔}
  var
  Metrics:TTextMetric;//設(shè)置字體API
  begin
  GetTextMetrics(iDc,Metrics);
  LineHeight:=Metrics.tmHeight Metrics.tmInternalLeading-Bmp.Canvas.Font.Height;
  end;
  
  
  
  procedureTForm1.Button2Click(Sender:TObject);
  begin
  ifEdit1.Text='thenShowMessage('請(qǐng)輸入文件地址')
  else
  begin
  ifButton2.Caption='開始'thenButton2.Caption:='暫停'
  elseButton2.Caption:='開始';
  Timer1.Enabled:=notTimer1.Enabled;
  end;
  end;
  
  procedureTForm1.Button3Click(Sender:TObject);
  begin
  timer1.Enabled:=false;
  Currline:=0;
  Button2.Click;
  Button2.Caption:='暫停';
  end;
  
  procedureTForm1.TrackBar1Change(Sender:TObject);
  begin
  Timer1.Interval:=TrackBar1.Position*5;
  Label2.Caption:=inttostr(Timer1.Interval);
  end;
  
  procedureTForm1.FormDestroy(Sender:TObject);
  begin
  ifBmp<>nilthenBmp.Free;
  end;
  
  procedureTForm1.Button4Click(Sender:TObject);
  begin
  close;
  end;
  
  
  procedureTForm1.Button7Click(Sender:TObject);
  begin
  FontDialog1.Execute;
  end;
  
  procedureTForm1.Button6Click(Sender:TObject);
  begin
  ColorDialog1.Execute;
  end;
  
  procedureTForm1.Button8Click(Sender:TObject);
  begin
  if((strtoint(Edit2.Text)>=600)or(strtoint(Edit3.text)>=500)or((strtoint(Edit5.Text)>=553)or(strtoint(Edit4.Text)>=630)))
  thenshowmessage('范圍超界')
  else
  begin
  Panel1.Top:=strtoint(Edit2.text);
  Panel1.Left:=strtoint(Edit3.text);
  Panel1.Width:=strtoint(Edit4.text);
  Panel1.Height:=strtoint(Edit5.text);
  end;
  
  end;
  
  
  
  procedureTForm1.Button5Click(Sender:TObject);
  begin
  Panel1.Top:=0;
  Panel1.Left:=0;
  Panel1.Width:=Panel3.Width;
  Panel1.Height:=Panel3.Height;
  end;
  
  end.
  

]]>
關(guān)于拉幕程序的討論和源碼http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=76&ID=2571&Page=1wangxinxin2010-12-14 11:19:23begin
if Edit1.Text=' then ShowMessage('請(qǐng)輸入文件地址')
else
begin
if Button2.Caption='開始' then Button2.Caption:='暫停'
else Button2.Caption:='開始';
Timer1.Enabled:=not Timer1.Enabled;
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
timer1.Enabled :=false;
Currline:=0;
Button2.Click;
Button2.Caption:='暫停';
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
Timer1.Interval:=TrackBar1.Position*5;
Label2.Caption:=inttostr(Timer1.Interval);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
if Bmp<>nil then Bmp.Free;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
close;
end;


procedure TForm1.Button7Click(Sender: TObject);
begin
FontDialog1.Execute;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
ColorDialog1.Execute;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
if ((strtoint(Edit2.Text)>=600) or (strtoint(Edit3.text)>=500) or ((strtoint(Edit5.Text)>=553) or (strtoint(Edit4.Text)>=630)))
then showmessage('范圍超界')
else
begin
Panel1.Top:=strtoint(Edit2.text);
Panel1.Left:=strtoint(Edit3.text);
Panel1.Width:=strtoint(Edit4.text);
Panel1.Height:=strtoint(Edit5.text);
end;

end;



procedure TForm1.Button5Click(Sender: TObject);
begin
Panel1.Top:=0;
Panel1.Left:=0;
Panel1.Width:=Panel3.Width;
Panel1.Height:=Panel3.Height;
end;

end.
]]>
幾個(gè)delphi書中沒提過的數(shù)據(jù)庫問題與我的疑惑和心得(一起討論)http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=76&ID=2570&Page=1wangxinxin2010-12-14 11:16:271,ADOConnection和ADOTable在delphi中的使用

ADOConnection和ADOTable在delphi中像許多書中教的那樣設(shè)置好連接上數(shù)據(jù)庫(我用的SQLServer),運(yùn)行沒有問題。然后我修改,目的是可以修改連接數(shù)據(jù)庫而不用在delphi中修改ADOConnection的ConnectionString屬性,還不出現(xiàn)連接對(duì)話框。

修改步驟:將LoginPrompt設(shè)置為false,將ConnectionString屬性清空,添加連接代碼

conStr:='Provider=SQLOLEDB.1;Password=1982072019;User ID=sa;Initial Catalog=StorageManagement;Data Source=10.16.99.175';
  try
    loginForm.tempADOConnection.ConnectionString :=conStr;
    loginForm.tempADOConnection.Connected := true;
  except
    messagedlg('數(shù)據(jù)庫連接有誤!!請(qǐng)檢查DataConfig.XML',mtConfirmation,[mbOk],0);
    Application.Terminate;
  end;

這樣程序運(yùn)行起來,連接數(shù)據(jù)庫是沒有問題的。但出現(xiàn)的問題是在dlephi中ADOTable控件是不能連接表的,因?yàn)镃onnectionString屬性沒有值。報(bào)錯(cuò)為“無效的授權(quán)說明”。如何既能在delphi中使用ADOConnection和ADOTable控件,又可以不出現(xiàn)那個(gè)討厭的連接對(duì)話框。

2,在delphi中使用sql語句。

因?yàn)閟ql語句中給字符串賦值需要用雙引號(hào),而delphi中用單引號(hào)括起字符串,我使用遇到了一些問題。我試驗(yàn)的結(jié)果是delphi中用兩個(gè)單引號(hào)代替sql語句中的雙引號(hào)。不知道對(duì)不對(duì)?

具體如何使用,我還是不太清楚。

3,在delphi 7.0中使用ADOQuery的返回結(jié)果,書中介紹使用Params['xxxx'].AsString;

我使用后報(bào)錯(cuò),但有一個(gè)光盤的程序這樣使用沒有報(bào)錯(cuò)。我使用的是Parameters['xxxx'],也使用不了.AsString

4,原代碼:
====================================================================
if canInsert then
  begin
    with allDataModule.AQ_OtherMaterielOut do
    begin
      Close;
      SQL.Clear;
      SQL.Text:='insert otherMaterielOut(materielID,amount) values (:insertID,:insertAmount,)';
      Parameters[0].Value:=myMateriel;
      Parameters[1].Value:=myAmount; 
      ExecSQL;
    end;
    with allDataModule.AQ_OtherMaterielStock do
    begin
      Close;
      SQL.Clear;
      SQL.Text:='update otherMaterielStock set amount=amount-:updateAmount where materielID=:updateID';
      Parameters[0].Value:=myAmount;
      Parameters[1].Value:=myMateriel;
      ExecSQL;
    end;
    materielOutForm.Close;
  end;

在這段代碼之后
with allDataModule.AQ_OtherMaterielOut do
    begin
      Close;
      SQL.Clear;
      SQL.Text:='update otherMaterielStock set amount=amount-:updateAmount where materielID=:updateID';
      Parameters[0].Value:=myAmount;
      Parameters[1].Value:=myMateriel;
      ExecSQL;
    end;

不能使用allDataModule自動(dòng)顯示可以使用的控件列表功能,但我強(qiáng)加上后面的代碼仍然可以使用。怎么回事?


]]>
Delphi程序員將何去何從http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=76&ID=2569&Page=1wangxinxin2010-12-14 11:15:03首先我認(rèn)為,應(yīng)該把Delphi程序員分為三代:
第一代:1995-1997年初次使用Delphi進(jìn)行開發(fā)的人,使用版本為1.0-2.0,那個(gè)時(shí)候的主流開發(fā)工具是VC、VB、VFP等,尤其是VB,這個(gè)時(shí)候的Delphi程序員屬于啟蒙一代。曾經(jīng)認(rèn)識(shí)一個(gè)這樣的人,當(dāng)時(shí)只有一本綠色的Delphi圖書,很簡(jiǎn)單,所有的問題都考自己去研究幫助。

第二代:1998-2002年初次使用Delphi進(jìn)行開發(fā)的人,使用版本為3.0-7.0,那個(gè)時(shí)候的主流開發(fā)工具是VC、VB、Delphi等,VFP已經(jīng)逐漸被拋棄,初期Delphi贏得了VB殺手的美名。這個(gè)時(shí)代是Delphi最好的時(shí)代,是用戶數(shù)發(fā)展壯大的時(shí)代。這個(gè)時(shí)候的開發(fā)資料由少到多的一個(gè)時(shí)代,尤其是李維那三本書更是讓Delphi登峰造極。

第三代:2002年以后初次使用Delphi進(jìn)行開發(fā)的人,使用版本為7.0-2005,8.0是Delphi的一個(gè)分水嶺,7.0是Win32模式的終極版本。從8.0開始,Delphi開始走向下坡路,尤其是2006年以來,初次使用Delphi的用戶越來越少。這個(gè)時(shí)候的主流開發(fā)工具已經(jīng)變?yōu)?Net、Java。

這里順便提一下C++Builder,雖然C++Builder被Borland寄于厚望,但C++Builder很快被用戶所拋棄,也就是從2001-2004年流行了很短的時(shí)間,之后基本處于銷聲匿跡狀態(tài)。

第一代Delphi程序員現(xiàn)在還從事軟件技術(shù)方面的人估計(jì)已經(jīng)寥若晨星,還從事軟件行業(yè)估計(jì)已經(jīng)很不錯(cuò)了,畢竟他們幾經(jīng)是接近不惑之年了。

第二代現(xiàn)在估計(jì)都處于轉(zhuǎn)型的關(guān)口上,他們多數(shù)是三十而立的人,很多人可能不僅僅考慮是繼續(xù)使用Delphi的問題,而是考慮從事軟件行業(yè)是否有前途的問題。

第三代現(xiàn)在正處于風(fēng)華正茂的年齡,是中國目前情況下從事軟件開發(fā)的黃金時(shí)期,只要你熟練開發(fā)工具,大把機(jī)會(huì)等著你。但是要注意黃金年領(lǐng)是有限的,25-29歲就這幾年時(shí)間,千萬不要荒廢,這直接決定了你以后的狀態(tài)。Delphi可以和你沒什么關(guān)系,但一定要走對(duì),這短短5年的時(shí)間一晃眼就過去了,而且這5年是多數(shù)人結(jié)婚買房生子的年齡。


在此提醒初次踏上社會(huì)希望以軟件為自己職業(yè)的人
1、選擇開發(fā)語言很重要,這基本決定了以后你的從業(yè)狀態(tài)及收入。中國絕大多數(shù)軟件公司不會(huì)給你換學(xué)其它開發(fā)語言的機(jī)會(huì),如果你選擇了一個(gè),那么你再次跳槽的時(shí)候還是這個(gè),下家同樣不會(huì)給你換的機(jī)會(huì),因?yàn)樗胍氖悄軄砹司透苫畹娜恕?
2、選擇開發(fā)語言很重要,這基本決定了你以后的職業(yè)方向。C/C++目前多數(shù)用于硬件相關(guān)類產(chǎn)品,Delphi、VB主要開發(fā)CS模式MIS類軟件,VC主要開發(fā)通用類軟件、Java主要用來開發(fā)BS模式軟件。相信搞通訊、消費(fèi)電子類產(chǎn)品的公司沒有幾家選擇VB、Delphi,通用類軟件基本都是用VC開發(fā)同樣是這個(gè)道理,雖然其它開發(fā)工具一樣可以實(shí)現(xiàn)。
3、至于怎么選最好看自己的興趣。

目前的現(xiàn)實(shí)是:
1、使用Delphi的公司越來越少,使用Java的越來越多。此時(shí)此刻,以下列關(guān)鍵字搜索主要人才網(wǎng)站全國范圍一周內(nèi)招聘數(shù)據(jù):
                     Delphi         Java         VB         VC       C#         C++Builder     PowerBuilder
     cjol                 25           259         45         52       44                           1                           1
     51job               43           385         18         28       45                           1                           6

     jobcn               36           411         20         45     225                           1                           1
     以上三個(gè)網(wǎng)站雖然有一定的地域性,但是已經(jīng)基本涵蓋了主要IT地區(qū),而且有重復(fù)的職位或公司,但基本的東西已經(jīng)反映出來了。
2、Delphi號(hào)稱VB殺手,但是似乎VB一點(diǎn)沒有受到影響,倒是Borland自己先把開發(fā)工具倒下了。


開發(fā)工具的優(yōu)劣就不用討論了,這是一場(chǎng)口水戰(zhàn),免戰(zhàn)!
Borland的市場(chǎng)方針及高高在上的價(jià)格是Delphi失勢(shì)的一個(gè)重要原因,但重要原因恐怕不僅僅是這個(gè),你認(rèn)為那個(gè)原因是最重要的原因?


繼續(xù)討論吧...... ]]>
Delphi中的Access技巧集http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=76&ID=2568&Page=1wangxinxin2010-12-14 11:02:52 
1.DELPHI中操作Access數(shù)據(jù)庫(建立.mdb文件,壓縮數(shù)據(jù)庫) IT我最牛-程序員的技術(shù)討論與分享園地Hff B&rj3u:Z
以下代碼在WIN2K,D6,MDAC2.6下測(cè)試通過, IT我最牛-程序員的技術(shù)討論與分享園地X8C'V)z/Y*K0`O_
編譯好的程序在WIN98第二版無Access環(huán)境下運(yùn)行成功.
G#i;k&yW1j0//在之前uses ComObj,ActiveX IT我最牛-程序員的技術(shù)討論與分享園地xA N/v8M5ax4_
//聲明連接字符串 IT我最牛-程序員的技術(shù)討論與分享園地 DVB2i~1G+T.V
Const IT我最牛-程序員的技術(shù)討論與分享園地0~FZRe*p~d []
SC IT我最牛-程序員的技術(shù)討論與分享園地z5C9Xz.seN+v
+'Jet OLEDB:Database Password=%s;';
$Uio'L{ O e)I0

//============================================================================= IT我最牛-程序員的技術(shù)討論與分享園地2y|CDr0GV
// Procedure: GetTempPathFileName IT我最牛-程序員的技術(shù)討論與分享園地 OPB |XCAQ
// Author : ysai
lV#H0|GW0// Date : 2003-01-27
Wii3m xq7Z~PW0// Arguments: (None) IT我最牛-程序員的技術(shù)討論與分享園地I @\?r.j'pt
// Result : string IT我最牛-程序員的技術(shù)討論與分享園地&~kr(}\i2MUh
//=============================================================================
f ? \8o:[7_C0function GetTempPathFileName():string;
:Bnr%[2m9v0//取得臨時(shí)文件名 IT我最牛-程序員的技術(shù)討論與分享園地nU4w~S3f"\9G
var
6?[vh|&_%S0SPath,Sfile&:array [0..254] of char;
DEmTKw`(H;KS0begin
%])xJ,V%N+eYN7M:P0GetTempPath(254,SPath);
^"^/L?!T&YAm:V#t!mP0GetTempFileName(SPath,'~SM',0,SFile); IT我最牛-程序員的技術(shù)討論與分享園地!P\ b/AI"p D
result:=SFile;
:h/G"fY7z6k0DeleteFile(PChar(result));
G(WzO a1i [^z)b0end; www.iTbulo.com0sJZ0


G(WzO a1i [^z)b0end; www.iTbulo.com0sJZ0.n,M.yP B8U3g6~2f0

@+Y6Y |#^opfc\^N.b:f0//=============================================================================
,g7b,O%^C0// Procedure: CreateAccessFile
)Y2y RWO.c0// Author : ysai IT我最牛-程序員的技術(shù)討論與分享園地1ZRS6H;R!O
// Date : 2003-01-27
1lLR7?5Fdfm#E]0// Arguments: FileName:String;Password:string='' IT我最牛-程序員的技術(shù)討論與分享園地#l5V0y6d1]y[_PI
// Result : boolean IT我最牛-程序員的技術(shù)討論與分享園地%qW/e1Rg3b
//=============================================================================
m8CU3E8xa(_0pj0function CreateAccessFile(FileName:String;Password:string=''):boolean;
-b,mD4x9T MTa/R0//建立Access文件,如果文件存在則失敗
.\b)?!MIO0var
yy/ET x0STempFileName:string;
rPd:k@$l:g'k[1f'D0vCatalog:OleVariant; IT我最牛-程序員的技術(shù)討論與分享園地w _N#^RJ)u-f k
begin
LtD3y@"{ j&`*T q0STempFileName:=GetTempPathFileName;
X&P7vn%Yb%e J&t0try
pk`7O#txMPQ&C0vCatalog:=CreateOleObject('ADOX.Catalog'); IT我最牛-程序員的技術(shù)討論與分享園地)[)V$jo3m5Qa xL
vCatalog.Create(format(SConnectionString,[STempFileName,Password])); IT我最牛-程序員的技術(shù)討論與分享園地 O8A IXYZ.}$l0A~3v6b
result:=CopyFile(PChar(STempFileName),PChar(FileName),True); IT我最牛-程序員的技術(shù)討論與分享園地8D i V&B%H-wb{}3G@
DeleteFile(STempFileName); IT我最牛-程序員的技術(shù)討論與分享園地E8z%QM)x8O7O
except IT我最牛-程序員的技術(shù)討論與分享園地X"I^Kprjy E\
result:=false;
1F^W _ez0end;
S&N!]L+t^0end; www.iTbulo.com0sJZ0IT我最牛-程序員的技術(shù)討論與分享園地|qq z*a7pTkv h

0cP3^6HE9ct;Vg$S0//============================================================================= IT我最牛-程序員的技術(shù)討論與分享園地6Ed+]0pui
// Procedure: CompactDatabase IT我最牛-程序員的技術(shù)討論與分享園地/J SK3q;Hh
// Author : ysai IT我最牛-程序員的技術(shù)討論與分享園地7e$y BT6d:QA b5d
// Date : 2003-01-27
[ov7A+P0ss0// Arguments: AFileName,APassword:string
P1W'Xi|0// Result : boolean IT我最牛-程序員的技術(shù)討論與分享園地'J,~5M!}g\'D PQ
//=============================================================================
s#r4[ u+J1b~0@!e0function CompactDatabase(AFileName,APassword:string):boolean;
~1VsUD0//壓縮與修復(fù)數(shù)據(jù)庫,覆蓋源文件
uN5e ?X0var IT我最牛-程序員的技術(shù)討論與分享園地l9GF(\ ?:}AYf]
STempFileName:string; IT我最牛-程序員的技術(shù)討論與分享園地'U:y@ v/m"V,R m@
vJE:OleVariant; IT我最牛-程序員的技術(shù)討論與分享園地_Af6qQ0C
begin
7] \I/g)Z|[0STempFileName:=GetTempPathFileName; IT我最牛-程序員的技術(shù)討論與分享園地*m^)kf3O^
try
vB%T4p2Ak?a0vJE:=CreateOleObject('JRO.JetEngine');
Nt)v%J(E e*~ qT8q/?*]0vJE.CompactDatabase(format(SConnectionString,[AFileName,APassword]), IT我最牛-程序員的技術(shù)討論與分享園地 h"xf AUx
format(SConnectionString,[STempFileName,APassword])); IT我最牛-程序員的技術(shù)討論與分享園地 |Vi)V ^-t7RC)|
result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
3[6j1T,gI0DeleteFile(STempFileName);
W0Jt9\h$a9V.z ID:^.{0except IT我最牛-程序員的技術(shù)討論與分享園地 LS+j+mFn~9Ca/b m
result:=false; IT我最牛-程序員的技術(shù)討論與分享園地!l\6iD(lv7}
end; IT我最牛-程序員的技術(shù)討論與分享園地"nRv"P m*KZ
end; www.iTbulo.com0sJZ0

o9mk*C.f*V5^(W1_/h0

\G(q|#w0u.Xu0    //=============================================================================
ycSQ yE0// Procedure: ChangeDatabasePassword IT我最牛-程序員的技術(shù)討論與分享園地C ^f` l&G9|4|
// Author : ysai
,d6t+M.g3J7k^0// Date : 2003-01-27
1DG]JF II0// Arguments: AFileName,AOldPassword,ANewPassWord:string
$ni%]h9O8o@!mu{0// Result : boolean
PJ9p6k:M0//============================================================================= IT我最牛-程序員的技術(shù)討論與分享園地P6Lz9i[cF/R3H7W
function ChangeDatabasePassword(AFileName,AOldPassWord,ANewPassWord:string):boolean;
;`yy U(a'DJ0//修改Access數(shù)據(jù)庫密碼
r]F(ay4l+k0var IT我最牛-程序員的技術(shù)討論與分享園地}%l#}.M)SA*A*v
STempFileName:string; IT我最牛-程序員的技術(shù)討論與分享園地Y^ |-S"ia
vJE:OleVariant; IT我最牛-程序員的技術(shù)討論與分享園地u&n? I,hb
begin
k7W(XYi9R0^Q_1s2@0STempFileName:=GetTempPathFileName;
3Mkm%e{7C`-A w&\0try
5zhs,|m3Z [V9N0v2Q0vJE:=CreateOleObject('JRO.JetEngine');
m&R+]/G/jf:z0gD0vJE.CompactDatabase(format(SConnectionString,[AFileName,AOldPassword]), IT我最牛-程序員的技術(shù)討論與分享園地zN C/MUIDx!G
format(SConnectionString,[STempFileName,ANewPassword]));
w6R"Q&dE%q[f@Y0result:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
-v H$@ T!Z;v0DeleteFile(STempFileName); IT我最牛-程序員的技術(shù)討論與分享園地![W y,Gpq
except
i$x%AU2u_w mC0result:=false; IT我最牛-程序員的技術(shù)討論與分享園地C5PXr6bJIB]
end;
!p(A,l6]z^ej1t0end; www.iTbulo.com0sJZ0IT我最牛-程序員的技術(shù)討論與分享園地bi{1dt3@q

IT我最牛-程序員的技術(shù)討論與分享園地!F j3a,D,mz3I8J/d9I3J$S

2.Access中使用SQL語句應(yīng)注意的地方及幾點(diǎn)技巧 IT我最牛-程序員的技術(shù)討論與分享園地`!Bd F8k.Ow0_;e
以下SQL語句在Access XP的查詢中測(cè)試通過 IT我最牛-程序員的技術(shù)討論與分享園地XR6p#X Dw:Y!pvYr n
建表:
?UCXzP7?R0Create Table Tab1 ( IT我最牛-程序員的技術(shù)討論與分享園地sv6j3UQ#\0V
ID Counter, IT我最牛-程序員的技術(shù)討論與分享園地1c#@w)qxsj
Name string,
^wbV+WN^3a#P1l e0Age integer, IT我最牛-程序員的技術(shù)討論與分享園地m Vsqqoq
[Date] DateTime); IT我最牛-程序員的技術(shù)討論與分享園地7z4}1DaIp4^
技巧: IT我最牛-程序員的技術(shù)討論與分享園地lPQZJ9Zfv8@T
自增字段用 Counter 聲明.
M"YQ3zG,ccO O^0字段名為關(guān)鍵字的字段用方括號(hào)[]括起來,數(shù)字作為字段名也可行. www.iTbulo.com0sJZ0

Y{*OV` N0 IT我最牛-程序員的技術(shù)討論與分享園地1d6d+y6_*dr"l G

建立索引:
z'w/YZT3lG D4Z0下面的語句在Tab1的Date列上建立可重復(fù)索引
W6M"X&d"m&}h0Create Index iDate ON Tab1 ([Date]); IT我最牛-程序員的技術(shù)討論與分享園地E6r-r,A#^ u:{
完成后Access中字段Date索引屬性顯示為 - 有(有重復(fù)).
Ll)@y(d0下面的語句在Tab1的Name列上建立不可重復(fù)索引 IT我最牛-程序員的技術(shù)討論與分享園地1NK!t:b7g^t
Create Unique Index iName ON Tab1 (Name); IT我最牛-程序員的技術(shù)討論與分享園地z^0{7Ft4|ZqbPV
完成后Access中字段Name索引屬性顯示為 - 有(無重復(fù)).
!R@0UDo` Q}o e0下面的語句刪除剛才建立的兩個(gè)索引 IT我最牛-程序員的技術(shù)討論與分享園地5d!Sg [r
Drop Index iDate ON Tab1;
W QuVU,_[wQ0Drop Index iName ON Tab1; www.iTbulo.com0sJZ0

%{T'Htk-p9p(?.[0 IT我最牛-程序員的技術(shù)討論與分享園地)pK%{!v` |/QU$n

Access與SQLSERVER中的UPDATE語句對(duì)比: IT我最牛-程序員的技術(shù)討論與分享園地 oX `ZO'vt
SQLSERVER中更新多表的UPDATE語句:
W(X?/N @_(Do$@I0UPDATE Tab1 IT我最牛-程序員的技術(shù)討論與分享園地#VU"k9p\z$z
SET a.Name = b.Name
$X3jL1]8F H K0FROM Tab1 a,Tab2 b IT我最牛-程序員的技術(shù)討論與分享園地-roheo"rh#M};c
WHERE a.ID = b.ID;
d ?h9HEK0同樣功能的SQL語句在Access中應(yīng)該是
$i.f9A*yz'e0 UPDATE Tab1 a,Tab2 b IT我最牛-程序員的技術(shù)討論與分享園地 \V d/~)z1X^'v
SET a.Name = b.Name
An{S-t#F9p |S3xL0WHERE a.ID = b.ID; IT我最牛-程序員的技術(shù)討論與分享園地k"g |,z9V)TCx p j(}
即:Access中的UPDATE語句沒有FROM子句,所有引用的表都列在UPDATE關(guān)鍵字后. IT我最牛-程序員的技術(shù)討論與分享園地n7G:hxQ9sv1N
上例中如果Tab2可以不是一個(gè)表,而是一個(gè)查詢,例:
,Gzs9cE V4?1[ f0UPDATE Tab1 a,(Select ID,Name From Tab2) b
D3\Jg3G[C0SET a.Name = b.Name IT我最牛-程序員的技術(shù)討論與分享園地;|;Li"rg)T d`
WHERE a.ID = b.ID;

a%m(r4Y#`0o&CK0www.iTbulo.com0sJZ0IT我最牛-程序員的技術(shù)討論與分享園地 }2|2J \I

IT我最牛-程序員的技術(shù)討論與分享園地'c1A9h bq2P!a$O

訪問多個(gè)不同的Access數(shù)據(jù)庫-在SQL中使用In子句: IT我最牛-程序員的技術(shù)討論與分享園地7it3Oq5g \X D
Select a.*,b.* From Tab1 a,Tab2 b In 'DB2.mdb' Where a.ID=b.ID;
)]tZ E!G)bYW;L%e C-c0上面的SQL語句查詢出當(dāng)前數(shù)據(jù)庫中Tab1和DB2.mdb(當(dāng)前文件夾中)中Tab2以ID為關(guān)聯(lián)的所有記錄. IT我最牛-程序員的技術(shù)討論與分享園地;]4CHA?V
缺點(diǎn)-外部數(shù)據(jù)庫不能帶密碼. IT我最牛-程序員的技術(shù)討論與分享園地K7m!YE['gQ^ YC,N
補(bǔ)充:看到ugvanxk在一貼中的答復(fù),可以用 IT我最牛-程序員的技術(shù)討論與分享園地Y#_p?QY
Select * from [c:\aa\a.mdb;pwd=1111].table1; IT我最牛-程序員的技術(shù)討論與分享園地 i1t x8F xj5K7kOc

]]>
Delphi夢(mèng)魘病毒跟進(jìn)專帖http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=76&ID=2567&Page=1wangxinxin2010-12-14 10:59:16
金山云安全中心近日在國內(nèi)率先截獲了一個(gè)針對(duì)計(jì)算機(jī)程序員、尤其是Delphi使用者的病毒“Delphi夢(mèng)魘”(Win32.Induc.b.820224),簡(jiǎn)單描述該毒行為,就是:它專門感染Delphi程序員的電腦,一旦成功,程序員今后寫出的任何程序,都將帶有該毒!目前已經(jīng)發(fā)現(xiàn)若干知名應(yīng)用程序所帶文件包含惡意代碼。關(guān)于找個(gè)病毒的詳情請(qǐng)參考 http://blog.duba.net/post/delphi-workers-nightmare_9013.php



專殺工具發(fā)布(2009-08-21第三次更新):

圖片點(diǎn)擊可在新窗口打開查看





目前已經(jīng)發(fā)現(xiàn)的知名程序,歡迎各位同學(xué)添加更新

1 inno setup編譯環(huán)境的部分版本
   a、官方提供的安裝程序正在檢查中(已經(jīng)確認(rèn)正常 0821 by 一把銹劍)
   b、inno5.2.3增強(qiáng)版包含的ISCC.exe 和自帶的Inno setup程序解包程序
2 部分傳奇外掛,登錄器等

3 iSpeak部分版本(可能是修改版,官方下載沒有問題)

4 無憂登陸軟件(暫未找到那個(gè)是真官方,有個(gè)QQ無憂登錄的網(wǎng)站正常)

5 CS1.5等(網(wǎng)友反饋)

6 部分單機(jī)大型游戲安裝目錄下的info\setup.exe  (魔獸爭(zhēng)霸III,天使帝國3等其他網(wǎng)絡(luò)流行單機(jī)游戲,多為盜版游戲官方的沒有鑒定)

7 部分迅雷Ayu修改版本(網(wǎng)友反饋)

8 萬象2004部分版本(網(wǎng)友反饋,已經(jīng)確認(rèn))

9 個(gè)人所得稅代扣代繳系統(tǒng)部分版本(網(wǎng)友反饋)

]]>
[原創(chuàng)]用DELPHI編的一個(gè)界面類似冰河的遠(yuǎn)程控制程序http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=76&ID=2566&Page=1wangxinxin2010-12-14 10:56:20首先解釋一下,這個(gè)程序除了在界面模仿"冰河"外,程序本身和
"冰河"聯(lián)系并不大,程序還有很多的不足(如數(shù)據(jù)的傳輸沒有加密也
沒有壓縮。。。),只是基本上實(shí)現(xiàn)了一個(gè)反彈型的遠(yuǎn)程控制程序的
功能。實(shí)現(xiàn)了一些諸如自己剛學(xué)這東東時(shí)感興趣的:服務(wù)端生成、自
動(dòng)上線、遠(yuǎn)程控制、截屏、攝像頭監(jiān)控、文件傳輸、鍵盤記錄等功能。
程序在靠近木馬方面處理很少,主要是還不想(程序效率還跟不上,
沒必要用DLL或插入進(jìn)程再或HOOK API來隱藏進(jìn)程),這只是偶要
寫的一個(gè)教程的演示程序罷了。

請(qǐng)將QQWry.dat和binghe.exe放在同一目錄下!

一、配置服務(wù)端

首先配置服務(wù)端,只要在菜單“配置”里選擇“配置服務(wù)端”選項(xiàng),然后填寫你的上線名稱(只支持英文或數(shù)字)和自動(dòng)上線讀IP的“自動(dòng)上線地址”,按生成即可以同目錄下生成Server.exe程序。

然后將這個(gè)生成的程序發(fā)給別人(當(dāng)然你要自己運(yùn)行也行,只是控制的就是自己了),下邊就等著服務(wù)端上線吧。

二、自動(dòng)上線設(shè)置

這個(gè)其他同類的程序說得很多了,我也不想多少,不懂的朋友可以下其他程序的動(dòng)畫演示來看,呵呵(愉懶了~~)。

程序里我都寫了例子,大家照著換成自己的就行了。

這里只說一點(diǎn),這是FTP更新里的“存放IP的文件”中的“www”是你的FTP空間放網(wǎng)頁的目錄,有些FTP空間直接在根目錄里存放網(wǎng)頁,這樣你直接在這行填上“ip.htm”就行了,不過一般的FTP空間都在一個(gè)專門的目錄來存放網(wǎng)頁,你自己登錄FTP看一個(gè),換成自己的相應(yīng)目錄就行了!

三、控制功能

文件管理:可以瀏覽、上傳、下載、刪除、遠(yuǎn)程遠(yuǎn)行等(不見意上傳下載大文件)。

抓屏:手動(dòng)抓屏。由于網(wǎng)速等原因,在互聯(lián)網(wǎng)有可能會(huì)很慢,在局域網(wǎng)就沒什么。

視頻臨控:可以自己探測(cè)攝像頭,服務(wù)端主機(jī)安裝有攝像頭的話,圖標(biāo)會(huì)自動(dòng)變成攝像頭圖標(biāo)。

進(jìn)程管理:在彈出的進(jìn)程管理窗口點(diǎn)擊右鍵即可看見相應(yīng)的操作。

窗口管理:同上。

鍵盤記錄:同上。

遠(yuǎn)程卸載。

這只是一個(gè)演示程序,目前只實(shí)現(xiàn)上邊的這些功能。

]]>
最近關(guān)于delphi python java 和設(shè)計(jì)的一些想法http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=76&ID=2565&Page=1wangxinxin2010-12-14 10:50:19每個(gè)程序員就是藝術(shù)家,每個(gè)系統(tǒng)構(gòu)架師都是哲學(xué)家

這段時(shí)間我一直在思考各種設(shè)計(jì)上面的問題,原來一直寫delphi和一些其他腳本語言。對(duì)java一直沒有碰,這段時(shí)間看的比較多,也寫了一些小的程序,過程不說,1個(gè)月下來感覺只有四個(gè)字:不堪重負(fù) ToT,可能你們還記得前段時(shí)間我抱怨了一下java的類庫之間的復(fù)雜關(guān)系,讓我完全沒有任何的線索

隨即切換到python重新實(shí)現(xiàn)一些功能,也許是有了前面的經(jīng)驗(yàn),寫的輕松了很多,雖然這段時(shí)間我連很多python的基本用法都沒學(xué)完,比如那個(gè)lambda函數(shù),新奇呀~

用twisted寫了一個(gè)server,10多行代碼,java那邊用mina還沒有實(shí)現(xiàn)邏輯就已經(jīng)4、5個(gè)java文件了,當(dāng)然大部分代碼ide都幫忙寫了,不過java類庫之間的邏輯關(guān)系復(fù)雜程度可見一斑。

以我對(duì)這兩個(gè)語言的了解程度,還不足以對(duì)他們?cè)u(píng)頭論足,我發(fā)現(xiàn)他們?cè)谠O(shè)計(jì)思路上有一些很有意思的地方,寫下來,大家看看。

delphi聞名是他的RAD套路,還有就是所謂的“優(yōu)雅”,因?yàn)閷懗鰜淼拇a規(guī)范而且可讀性強(qiáng),不過很遺憾,delphi的rad貌似也沒有太大的進(jìn)展了,至于用“begin end”來保持的優(yōu)雅,我持保留意見,呵呵。期待后續(xù)的版本能繼續(xù)發(fā)揚(yáng)RAD,這次支持泛型和unicode就很不錯(cuò),要是再多些語法糖就好了,恩啊恩啊。delphi仍然是我windows平臺(tái)下開發(fā)的不二選擇。
python的設(shè)計(jì)思路很像delphi,走的是rad的套路,用python寫東西的時(shí)候,明顯感覺到是拋開了詳細(xì)設(shè)計(jì)的,就是一切都面向?qū)崿F(xiàn)功能,他的語言設(shè)計(jì)是鼓勵(lì)你這么做的。python強(qiáng)調(diào)了函數(shù)和模塊,他的面向?qū)ο笪业椒炊X得有點(diǎn)半調(diào)子,不過無所謂,這些是意識(shí)形態(tài)上的東西,能解決問題就好。
而用java的時(shí)候,我還沒開始寫一行邏輯代碼,已經(jīng)被迫實(shí)現(xiàn)了4、5個(gè)接口了,而且我在沒有寫完之前,還不能把他們整合起來,也不知道是對(duì)是錯(cuò)。心里懸著,感覺不舒服。

很有意思的是,python的思路很接近我最初寫程序的時(shí)候,什么都不知道,只要把東西做出來就好的那種思路,所謂初級(jí)程序員的做法。不過這個(gè)不是全部,python的開發(fā)過程非常強(qiáng)調(diào)自省,也就是重構(gòu),說白了就是重新寫。而且目前的開發(fā)中更加注重的是在各種測(cè)試的情況下進(jìn)行重構(gòu),也就是是有保障的重構(gòu),而非程序員一時(shí)性起,寫了也不知道對(duì)不對(duì)。我個(gè)人覺得這個(gè)是符合邏輯的,在沒有了解一個(gè)東西的時(shí)候做再多的設(shè)計(jì)都是空的,我原來也嘗試過,也看到過開發(fā)中到最后,完全和最初的設(shè)計(jì)沒有關(guān)系。失去控制,全靠程序員自己努力,更要命的是,牛B的SA還不愿意承認(rèn)……

python可以做到這一點(diǎn),是因?yàn)閜ython代碼很精簡(jiǎn),程序員寫作的時(shí)間很短,就算是重構(gòu)這個(gè)時(shí)間消耗也比其他語言低很多,我覺得這是python做的最好的地方,他給這種“初級(jí)程序員”的開發(fā)模式提供了一個(gè)升級(jí)的可能

這段時(shí)間也很關(guān)心各種語言的效率,不可否認(rèn),java的jvm虛擬機(jī)是一個(gè)很厲害的東西,java的執(zhí)行效率在高端機(jī)器上和C在一個(gè)水平,一個(gè)可以自動(dòng)管理內(nèi)存的語言做到這個(gè)地步,實(shí)在讓人驚嘆。同時(shí)java的開發(fā)效率比C又高了不知道多少倍。所以在服務(wù)器端java可以說當(dāng)之無愧的王者。

這次準(zhǔn)備放棄java轉(zhuǎn)而用python的主要原因其實(shí)是考慮到開發(fā)效率和rad的需求。前段時(shí)間考慮的方案是用java寫框架和效率要求嚴(yán)格的地方,然后用jython實(shí)現(xiàn)邏輯和效率要求不高的地方,不過這個(gè)想法首先被jython的超級(jí)低效率擺了一道,這個(gè)低效非常明顯而且不是幾十倍的問題,
然后自己感覺java的各種代碼之間各種交互很多,設(shè)計(jì)上找不到rad的感覺,我也會(huì)設(shè)計(jì)很多接口,封裝,然后工廠,不知道是不是被引誘了呵呵。
然后就是這次做的東西有探索的性質(zhì)在里面,所以我自己是沒有太多經(jīng)驗(yàn)的,整個(gè)開發(fā)過程我預(yù)算了1次完全的重構(gòu)和數(shù)次的迭代的重構(gòu)。

現(xiàn)在我基本上決定用python寫原型,先跑,然后如果效率上出了問題,profile一下,找問題的地方,用psyco編一下,如果還不行,就直接寫C的擴(kuò)展或者用jtype在java里面做好,python里面調(diào)用。個(gè)人感覺python比較合適我的思路,也許是因?yàn)槲也皇且粋(gè)合格的SA,我只是一個(gè)程序員圖片點(diǎn)擊可在新窗口打開查看
多process的情況我也推翻了我原來的設(shè)計(jì),盡量減少process之間的狀態(tài)共享,把程序都往單進(jìn)程順序執(zhí)行上堆,直到我決定寫erlang的哪一天,呵呵

對(duì)于general purpose的框架來說,開發(fā)者一定是對(duì)這個(gè)領(lǐng)域很有經(jīng)驗(yàn)的,所以可以抽象出一套比較好的邏輯框架,然后實(shí)現(xiàn)成各種接口,工廠,封裝,分層來保證靈活性,這個(gè)在python的twisted庫里面也是一樣的,虧他們居然用python半調(diào)子的面向?qū)ο蟾阏诉@么多東西出來。不過還好他們暴露出來的接口并不復(fù)雜,也就是一些回調(diào)和事件
不過在面臨專業(yè)領(lǐng)域的問題的時(shí)候,這種一來就高層建模的方式或許就有點(diǎn)行不通了,因?yàn)闆]有人敢站起來拍胸膛說,這個(gè)項(xiàng)目所有需求我都了解了。而且大部分需求都在根據(jù)時(shí)間變化。所以導(dǎo)致開始建模的那些封裝到后面可能會(huì)變成完全不適用或者需要大量適配才能使用的東西


另外這段時(shí)間突然感覺各種語言蜂擁而起,而起很多都有自己的明確的主題,
比如erlang對(duì)并發(fā)的處理簡(jiǎn)直就是一絕,
scala在jvm上的表現(xiàn),整合的非常好,
還有我最喜歡的跨平臺(tái)pascal:lazarus今天也剛剛出了0.9.26版本完美支持mac平臺(tái)的新界面框架(好像叫carbon把),跨平臺(tái)的native程序開發(fā)估計(jì)也只有他能做了,
ruby新版的效率居然比python2.6還要高,好吧我承認(rèn),我沒有選ruby和jruby是因?yàn)椴惶矚g他的語法- -,感覺啰嗦
groove是瞄準(zhǔn)ruby去的,不過現(xiàn)在還差一截

最近看到有句話很喜歡:程序設(shè)計(jì)有兩種思路,一種是設(shè)計(jì)的很簡(jiǎn)單以至于明顯沒有缺陷,一種是設(shè)計(jì)的很復(fù)雜以至于沒有明顯的缺陷 圖片點(diǎn)擊可在新窗口打開查看

以上是這段時(shí)間的一些感受,水平很有限,拉拉雜雜一堆,行家眼里看來肯定是漏洞百出,說出來讓大家笑話了。歡迎拍磚
]]>
在DELPHI程序中支持VBScript/JavaScript討論專區(qū)http://www.xinguifushi.cn/bbs/dispbbs.asp?BoardID=76&ID=2564&Page=1wangxinxin2010-12-14 10:48:24to 菜鳥:關(guān)于如何實(shí)現(xiàn)的問題請(qǐng)見id=54803,
to 大蝦:本主題的目的是讓我們徹底弄清楚TScriptControl的用法
在DELPHI程序中支持VBScript/JavaScript討論專區(qū)相關(guān)解決方法:1、
現(xiàn)在,我們只有眼巴巴的看著WPS強(qiáng)大的功能、看著國產(chǎn)軟件各自為政,我好心痛,
我要振臂高呼:
讓我們的程序都支持宏功能吧,
讓我們的程序控制別人的程序
  也讓別人的程序控制我們的程序吧!
希望我們都能在各自領(lǐng)域盡情發(fā)揮自己的聰明才智。
2、
關(guān)注!
3、
關(guān)注!
4、
以下討論:
Sc:= Tscriptcontrol.Create(Nil)
第一個(gè)問題:
  實(shí)現(xiàn) Sc.Run(Const ProcedureName : WideString; var Parameters : pSafeArray)
5、
怎么沒有反應(yīng)啊,
難道各位都解決了這個(gè)問題了嗎?
6、
大家不要擔(dān)心分的問題,我會(huì)一直加的.
7、
我有個(gè)例子,不知你想要嗎?
8、
to Lixiaolei:
  當(dāng)然想要啦,email給我就行了。
9、
快加分哦。不然沒人給你例子哦
10、
分絕對(duì)沒有問題(我現(xiàn)在的參與分太少,不能加到200,只有漫漫等了),希望大家相信我。
11、
在DELPHI程序中支持VBScript/JavaScript討論專區(qū)推薦解答:

]]>
主站蜘蛛池模板: 午夜宅宅宅影院在线观看 | 成人综合婷婷国产精品久久免费 | 亚洲国产天堂久久九九九 | 国产超薄肉色丝袜足j | 99re国产视频 | 国产女王s调视频vk 国产女王vk | 又黄又www | 国产一级一片免费播放刺激 | 国产短视频精品一区二区三区 | 玖草影院 | 日韩中文字幕在线观看 | 欧美特黄高清免费观看的 | 久久久久久久国产视频 | 成人爽爽大片在线观看 | 在线欧美国产 | 99热精品在线免费观看 | 国产精品久久久久久久hd | 日本特黄特色 | 99视频免费在线 | 色丁香久久 | 日韩欧美中文字幕一区二区三区 | 99re热这里只有精品视频 | 日韩精品久久久毛片一区二区 | 精品国产九九 | 分享一个无毒不卡免费国产 | 美女很黄很黄免费的 | 久久99亚洲精品久久99 | 亚洲一区二区三区免费视频 | 亚洲精品久久久久久久777 | 黄色美女毛片 | 国产精品9999久久久久 | 一级女性全黄久久生活片 | 国产成人综合95精品视频免费 | 91精品国产爱久久久久久 | 久久精品国产亚洲aa | 最新国产三级在线不卡视频 | 中文字幕在线免费观看 | 老少配性xxxxxx| 扒开两腿猛进入爽爽视频 | 美国一级特a黄 | 亚洲成a人片在线观看中文 亚洲成a人片在线观看中文!!! |