2013/10/31

Day7 使用 LiteDAC 仿造一個 IBLite 的 Demo

在 EMBT 的 Youtube 中有一段 Demo 是在描述 dbExpress with IBLite 的範例

Youtube : Mobile IBLite with Delphi XE5
 

看起來很是麻煩,畢竟是單向資料集,需要用很多元件才能達成存取的目的。

使用 LiteDAC 時,就像在 VCL framework 的 2-Tier 下一樣簡單,底下是範例 Code






 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
procedure TForm1.AddButtonClick(Sender: TObject);
var
  DeptName: String;
  NewDeptNo: Integer;
begin
  try
    if InputQuery('Enter New Dept Name', 'DNAME', DeptName) and not (DeptName.Trim() = '') then
    begin
      LiteQuery1.Last();
      NewDeptNo := LiteQuery1.FieldByName('DEPTNO').AsInteger + 10;
      LiteQuery1.Append();
      LiteQuery1.FieldByName('DNAME').Text := DeptName;
      LiteQuery1.Post();
      LinkFillControlToField1.BindList.FillList();
    end;
  except
    on e: Exception do
    begin
      ShowMessage(e.Message);
    end;
  end;
end;
///
procedure TForm1.DeleteButtonClick(Sender: TObject);
begin
  try
    if LiteQuery1.Locate('DNAME', ListView1.Selected.Text, []) then
      LiteQuery1.Delete();
    LinkFillControlToField1.BindList.FillList();
  except
    on E: Exception do
      ShowMessage(E.Message);
  end;
end;

事實證明,LiteDAC 在發佈到行動裝置時完全不需要再帶任何的 Libraries,對於行動裝置的開發實在是太方便啦!

2013/10/30

Day6 FireMonkey 的幾個樣版

在新建立的專案中,Blank Application 是最常用的樣版,但 Header / Footer 和 Header / Footer with Navigation 實際上到底能不能用 Blank Application 做出來?

看起來樣版間似乎互不相通
直接看看 Header / Footer 樣版的結構吧。
H / F 樣版可是意外的簡潔
非常直白的三個元件 - Footer(TToolbar) + Header(TToolbar) + Label(TLabel)
如此就能構成一個帶有頭和尾的專案,就算用 Blank Application 先建立也不過是拉三個元件的時間。


再來看看 Header / Footer with Navigation 樣版的結構。
元件很多,但不難理解
和原先的H / F很接近,主要是多了 TTabControl 這個頁面管理元件
和 VCL 裡的 TPageControl 很接近。

嗯,所以可以參考樣版來設計屬於自己的 Blank 專案。一面加強對 FireMonkey 元件的熟悉度。

2013/10/29

Day5 LiteDAC - iOS開發的利器

當窮得只剩 PC 的時候...那就戰到不能戰為止吧!

在 iOS 應用程式部屬到設備上時有個很嚴重的限制:
就是在發佈應用程式時不能附帶任何的 libraries (*.dylib) 。

難道在資料庫的存取上就只能走 DataSnap 嗎?

當然不是,我們還可以使用 iOS 內部支援的 SQLite 當作本機資料庫使用,現在就來介紹新的工具吧 -- LiteDAC!

Devart 的 DAC 元件群(ODAC、MyDAC、PgDAC、IBDAC、UniDAC 和 LiteDAC)有個最大的特色,就是它不需要任何的 libraries (*.dylib),就可以直接存取資料庫。

今天就初步來介紹本次的主角 -- LiteDAC!

使用上非常的輕鬆,底下是原始碼:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
procedure TForm1.FormCreate(Sender: TObject);
var
  _Count: Integer;
  _Temp: TLiteQuery;
begin
  _Temp := TLiteQuery.Create(Self);
  _Temp.Connection := LiteConnection1;
 
  LiteConnection1.Options.ForceCreateDatabase := True;
  LiteConnection1.Database := IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) + 'emps.sqlite';
  LiteConnection1.Connect();
 
  _Temp.SQL.Text := 'SELECT count(*) FROM sqlite_master WHERE type=''table'' AND name=''DEPT'' ';
  _Temp.Open();
  _Count := _Temp.Fields[0].AsInteger;
  _Temp.Close();
  if _Count = 0 then
  begin
    _Temp.SQL.Text := ''
      +'CREATE TABLE DEPT '
      +'( '
      +'   DEPTNO INTEGER NOT NULL, '
      +'   DNAME  VARCHAR(14), '
      +'   LOC    VARCHAR(13), '
      +'   PRIMARY KEY (DEPTNO) '
      +') ';
    _Temp.ExecSQL();
 
    _Temp.SQL.Text := ''
      +'INSERT INTO DEPT '
      +'VALUES      (10, '
      +'             ''ACCOUNTING'', '
      +'             ''NEW YORK''); '
      +' ';
    _Temp.ExecSQL();
 
    _Temp.SQL.Text := ''
      +'INSERT INTO DEPT '
      +'VALUES      (20, '
      +'             ''RESEARCH'', '
      +'             ''DALLAS''); ';
    _Temp.ExecSQL();
 
    _Temp.SQL.Text := ''
      +'INSERT INTO DEPT '
      +'VALUES      (30, '
      +'             ''SALES'', '
      +'             ''CHICAGO''); ';
    _Temp.ExecSQL();
 
    _Temp.SQL.Text := ''
      +'INSERT INTO DEPT '
      +'VALUES      (40, '
      +'             ''OPERATIONS'', '
      +'             ''BOSTON''); ';
    _Temp.ExecSQL();
  end;
 
  LiteQuery1.Open();
end;

很快速的做出了新的成品

1
LiteConnection1.Options.ForceCreateDatabase := True;
Options 的參數 ForceCreateDatabase 是在指定 LiteDAC 要檢查 iOS 上是否已有指定的資料庫存在。
1
LiteConnection1.Database := IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) + 'emps.sqlite';
IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) 是直接取得 App 在 iOS 裝置裡的路徑。

附帶說明:LiteDAC 在 iOS 上會智能載入系統自帶的 SQLite 驅動,所以在 LiteConnection.Options.Direct 一定要為 False 。


LiteDAC 官網在這兒

2013/10/28

Day4 RAD Studio XE5 第一支快快樂樂學寫手機程式誕生

非常快速的寫了一支Demo程式
真的很快啊!

可是在Android上卻發生沒有回應的問題
嗯……這該怎麼辦呢?


Day3 RAD Studio XE5 的 C++ ... 還是先從 Delphi 開始練習好了

不知道為什麼 C++ Builder 老是出怪手,不過我也沒時間 Debug 它了
等它的正式版推出了再回過頭來測試吧。

再來看看 Delphi 的實作狀況:

果然是順多了,沒有怪怪的異常訊息,和ClientDataSet也能夠正確 Binding 。

明日再來試著 ApplyUpdate 的實作

2013/10/26

Day2 RAD Studio XE5 資料庫連線測試

因為測試時間不多
所以想快一點連線到資料庫

但…dbExpress怎麼突然都連不到資料庫了?

所以來到了 Devart 網站尋求支援了


搭配了 Firebird 2.5
底下 Devart dbExpress for Firebird 的連結畫面


好不容易裝好,卻在Compile時出現以下的錯誤

奇怪…照著手冊上的教學卻出錯了,不知道是哪裡的問題

總之,先這樣吧!

Day1 RAD Studio XE5 前置準備


首先就是準備下載 RAD Studio XE 5 ,準備進行 30 天的試用
以及準備一台 MAC 進行模擬測試

究竟 30 天可以玩出什麼東西呢?


我也不知道

總之,先做了再說吧 ^___^

FireMonkey框架核心概念是 LiveBinding 和 dot NET / Flex 所指的 Binding有異曲同工之妙

但我還是喜歡 Flex 的全時 Binding 的概念

FireMonkey / dot NET 都是一次性 Binding 的概念
如果資料異動了就需要重新 Binding …… 這和 Binding 的本意不太一樣吧 哈哈

在使用行動平台前,先用 C++ Builder 來試試看吧