這兩天把乙個使用delphi2007開發的30萬行左右的專案,成功公升級到了delphi2010。公升級途中很艱辛,總結了 以下經驗與大家分享。另外,工程中使用的第三方元件,由於官方沒有發布for delphi2010的更新,我也順便修改了。有需要的聯絡我。修改的第三 方元件列表見文章尾部。
因為delphi不支援無型別指標的算術運算,很多程式設計師使用 pchar來代替pointer,即使指標指向目標並不是pansichar。
考慮如下**:
varp:pchar;
buffer:pointer;
begin
getmem(buffer,
255);p:=
buffer;
p^:=#1
;inc(p);
p^:=#2
;freemem(buffer,
255);
end;
在2010中pchar已經不再表示pansichar而是表示pwidechar,如果依然這樣寫,執行時很可能會得到乙個記憶體訪問錯誤。因為每 次inc(p),實際上指標向前移動了2位元組,因為sizeof(widechar)=2,inc(p)相當於 p:=p+sizeof(widechar)。
解決方法是把pchar替換成pansichar
這些函式依賴的是位元組長度,往往我們直接使用length(str)來獲取,這是行不通的。
考慮如下**:
varp1,p2:string;
begin
p1:=
'test';
setlength(p2,length(p1));
move(p1[
1],p2[
1],length(p1));
在2010中string預設對映到unicodestring,單個字元是2位元組,所以上文中p1實際占用了8位元組記憶體,而傳給move函式的長 度只有4位元組,最終結果是p2="te"。
解決辦法1:
修改string為ansistring,該方案雖然可行,但你的程式就享受不到unicode待遇了。
解決辦法2:
setlength 函式不要修改,因為他的長度引數是字元長度,而不是位元組長度。
move函式的最後乙個引數 length(p1) 修改成 length(p1)*sizeof(char)。
注意:不要偷懶使用萬一老師說的bytelength函式,該函式並沒有for ansistring的過載,編譯器會 把引數隱式轉化為unicodestring然後,bytelength函式計算unicodestring的長度。例如:一旦你不小心傳入了乙個 ansistring型別長度為4的字串,函式會返回8,而不是你期望的長度4。
這類**最好替換成charinset(key,['a'..'z','b','c']) 不然會當作ansichar處理。
**中的所有widestring都考慮替換成string,現在 widestring只是為了與com相容而存在,且沒有引用計數,效能低下。
如果你的工程使用了tnt控制項或以前的widetextpos widestringreplace之類的東西都替換成標準的吧,不用曲線救國了。
待續…………
---------經過修改,可以在delphi2010下運作的第三方元件--------------
1,pngdelphi
2,embeddedwb
3,synedit的語法高亮元件 unihighlighter
4,jedi win32api header
這些元件現在可以在delphi2010下運作了,有需要的聯絡我。
Delphi2010 體驗國內首發
兩天前拿到了delphi2010的內測版光碟,然後裝上了試用,經過將近兩天的試用,感覺相當的棒 下面是體驗報告,希望起到拋磚引玉的作用。首先,大家可能會失望的是,內測版與d2009的內測版一樣,缺少很多元件 當然了,這只是給大家體驗用的,元件少一點沒關係。加上我在安裝時,沒有裝bde和dbx,元件就...
delphi2010泛型練習
showmessage 該會員代號已存在,不能重複新增。end procedure tform1.edit2keypress sender tobject var key char begin if key 13 then button1.click end procedure tform1.but...
從Delphi 7公升級到Delphi XE
delphi 7和xe中間有好幾個版本號,可都不太流行,一是由於delphi有些邊緣化,二是7在xp環境下是近乎完美的版本號。市場上關於delphi的書越來越少,提供從7公升級到xe介紹的資料差點兒沒用。這裡我試著列舉一下7和xe的差異和注意事項,給須要公升級的朋友一些線索。1.7和xe是能夠共存的...