2018/12/24

Delphi in Depth. Windows Message vs Thread.

程式很忙


同事最近遇到程式運作流程不如預想的情形,來找我幫忙解決。

研究程式碼的過程中,發現他用到大量的 PostMessage / SendMessage,這是相當有趣的走向,同事解說是在於在 Event call Event 時,有時會因為 UI 刷新造成互相干擾進而發生例外,所以才這樣寫。

PostMessage 和 SendMessage 兩者差異說明如下:
Non Blocking 和 Blocking,也等同 Asynchronous (非同步) 和 Synchronous (同步) 的關係。

PostMessage 的場合:主程式 (Main Thread) 執行到此句時會把 Message 放進 Message Queue 裡 (可以視為 Sub Thread) 依序排好,等待 Main Thread Idle 時才會把 Message Queue 依序派送到主程式的對應函式處理。

程式流程如下:

2018/11/29

JavaScript for WebBroker framework



前端網頁寫久了,還是覺得 Delphi JavaScript DataSnap framework 在 AJAX 上使用來得方便,官方範例的 ReverseString 是這樣寫的:

2018/11/08

Bootstrap 4 學習雜記 (01)

設計心法:
以最小設備畫面進行設計,之後的放大會自適應。

單位:
只認 em / rem (相對單位),不建議使用 px。

骨架:
  • Column 以 12 為邊界,每個 Sub column 可再切分 12 Columns,以此類推。
  • 尺寸後贅 (小 -> 大):.col-* (xs-*) -sm-* -md-* -lg-* -xl-*。
  • 上述尺寸後贅大多可套用在像 Button 等物件類別宣告中,和 Grid 配置相呼應。


See also:

2018/11/07

【考古】Stand-Alone WebBroker Application in Delphi 7



Delphi 7 不支援 Unicode,但不代表它不能寫網頁 or API。

2018/09/10

Python and Django with WinXP


Python 3.4.4 is last version in WinXP.


2018/07/26

Open dbExpress update - 2018.07.25 version


Update: 2018.07.25 support 10.2 Tokyo (Arc / Ent / Professional / Community Edition) -- Download Link


The major problem is finally solved.
In version 2017.01.17, the corrections are as follows:

  • Has been excluded from the installation of BPL, the IDE appears to lead to [Duplicates not allowed] error.
  • At the same time to solve the Run-time must be loaded dbxconnections.ini, dbxdrivers.ini problems.
  • Fixed DEMO program can not compile problem.


Details:

Download Open dbExpress 2017.01.17 supported RAD Studio 10.1 Berlin.

2018/07/25

Devart UniDAC Express 初體驗

Devart UniDAC Express 安裝
下載點:
https://www.devart.com/unidac/download.html


下載 10.2 Tokyo 的版本

安裝就一直按 Next,相當簡單

因為 UniDAC Express 不含任何的 Provider,所以這時的 TUniConnection 是連不上任何資料庫的。

2018/07/19

RAD Studio Community Edition 快速安裝介紹

可先到 Delphi Community Edition Landing Page 下載 ESD 安裝檔。C++ Builder Community Edition 在此

下載 ESD 的同時會發序號 email 給你

要注意的是,Community ESD 線上安裝除了介紹所需的 .Net 套件外,還需要自行下載 DirectX 9.0c 轉發套件,若未安裝時,進行到安裝 DirectX 9.0c 時會安裝失敗,屆時只能移除重裝。

2018/07/08

JavaScript iframe Variable Scope Test


目的:
測試 JavaScript Variable 在重複載入時是否共用同一個 Variable。

測試方式:
建立多個 iframe,但指向同一個 html 檔案。

JavaScript code is below:

  var MyVar = 0;
  function onButtonClick() {
    $("#A1").html(MyVar);
    MyVar += 1;
  }


預期:載入 base.html 時,MyVal 會預設歸零,藉以測試其它重複載入的 iframe 裡的同名變數是否會被影響。

測試步驟:
1. 建立 iframe 並累加 5 次變數
2. 以再建立 iframe 的方式重複載入該 html 檔案
3. 回到原 iframe,再累加變數,檢查變數是否歸零
4.切換到 2. 所建的 iframe 並累加變數,檢查變數是否被 3. 累加

結論:
各別的 iframe 就算是載入相同 JavaScript 檔,裡面同名 Variable Scope 也僅限在該 iframe 裡。

結果符合預期,收工。



See also :



2018/07/05

JSONObject Sort by Delphi


在 KTOP 看到有人在問 JSON 物件能否排序。

第一時間想著官方沒有類似 TJSONObject.Sort 的方法,除非再自行加工改寫。

後來看到其他會員回答的排序法,而樓主似乎也不排斥『要自己寫程式』的方式。

內容使用到『泛型物件』和『DBXJSON』,一時手癢,就自己試著玩玩看:

2018/06/28

Async callback in JS DataSnap Framework

This is a question about a obsessive-compulsive disorder patient. photo from



In the default Datasnap REST application, if there is a specified build of the Sample Methods :

The "echostring" and "ReverseString" two method and corresponding pages are added to the template. By opening the Reversestring template, you can learn that JavaScript is written like this:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
function onReverseStringClick()
{
  if (loginRequired && (AdminInst == null))
  {
    showLogin(true);
    return;
  }
  var valueField = document.getElementById('valueField');
  var s = serverMethods().ReverseString(valueField.value);
  valueField.value = s.result;
}

2018/06/06

Boost Regex and Unicode in C++ Builder

Boost - Bast C++ Library
Because "String" default is unicode in C++ Builer 2009 later.

And same std::wstring.

so, We should to use prefix "w" class, like:
wregex, wsmatch etc.

The Sample code below:

2018/06/01

Delphi Base Class - TProc (CHT)

圖片來源

TProc 在 Delphi 的宣告是:
1
2
3
4
5
TProc = reference to procedure;
TProc<T> = reference to procedure (Arg1: T);
TProc<T1,T2> = reference to procedure (Arg1: T1; Arg2: T2);
TProc<T1,T2,T3> = reference to procedure (Arg1: T1; Arg2: T2; Arg3: T3);
TProc<T1,T2,T3,T4> = reference to procedure (Arg1: T1; Arg2: T2; Arg3: T3; Arg4: T4);


最近在寫測速程式時突然應用到它,我是這麼寫的:

2018/05/24

WebBroker cookie in ISAPI (CHT)


Cookie 在網頁開發幾乎是必須,而它有幾個限制:

  • 容量為 4 KB
  • 明碼傳遞
  • 會強制放在 Request / Response 一起傳送,增加傳輸流量

增加 4 KB 的傳輸流量在現在這個動不動就幾個 Mbit 的網路速度來說,離負載也差得太遠。

Https 也快要成為主流,所以明碼傳遞也不是問題。

最近的問事中,有一項是開發 WebBroker 專案中,在 Cookie 設計上遇到些麻煩:

  1. Exe / Debug Server 模式下,Cookie 在 Server 及 Client 皆可正確存取。
  2. ISAPI 模式下,Server 可以存取由 Server 建構的 Cookie,但 Client 找不到,反之亦然。

Delphi 3 以來,從沒見過有人提出這類問題。

2018/05/03

利用Google Book API查詢ISBN取得書籍資料(CHT)





最近在【Google Book APIを使ってISBNコードから書籍情報を取得する】有提到利用 Google Book API 查詢 ISBN 並取回結果,操作方式還相當簡單。


接下來有兩個問題:
  • Google Book API 有沒有限制?
  • 舊版 Delphi 和 Starter 版是否可以支援?

首先來看看 Google 怎麼說的

2018/04/07

About New Threads On FMX For Android (CHT)

在 Delphi Tokyo (10.2) 後,Delphi UI 的 Thread 在 Android 下發生了一點變化,原文如下:

Unification of Delphi and Java threads on Android: CallInUIThread has been deprecated. All code is now running in the Java UI Thread, removing the need for thread synchronization.
由此可推斷出,以前 FMX 在 Android 的運作模式如下:

FMX for android in  before Delphi 10.1

因為 Delphi UI Thread 是基於 Java UI 之上,使用者操作 Java UI 層時,還需要經過 Delphi UI 層的同步處理才能觸發 Delphi 物件的相關事件,故效能和原生的 Java App 相比下會來得差一點。


而在 10.2 之後,不再是雙 Thread 並行,除了執行效能有顯著提升外,連 FMX 在 Android 平台都【自動升格為 Thrad safe 】了!



但問題來了,這種底層架構的調整,對於 FMX for Android 舊版本專案會有影響嗎?

答案很明顯的……



















一定有!但不大

問題不大的原因在於,絕大多數的開發方式並不會使用到 Thread,也就是說,UI 層的問題在編譯程式時就已經解決了。

而最大的問題在:邏輯層面的 Bug。

既然是 Thread 層的修正,那問題一定也會出在 Thread 上。

首當其衝的當然就是『3rd party』了!(笑)



FGX-FireMonkey】的範例就有用上 Thread (TfgActivityDialog, TfgProgressDialog),相當經典,但在 10.2 時卻會發生元件畫面無法出現的問題。

相同的程式碼在 10.1 以前的程式流程是這樣的:

TfgAD = TfgActivityDialog

如果程式碼不改變的情況,在 10.2 後『純 Java UI Thread』下的流程會是這樣:



於是 TfgActivityDialog 自然就看不到囉!(笑)


結論
FMX 還是一個年輕且在成長的框架,所以每當底層架構有所變化時,都要檢視一下自己的專案是否會因改版而必須有所更動,每一個版本的 What's New 內容非常重要,務必好好研讀。

其實上圖之所以會有這個問題不是 FGX 作者的問題 (就算是,作者也不再維護了……),主因還是會回到 Thread 控制根本上的不同,隨著架構的變化而重構專案程式碼才會是最佳解。



See also:


2018/02/26

使用 ZXIng 試作 QRCode (CHT)

Photo from Thinkstock
QRCode 在行動裝置上有【規格一制性】的特色,Barcode 一整個被比了下去。

而在 Delphi 平台上也常遇到有人在問 QRCode 要怎麼繪製,一直到最近在 KTOP 才出現一個比較正式的回答。

核心的方案是 DelphiZXingQRCode,它採用的是【Apache 2.0】的授權,不僅免費,連商業使用都沒問題,實在是太佛心。

2018/02/13

XLSX 檔案格式除錯 (CHT)

最近同事傳來一個轉檔為 xlsx 後出現的一個錯誤,訊息大致如下:
【Excel 發現無法讀取的內容 您是否要回復此活頁簿內容...】

修正後,會取得以下的資訊:

2018/01/20

JSON build and parser with C++ Builder (CHT)

圖片來源

開始學習網頁技術後,大致上都在 JSON 上面繞圈圈。

由於 C++ 本身沒有相關的函式庫,所以必須要找 3rd library 加以載入後才能使用。

然而 Delphi 已經有提供 JSON Framework,想必 C++ Builer 也一定會有,問題在於……