專案公升級到Delphi 2010總結(1)

2022-03-31 19:41:14 字數 1756 閱讀 9495

這兩天把乙個使用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是能夠共存的...