Skip to Content

電腦

使用 C++ Builder 撰寫 Android 程式

使用 C++ Builder 撰寫 Android 程式

安裝 C++ Builder Android

本篇參考此頁的說明

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Android_Mobile_Application_Development

在安裝 C++ Builder 時,或是在已安裝好的系統上,要安裝 Android 的相關資料。

 

在 Android 手機安裝莊春江工作站

有人詢問如何在 Android 手機安裝莊春江老師所提供的阿含經與尼柯耶以及其他資料,其實就是整個莊春江工作站的內容。因為在離線時,也希望能隨時查詢站上的資料,所以我就試了一下,並把過程記錄下來,提供有需要的人參考。

莊春江工作站單機版可以在此下載

http://agama.buddhason.org/

自己寫一個 GUI 版 C++ Builder 單元測試

最近在寫一個較大的專案,而且要能在 Windows 和 Mac 上執行(Android 和 iOS 以後再考慮),加上第一次用新版 C++ Builder 跨平台的版本寫大專案,所以凡事起頭難,這也是第一次想加上單元測試,以利後續檢查與驗證。

C++ Builder 上面宣稱已有跨平台版本的 DUnitX,詳見如下:

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/DUnitX

主要方法是在 __published 的宣告範圍內寫下要測試的程式,然後自行把每一個測試程式寫進去,執行時就會逐一執行測試程式,最後把結果列出來,如下圖。

用 #ifdef 判斷作業系統

在程式中若是要因應不同的作業系統而有不同的內容,則可以用底下的方法來處理。

#ifdef _Windows

….. (windows 下的程式)....

#endif

底下是目前在 C++ Builder 實際試出來的。

Win32 下有

_WINDOWS_
_Windows
WIN32
_WIN32
__WIN32__
(注意 : 這個在 Win64 沒有)

Win64 下有

_WINDOWS_
_Windows
WIN32
_WIN32
_WIN64

後來在這裡有查到一些,但沒有我測試的完整

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/WIN32#win32

看來判斷 Windows 可用 _Windows

Win32 則用 __WIN32__

Win64 則用 _WIN64

Android 則用 __ANDROID__

Mac 和 iOS 則用 __APPLE__

iOS 則用 TARGET_OS_IPHONE

32位元手機則用 __arm__

64位元手機則用 __arm64__

利用以上去組合,應該就可以判斷了。

補充: 後來看到這篇 

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Creating_an_iOS_App

提到 iOS 可以使用  TARGET_OS_IPHONE 來判斷。

還有如下例子:

#if (TARGET_OS_IPHONE)
// Code for iOS devices only.
#endif
 
#if (TARGET_OS_IPHONE) && (__arm__)
// Code for 32-bit iOS devices only.
#endif
 
#if (TARGET_OS_IPHONE) && (__arm64__)
// Code for 64-bit iOS devices only.
#endif

 

C++ Builder 處理 3D 物件及動畫

3D 物件程式

參考:http://docwiki.embarcadero.com/RADStudio/Tokyo/en/FireMonkey_3D

C++ Builder 可以處理 3D 程式,主要方法簡述如下。

1. 若要能直接放 3D 物件,一開始就要選 3D Application。

2. 若不是在  3D Application 的程式中想加入 3D 的物件,要先加入 TViewport3D 元件,才能在裡面放 3D 物件。

3. 反之,如果要在 3D Application 放 2D 元件,就要先放 TLayer3D 元件,才可以在裡面放 2D 元件。

Firebase 設定與測試

最近才知道 Google 很佛心的提供了免費的資料庫 Firebase 供大眾使用。它是 JSON 格式的資料庫,不是傳統的關聯式表格,很容易提供網頁或 APP 儲存資料,有些程式需要把資料或設定放上雲端的,這也是不錯的選擇。

今天做了一些研究,把心得記錄下來。

首先可以到這裡建立專案 https://console.firebase.google.com/

可以看到新增專案的地方,也可以看到舊專案。

使用 TortoiseGit 刪除 GitHub 上的標籤

這二天有需要刪除 GitHub 上的標籤,但試了半天試不出來,原本以為很簡單,如下圖,只要按下滑鼠右鍵,選擇 "刪除 ref/tags/標籤名",就可以刪除該標籤了。

image

 

不過後來才發現,上面只是刪除了本地的標籤,無法刪除遠端的。只要重新拉取資料,被刪除的標籤又出現了。

在 GitHub 上東找西找,網頁上好像也沒有讓人刪除標籤的方法。

在 Win10 用 VMware Workstation Player 12 安裝 Mac OS X 10.12 Sierra 和開發 c++ 程式

在 2015 年 10 月左右,我在 Win7 上試著用 VMware 安裝了 Mac OS X 10.10 Yosemite。(詳見此頁)

在 2016 年 11 月左右,我用 Embarcadero C++ Builder Berlin Update 2 試用版試著撰寫 Mac 版的程式,Mac 的環境就是上面提到的 10.10 Yosemite。(詳見此頁)

如今作業系統已換成 Win10 專業版,單位也買了正式版的 Embarcadero C++ Builder Berlin Update 2,所以打算重頭安裝最新版的 Mac OS X 10.12 Sierra,以期能用最新的環境來測試程式。

以下是工作環境:

作業系統:Microsoft Windows 10 專業版
開發程式:Embarcadero C++ Builder Berlin Update 2 專業版
虛擬程式:VMware Workstation Player 12.5 ( 此處可下載 )
VMware 支援 Mac 程式 : unlock208 ( 此處可找到相關資料 )
Mac OS X 虛擬檔案:Mac OS X 10.12 Sierra ( 別人準備好的版本 )
Mac 下的開發程式:Xcode v8.2.1 ( Mac App Store 可以安裝 )

請注意,我們不知道這個由別人安裝好的系統裡面究竟有沒有藏什麼病毒、後門等東西,所以千萬不要拿來做重要的事情,只能拿來做些測試。如果要做重要的事,請找正確的管道來安裝 Mac OS。

近日 Drupal 6 的一些雞毛蒜皮大小事

最近管理的 Drupal 6 網站遇到了一些奇怪的狀況,處理的過程中也學到一些東西,簡單記錄一下。

首先是在回應時,某些回應內容會產生奇怪的錯誤。但那些內容若是放在貼文中,就沒有問題。或是先貼個簡單的回應,然後進入編輯,改成先前會有問題的回應內容,此時也沒有問題了。總之,這情況只發生在新張貼「回應」,而且只有某些情況才會有錯誤。

JavaScript 物件中成員函式呼叫成員函式

先前寫的那一篇,我已經移到底下了,實際上問題多多,後來經過幾個高手朋友的指教,再次測試之後,才知道造成錯誤的真正原因是和 jQuery 混在一起了吧。

不過我當初在測試時,是有先避開 jQuery 哩?反正我已經無法重現當初的錯誤,只好把問題怪罪給它了。

總之,目前用底下二個方法來處理物件及測試成員函式的呼叫,都沒有問題。

第一種如下。原本紅色那行應該會有問題,但現在測試一切OK。

    function obj(){
        this.x = 1;
        this.func1 = function(){
            this.x++;
            console.log("func1 : x = " + this.x);
        };
        this.func2 = function(){
            this.x++;
            console.log("func2 : x = " + this.x);
            this.func1();
        };
    }
    var myobj = new obj();
    myobj.func1();
    myobj.func2();

第二種方式是直接宣告物件。底下也是OK的。如果把全部的 this 都換成 myobj,也都沒問題。我在網路上查到有人說用 this 會出錯,換成 myobj 才可以。也許這是之前的問題,現在都解決了吧。

    var myobj = {
        x : 1,
        func1 : function(){
            this.x++;
            console.log("func1 : x = " + this.x);
        },
        func2 : function(){
            this.x++;
            console.log("func2 : x = " + this.x);
            this.func1();
        }
    }
    myobj.func1();
    myobj.func2();

不過,如果搭配 jQuery 使用,在 jQuery 的函式中,就不能直接使用,因為此時的 this 是 jQuery 找到的物件。

底下這樣用會有問題

$("xxx").each(function(){  
    this.func1();  // 這樣會有問題
});

要改成這樣才行

var self = this;  // 先把 this 存起來
$("xxx").each(function(){  
    self.func1();  // 這樣OK
});

另外學到一件事,用 var 宣告的變數會擴展到整個 function,例如:

var i=3;
for(var i=1; i<10; i++)
{
    ...
}
console.log(i);

最後的 i 可不是 3 ,而是 10,這件事真的很詭異。

Yap 告知可以用 let 來宣告變數,就可以限制在區塊中,可參考這篇「深入浅出ES6(十四):let和const」。

  -- 2017/01/19 

底下是昨天寫的,內容有問題,參考就好,留著當紀念。


聽說 JavaScript 的地雷很多,今天終於踩到,幸好爬文半天,終於找到解答。

簡單來說,就是在一個簡單的物件中,某個成員函式呼叫另一個成員函式,想不到那麼簡單直覺的動作,也會出問題。(這些術語或許不適合 JavaScript,看在很少用 JavaScript 的份上,就別計較太多了。)

我的程式原本像這樣:

function obj ()
{
  this.func1 = function(){
    ....
  };
  this.func2 = function(){
    this.func1();    // 錯誤在這裡,
  };
}

後來看到有人提出一種解答,就是把 this 換成物件的名稱,如下:

var obj = {
  func1 : function(){
    ....
  },
  func2 : function(){
    obj.func1();  // 這樣就 OK 了
  }
}

不過我把我的程式中的 this 換成 obj 也不行。

大概是因為我的 obj 是類似定義成一個類別(函式),之後還會用 var x = new obj(); 的方式去宣告。

而那個解答則是一開始就宣告物件 var obj = xxx,所以才能用 obj.func1() 來執行。

 後來又爬文找到另一個解法,就是另外用 prototype 來宣告,如下:

function obj ()
{
  this.func1 = function(){
    ....
  };
}
obj.prototype.func2 = function(){
  this.func1();    // 這樣就可以了
};

不過事情其實沒那麼簡單,因為我又用了 jQuery,所以還是有問題。

obj.prototype.func2 = function(){
  $("xxx").each(function(){  
      this.func1();    // 還是有問題
  });
};

最後才想到,應該是那個 this 已經不是 obj 物件的 this,而是 jQuery 所選到的物件了。所以又改成如下才真正沒問題了。

obj.prototype.func2 = function(){
  tmp = this;  // 先把 this 存在 tmp 中
  $("xxx").each(function(){  
      tmp.func1();    // OK了
  });
};

訂閱文章


about seo