Delphi移動開發筆記(一)


      Delphi從XE4版本就開始支持移動開發了,但是筆者最近才開始學習這塊內容。因為筆者原來一直使用的是Delphi7,對於很多新語法沒有了解過,所以把其中一些東西記錄下來。
        程序開發,調試是少不了的。關於搭建調試環境,網上已經有很多文章,這里就不復述了,大家可以自己搜索搜索。個人推薦,對於安卓平台,使用真機比較好,因為模擬器的速度是非常非常非常非常慢的,對於我這種急性子簡直是無法忍受。不過你也可以在虛擬機里面搭建IOS的環境,那個速度就非常快了,比安卓的手機速度還快。一般地說,IOS下能跑,編譯成安卓的也不會有問題。
下圖是我的三星手機:
xe1
這一個則是IOS模擬機,里面正在運行着一個UDP可靠傳輸的程序,跟外面實體機進行數據傳輸:
xe2

一、字符串操作

        在移動環境下,字符串的索引是從0而不是1開始。注意:這個實際上只涉及到引用和賦值,對於Pos、Delete、Copy、Trim來說,索引還是從1開始的。例如:

1
2
3
4
5
6
7
var
  str: string ;
begin
  str:= 'Hello!' ;
  ShowMessage(str[ 1 ]); //Win程序為“H”,Mobile下為"e"
  str[ 2 ]:= 'W' ; //同上
end ;

        如果你的代碼需要同時支持老版本的編譯器,例如Delphi7,那么需要自己加編譯開工。

1
2
3
4
5
6
7
8
9
10
var
  str: string ;
begin
  str:= 'Hello!' ;
  {$IFDEF MSWINDOWS}
  str[ 3 ]:= 'W' ;
{ $ELSE }
  str[ 2 ]:= 'W' ;
{ $ENDIF }
end ;

        如果你的程序不需要支持老版本的編譯器,那么可以使用TStringHelper來處理Strings。例如:

1
2
3
4
5
6
7
8
9
10
var
  str: string ;
  nIndex: Integer ;
begin
  str:= 'Hello!' ;
  n:=str . IndexOf( 'e' ); //類似Pos函數,但不管Win環境還是Mobile,索引都是從0開始,都是返回1,下同。
//str.Remove===>類似Delete
//str.Substring===>類似Copy
//str.Trim===>類似RTL的Trim
end ;

二、生存期自管理

        例如,很多人喜歡使用這種代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1
var
  g_List:TList;
 
..............
 
procedure DoSoneThing;
var
   MyObj:TMyObject;
begin
  MyObj:=TObject . Create;
  g_List . Add(MyObj);
end ;
 
2
function GetAObject:TMyObject;
begin
  Result:=TMyObject . Create;
end ;

        這個代碼在Win平台下工作的很好,但在Mobile平台下會出錯,原因在於Mobile下對象是自管理的,類似以前的COM對象,編譯器會自動加上“__ObjAddRef;”和”__ObjRelease”,例如局部變量,離開函數后會被__ObjRelease給釋放掉。
        解決方案:

1
2
3
4
5
6
7
8
9
10
11
12
1
var
  g_List:TList<TMyObject>; //改成泛型的TList,記得uses Generics.Collections單元
 
2
function GetAObject:TMyObject;
begin
  Result:=TMyObject . Create;
{$IFDEF AUTOREFCOUNT}
  Result . __ObjAddRef; //多加一次計數,真正釋放的時候記得減少
{$ENDIF AUTOREFCOUNT}
end ;

三、自釋放不要使用Destroy,否則會出現“Project Project_Mobile raised exception class ESafecallException with message ‘Exception in safecall method’.”錯誤。

1
2
3
4
5
6
7
8
9
10
11
12
function TUDPBuff . Release: integer ;
begin
   Result:= {$IFDEF DELPHI7}InterlockedDecrement{$ELSE}TInterlocked.Decrement{$ENDIF} (m_nRef);
   if Result= 0 then
   begin
     {$IFDEF MSWINDOWS}
     Destroy;
     { $ELSE }
     DisposeOf; //或Free;
     { $ENDIF }
   end ;
end ;

分類:基礎知識

 

http://www.138soft.com/?p=387


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM