2014年6月26日星期四

离开delphi,进入.net滚爬

离开delphi,进入.net滚爬,摸xamarin

2014年6月12日星期四

编译android的时候,出现E2606

写了程序,win32,ios都可以编译过了,编译android时,本来也是好好的,突然就出现了

[DCC Error] KmStatusCltMob.dpr(25): E2606 Duplicate resource: type VERSION ID 1

clean后再build仍然一样,打开res看看也没重复,奇怪了

2014年6月11日星期三

http://www.fmxexpress.com/

这要整fmx,这回应该是找到了家了吧

XE6的mobile开发到底走不走的通

进展的不顺,就回头看看到底走的方向是否正确。在开始选择方向时,就曾经反复查证,觉得是个好方向。现在想法有些变了。

一套代码,多个平台,多美好。为了实现这个,当时的比较过不少framework。基于html5的假跨平台的PhoneGap,改名后捐献给apache后叫Cordova或者Sencha,另外还有Kendo首先就排除了,嵌入浏览器形式的,还是少碰,速度应该是硬伤啊。titanium是基于js的,底层怎样走还不是很清楚,应该仍然是js的解析引擎解析后搞到本地api+本地封装的plugin api吧,也可以说是vm一种。xamarin是C#的,应该和FMX差不多了吧,可仔细看,好像也是基于vm的形式的运行的,也就是仍然call的是各自平台的api来做事,比如create a button。剩下的就FMX,真正的native,并且控件都是自己绘制,多牛。但这些想法,试着开发了这几天,才发现FMX的所谓native看起来是美妙的。

首先,速度真的那么重要吗,是否native是否真的重要吗,这有点像当年AMD说我才是真双核,Inter是假的。真假有那么重要吗,重要的是cpu真的比你快比你稳定。
第二,FMX的bug重重,用的人仍然非常少,我编译测试EMBT的自己的Sample,有些都过不去。
第三,FMX宣传的一个代码,多处使用,就连这个,也是个理想,各自平台的不同,仍然得让你准备不同的代码。
第四,EMBT的财力和人力,要死不活的状况仍然将持续很长时间,作为跟屁虫的Fans该怎么选择。EMBT目前还换汤不换药的推出了新产品AppMethod,唉,都学Adobe的CC思路了:只租不卖,穷疯了

的确是很泄气,不是Delphi的热爱者,我立刻就掉头xamarin了,因为抛出个人因素,xamarin我是更看好。如果我是一个编程初学者,xamarin应该是首选

迷茫ing...

看了这个,也得好好考虑到底“一套代码,多个平台”是否真的就是方向

最后,andorid的模拟器太慢了,可以加速的android的x86模拟器又不能用,调式iOS还得两台机器看来看去也麻烦,拜google,居然有提供租赁服务的
租赁Mac:http://www.macincloud.com
租赁Android:http://www.scirocco-cloud.com

2014年6月10日星期二

FireDac + DataSnap的mobile开发(二)

进展中,立刻又碰到另一个问题,SmartInspect是没法在iOS或者Android上面用的,那要怎样看debug log输出呢
翻来服务看帮助,可以用下面的方法来实现
procedure Log(format: String; params: array of const);
var
  l: IFMXLoggingService;
begin
  l :=  TPlatformServices.Current.GetPlatformService(IFMXLoggingService) as IFMXLoggingService;
  l.log(format, params);
end;

procedure TfrmLogin.btnOkClick(Sender: TObject);
var
  UserName, Password: string;
begin
  UserName := edtUserame.Text;
  Password := edtPassword.Text;
  if LogIn(UserName, Password) then //call ServerMethod
  begin
    Hide;
    frmMain.Show;
  end
  else begin
    Log('Wrong Password', []);
    ShowMessage('Wrong Password');
  end;
end;
运行后,iOS上面,用 模拟器 的的查看系统system.log可以看到这个的输出。在Android上,用Android Debug Monitor的logcat可以看到输出。IFMXLoggingService接口目前就一个函数。背后实现估计仍然是call的NSLog和android.util.Log。UIKit的代码跟不进去,IDE上看不见是如何实现的。

FireDac + DataSnap的mobile开发(一)

扯了一些时间,应该进入正题了。一点也不顺利。

目标是,服务器用DataSnap Server来提供http的服务,客户端可以MsWin,可以iOS,可以Android(armv7)。写代码跑了,MsWin自然是没问题,Android的虚拟机太慢了,并且EMBT目前只支持arm架构的编译。iOS跑起来还行,但是问题 仍然多多。

首先遇到的问题就是FDConnection通过DataSnap Connector上服务器时,如果使用了Filter,根本上不来,直接报错【Loading SSL module faild】,原因是Indy使用的ssl库,IdSSLOpenSSLHeaders.pas在windows上面dll可以支持,到了iOS,沙盒里,没这个库,所以就挂了。

拜google,发现这个问题大家都遇到,后来看到了这个文章,才解决

2014年6月6日星期五

在客戶端用FDConnection替代SQLConnection(二)

东摸西摸,算是搞出来了怎么使用,同时埋怨EMBT的文档质量。
在客户端用FDConnection替代SQLConnection后,用TFDStoredProc可以来访问服务器上返回DataSet的方法
服务端仍然是老代码
function TSmSample.GetTblImage: TDataSet;
var
  Conn: TFDConnection;
  Query: TFDQuery;
begin
  Conn := dmConn.AcquireConnection;
  Query := TFDQuery.Create(nil);

  try
    Query.Connection := Conn;
    Query.SQL.Text := 'SELECT * FROM tbl_image';
    Query.Active := True;
    Query.FetchAll;
    Result := TFDMemTable.Create(nil);
    TFDMemTable(Result).Data := Query.Data;  //will not trigger fetchall auto
  finally
    if Assigned(Query) then
      FreeAndNil(Query);
    dmConn.ReleaseConnection(Conn);
  end;
end;

procedure TSmSample2.Plus10(var I: Integer);
begin
   log.TrackMethod('TSmSample2.Plus10');
   I := I + 10;
end;
客户端,用FDConnection来搞就变成
procedure TForm1.Button5Click(Sender: TObject);
begin
  FDStoredProc1.Close;
  FDStoredProc1.Unprepare;
  FDStoredProc1.StoredProcName := 'TSmSample.GetTblImage';
  FDStoredProc1.Open;  //ParamByName('ReturnValue') is ptResult, a DataSet
  with FDStoredProc1 do
  while not Eof do
  begin
    log.Debug('record:%s', [FieldByName('PId').AsString]);
    Next;
  end;
  FDStoredProc1.Close;  

  FDStoredProc1.Close;
  FDStoredProc1.Unprepare;
  FDStoredProc1.StoredProcName := 'TSmSample2.Plus10';
  FDStoredProc1.Prepare;
  FDStoredProc1.ParamByName('I').Value := 20;
  FDStoredProc1.ExecProc;
  ShowMessage(inttostr(FDStoredProc1.ParamByName('I').AsInteger));  //30
  FDStoredProc1.Close;
end;
这个FDStoredProc有些像SQLConnection的SqlServerMethod,放到Form里后,点StoredProcName就访问服务器要meta信息建立下拉框了。

另外还发现的事情是,由于没走DBX,不设置DataSnapCompatibility=true,客户端也能正常显示数据,不会出现SBcdOverflow异常,FireDac的FireDAC.Comp.DataSet单元的TFDDataSet.AddFieldDesc函数里面,没有像TCustomSQLDataSet.AddFieldDesc去调整精度。另外虽然说没走dbExpress,但目前的DataSnap仍然大量用了dbx的很多unit。

在客戶端用FDConnection替代SQLConnection

今天突然留意到FireDac裡面有一個TFDPhysDSDriverLink,一查居然是DataSnap的缩写,莫非FireDac已经支持了DataSnap??莫非已经可以用FireDac的FDConnection来替代DBX的SQLConnection??是不是还是走Indy???? 有这个DataSnap的connector,但是我目前仍然没找到如何使用这个?莫非仍然开发中?如果已经可以替代SQLConnection了,那么就可以真的彻底抛弃DBX了

拜google,看到了這個,Dmitry Arefiev也明确表示了,FireDac的DataSnap Connector还是会用Indy。