Feeds:
文章
留言

Archive for 三月 27th, 2007

Delphi For PHP 初探

Chui-Wen Chiu(Arick)
MSN SpaceGoogle DocGoogle Blog
2007.03.27

測試環境:
1. Windows XP Pro + SP2
2. Delphi For PHP 1.0
3. MySQL 3.23.58

  • Application 架構
    • <?php
              //Includes
              require_once("vcl/vcl.inc.php"); // VCL 底層實作函數庫
              use_unit("forms.inc.php"); // 應用程式基本架構:Application, Frame, Page, Window, …
              use_unit("extctrls.inc.php"); // 延伸 VCL 控制項:Image, FlashObject, GroupBox, Timer, Shape, ….
              use_unit("stdctrls.inc.php"); // 標準 VCL 控制項:Button, CheckBox, Label, Edit, ListBox, …

              //Class definition
              class Unit1 extends Page // 每一頁面都需要繼承 Page
              {
              }

              global $application; // 在 forms.inc.php 中產生  

              global $Unit1;

              //Creates the form
              $Unit1=new Unit1($application); // 將自訂 Page 加入 Application

              //Read from resource file
              $Unit1->loadResource(__FILE__);// Page 讀取 UI 設定 XML 檔, unit.xml.php, 定義在 Component

              //Shows the form
              $Unit1->show(); // 顯示頁面內容,定義在 Control

      ?>

    • 類別階層
      • + Object (system.inc.php)
            + Persistent (classes.inc.php)
                + Component (classes.inc.php)
                    + Control (controls.inc.php)
                    |   + FocusControl (controls.inc.php)
                    |       + ScrollingControl (controls.inc.php)
                    |           + CustomPage (controls.inc.php)
                    |               + Page (forms.inc.php)
                    + Application (controls.inc.php)
  • 顯示資料庫
  • 使用 Data Explorer
    • 透過 UI 設定資料庫連線,如果連線成功將可看到資料庫的所有 Table
    • 將 Table 拉到 Form 上即可,自動產生 Database, Table, DataSource 和 DBGrid
  • 手動使用 Database, Query, Datasource. DBGrid 完成資料庫呈現  
    • 基本上就是將上面方式改成手動設定,Query 取代 Table 元件,透過 Query 元件可以指定查詢條件

  • 在控制項事件中使用 Javascript
  • 透過 Delphi For PHP 開發環境的 Object Inspector | Javascript 設定對應的 Event Handler
  • 此時,Delphi For PHP 會在 *.xml.php 中產生對應的 <property> 如: <property name="jsOnClick">JSClick</property>
  • Code Editor 也會產生對應的區塊,如:
    function JSClick($sender, $params)
    {
    ?>      
            //Add your javascript code here  
            alert( document.getElementById(‘MyButton1’).value);
    <?php
    }

    

  • 前端產生的結果如下:
    function JSClick(event)
    {
    var event = event || window.event;
    var params=null;
            //Add your javascript code here
                   alert( document.getElementById(‘MyButton1’).value);
           
    }
  • 補充:想要透過 Javascript 取得 VCL 元件,透過 document.getElementById 即可取得,Id 即 VCL 的 name。

  • 自訂 VCL假設元件檔案名稱為 unit1.inc.php, unit1.package.php)
    • 建立自訂元件
      1. 選擇 Component | New Component

                    2. Ancestor Type 選擇你要從那一個類別繼承
                    3. Classname 給予一個你的元件名稱
                    4. Palette Page 指定元件放置在那一個分類中
                    5. 將 *.inc.php 複製到 C:Program FilesCodeGearDelphi for PHP1.0vcl
                    6. *.package.php 可以隨意放置
                     

      • 補充:預設 use_unit 會到 C:Program FilesCodeGearDelphi for PHP1.0vcl 搜尋指定的 *.inc.php。如果想要變更目錄,必須修改 unit1.package.php 的 registerComponents("Additional",array("MyButton"),"cwc/unit1.inc.php");,如此, use_unit 就會到 vcl/cwc 下尋找該元件。

    • 建立非視覺化元件
      • 繼承 Component 系列的元件,而不要繼承 Control 系列的元件即可。

    • 新增 Server 端事件
      function FireMyEvent(){
          // 呼叫 Server 端事件,定義在 Component
          $this->callEvent(‘onmyevent’, array($this, 1, 2, 3));
      }

      // 宣告一個事件
      protected $_onmyevent = null;
      function getOnMyEvent()       { return $this->_onmyevent; }
      function setOnMyEvent($value) { $this->_onmyevent = $value; }
      function defaultOnMyEvent()   { return ""; }

    •  新增屬性
  • 將游標移到元件需要加入屬性程式片段的地方,選擇 "Edit | Add New Property "
  • 自行加入 getXXX, setXXX 對應的函數,VCL 會自動產生 XXX 屬性,如下: (此寫法可以讓屬性再屬性視窗中進行設定)
    class MyButton extends Button{
       protected $_v;
       function getXXX(){ return $this->_v;}
       function setXXX($v){ $this->_v = $v; };
    }
  • 屬性的類型
    • 簡單:數值、字串… 等,使用者能夠直接編輯的皆屬此類
    • 列舉:透過下拉選單選擇
    • 物件:表單上得另一個物件
    • 子屬性:一個物件的多個屬性,如:Font.Case, Font.Color, Font.Align, …
    • 陣列:使用特定的編輯器

    • 加入訂定圖示
      • 準備一張 16×16 24BPP 的 BMP 圖檔
      • 將圖檔命名和元件名稱一樣,如:MyButton 類別對應的圖檔為 MyButton.bmp
      • 將圖檔案放置在 unit1.package.php 的 setIconPath() 所指定路徑
      • 安裝 package 即可看到該圖示

   

    • 新增多個元件到已經存在的 Package 中
      • 只需要在 unit1.package.php 多加幾行 registerComponents 即可,如下:
          registerComponents("Additional",array("MyButton"),"unit1.inc.php");
          registerComponents("Additional",array("ArickButton"),"unit2.inc.php");
      • 重新安裝 Package

    • 設定 Package 名稱
      • 修改 unit1.package.php 的 setPackageTitle("System VCL for PHP Components");

    • 新增/移除 Package
      • 使用 Component | Package

   

  • 國際化
    • Delphi For PHP 提供 Internationalization Wizard 來讓你對不同的國家自訂語系,且程式會依據國家的不同將轉換成自訂的語系。Internationalization Wizard 負責的工作有
      a. 收集專案中使用的檔案
      b. 選擇應用程式要針對哪些國家建立對應語系檔
      c. 掃描所有的原始檔並產生相對應的語系檔

      當完成 Internationalization Wizard 的動作後,在專案的目錄下會產生 local 目錄,這個目錄包含各語系檔案。假如你希望元件能夠取用語系檔的文字,必須使用 gettext() 或 _() 取得語系對應文字,如:
      $this->Button=_("Localize this string");

  • 快速鍵
    • Ctrl+J  程式樣板列表
    • F5 新增/移除中斷點
    • F6/Shift+F6 往前/往後移動 Code Editor Tab
    • F9 啟用除錯器執行程式
    • Shift+F9 不啟用除錯器執行程式

已知缺點:
1. 採用類似 ASP.NET 的 Server-Side Control 概念,所有元件的 Event 處理都是 Form Submit 到 Server 端處理後在重新呈現新頁面。
2. 每一次畫面的呈現似乎都需要解析畫面配置的 XML
3. 每一次的元件修改都需要重新安裝 Package
4. 透過 DBGrid 顯示 Big5 的中文資料會亂碼

Read Full Post »

之前一直嘗試想以 meta-programming 的思維寫程式,今天終於想到如何寫了^^
下面是我的 Fibonacci 範例
// VC8
#include <iostream>
template<int n>
struct fac{
 enum{ value= fac<n-1>::value+fac<n-2>::value};
};
 
template<>
struct fac<0>{
 enum {value=1};
};
 
template<>
struct fac<1>{
 enum{value=1};
};
 
int main(){
 std::cout << fac<40>::value << std::endl;  
 return 0;
}

Read Full Post »