2021/08/25

從Excel操作問題來看工程師的通靈技能


前陣子在 Delphi.KTOP 看到一篇「請問 Excel AddSmartArt 第一個參數該怎麼設定」。

覺得操作 SmartArt 這點很有意思,這兩天才有時間認真看了這篇文章,一開始以為使用 Excel 的「錄製巨集」就可以搞定,但直覺認為回覆此內容時會得到「我早就已經知道」的結果。

因此決定一試 Excel 巨集功能,取得的 VBA 內容是:

    Call ActiveSheet.Shapes.AddSmartArt(Application.SmartArtLayouts( _
        "urn:microsoft.com/office/officeart/2005/8/layout/cycle1")).Select

就這麼短短一行,轉到 Delphi 上會是以下內容:

procedure TForm2.Button3Click(Sender: TObject);
var
  ExcelApp,
  ActiveSheet,
  oSALayout: Variant;
begin
  try
    ExcelApp := CreateOleObject('Excel.Application');
  except
    ShowMessage('建立EXCEL錯誤');
  end;

  ExcelApp.Visible := True;
  ExcelApp.WorkBooks.Add;
  ActiveSheet := ExcelApp.ActiveSheet;
  oSALayout := ExcelApp.SmartArtLayouts('urn:microsoft.com/office/officeart/2005/8/layout/hierarchy2');
  ActiveSheet.Shapes.AddSmartArt(oSALayout, 50, 50, 200, 200);
end;

卻得到以下結果:

看來樓主的問題內容並沒有說明完整,就來看一下 Excel Developer Docs 怎麼描述 SmartArtLayouts:


文件也就這麼一點點,沒了。 再透過 Google 搜尋,沒有更多的資料,Delphi 似乎沒有人這樣做,【找不到成員】這問題難道就無解了嗎?

Google 沒有沒關係,Excel_TLB 單元來解答

利用 Excel 執行檔來製作最適合它的 Delphi 元件看來是最終解法,果不其然,答案在這裡:
ExcelApplication 確實有 SmartArtLayouts 成員,接下來就是直接操作它,程式碼直接公開:
VBA 對 OLE 成員非常自由,Item 到底是什麼東西?經查詢的結果是:

微軟連自家軟體的工程師手冊都寫得如此破碎和簡短,也難怪這方面的開發資訊幾近沒有。

原本還要多寫些關於 SmartArt 賦值的內容,無奈再往下追盡是 Access Violation,使用 Excel_TLB 時必定會發生,Stack Overflow 這篇【Delphi - How to create Excel PivotChart】也遇到一模一樣的問題,雖無法找到原因,但改以 OLE 重新刻一次後卻可以解決問題。

2021/08/09

JetBrains 與 StackOverflow 在 2021 年針對全球三萬多名程式開發者的調查

JetBrains 與 StackOverflow 在 2021 年針對全球三萬多名程式開發者的調查。

Delphi 只佔了其中 1%,換算下來也就 300 多人,就計畫遷移數為 0 的狀況下,我猜這 1% 全部都是超過 30 歲的開發者。
而這 1% 裡面中還可以細分:

  • Desktop = 83%
  • Mobile = 33%
  • Web (Back-end) = 61%
  • Web (Front-end) = 52%

Desktop 使用數最多,表示 Delphi 主力就是在商業開發,Mobile 在這部份僅為加分項目而非主要終端。

Web 比我想像中的還要多,甚至比 Mobile 還要多。

Back-end 和 Front-end 佔比接近,這表示使用 Delphi 若參與 Web,大部份會採用 UniGUI、IntraWeb、DelphiMVCFramework 等中繼開發框架,後端偏多則可能是 DataSnap 也來參了一腳 😁

(你以為我要說 RAD Server 嗎?我偏不! 😛)

EMBT 在 2012 年開始將重心轉往 Mobile 至今,看得出來 Delphi 開發者依舊未大幅度的往行動裝置遷移,在跨平台的選擇上,Web 還是比 Mobile 多,表示應用程式並不會用到太多 Mobile 硬體周邊,也就能合理猜測 Delphi 主要用在商業應用上。然而 EMBT 已經挹注了大量的資源在 FMX 上,還有辦法再多開戰線到 Web 上嗎?

當然,這 300 人不能代表全球還在使用 Delphi 的開發者,至少我就沒被代表到 😆,但也可能是全球開發者的縮影,可以作為之後移轉到其它平台的參考。

和你分享 ❤

SEE ALSO

Delphi Data in JetBrains Developers Survey

2021/08/03

TMS Web Core 試用心得速記


架構

嚴格來說是 Delphi 的 Web 外掛工具,屬於三層架構裡的客戶端,採用兩種模式:

TMS product bundles

近似 Delphi TDataSet 架構,但有自己的 TConnection (TWebClientConnection)、TClientDataSet (TWebClientDataSet) 和 TDataSource (TWebDataSource)。


TMS product plugin

透過 TMS 自訂的規則把三方 JS 元件,如 TWebJQXGrid 等實作為 Delphi 元件。


它們共同的特色是以客戶端的實作,而非伺服器端,有關伺服器的內容要自行製作,對後端的依賴不再是 Delphi,而是各種 REST JSON API 來源,如 ASP.NET、Python、NodeJS 等。

至於 FireDAC 等 TDataSet 元件則無法使用,TWC 完全和 Delphi 資料庫元件脫勾。

連線基礎

TMS Web Core (TWC) 元件在手冊上以存取 JSON API 為主,XML 倒是沒看到,若是使用 TWebJQXGrid 等三方 JS 元件則還需查來源手冊才會知道。

但 TWebJQXGrid 範例在資料的存取上用的是 CSV,頓時有讓我歪腰到 😆


優點

  • 純客戶端呈現,操作效能會比 IntraWeb、UniGUI 等框架還要好。
  • Delphi IDE 的可視化編輯器在編排應用程式 UI 上很好用。
  • 可以把各種三方 JS 元件以 TWC 重新實作在 Delphi 上使用,不再受限於 TWC 元件數量。(這點超讚!)


缺點

  • 習慣 Delphi 資料庫元件的開發者需要轉換開發思維;可能要把 TWC 視為 Indy 之類的網路程式開發會比較容易上手。
  • 若用到三方 JS 元件,仍需要學習相關 JS 知識,多了一道轉換工法。


總結

對依賴 Delphi 的開發者來說,投資 JS 的目的只是為了方便開發 Web 前期的磨刀工作,在進入開發期時,則可以完全發揮 Delphi 的優勢,至於 PascalToJS 的繁瑣工作? TWC 早就為你搞定這一切!


和你分享 😉


See also

 

 

2021/07/26

Devart DBX Driver 試用版關閉腦人的試用訊息方法


試用 Devart dbExpress driver 時,每當程式一執行便會跳出【此為試用版】的警告訊息,導致在測試上還必須多一個按按鈕的動作。

為此,Devart 提供了一個簡單的作法,只要註冊機碼【HKEY_LOCAL_MACHINE\SOFTWARE\Devart\dbExpress\SQL Server】裡,增加【ShowTrialMessage】的 Dword,內容設為 0,便可以在執行時期暫時關閉顯示試用版訊息視窗,其它產品也可如法泡製。

當然,試用 30 天到期時一樣會跳出【已過試用期】的錯誤。😘

和你分享 ❤

See also

2021/07/24

用CSS畫出IE限定的BorderColorLight、BorderColorDark等效果


最近在翻一些古早實作書籍,看到幾個別開生面的 HTML 屬性:BorderColorLight, BorderColorDark,使用 Chrome、FireFox 等支援 HTML5 的瀏覧器來開時會是這樣:


當時只覺得為什麼都是黑白線條,現在該是回來解謎的時候!😉

圖片中的上半部使用到 BorderColorLight, BorderColorDark 屬性,經查才知道是 IE 限定,之後在 IE 裡開啟效果如下:


效果還蠻好看的,原來表格也可以上色彩。

IE 真的好,用 CSS 才驚覺這 BorderColorLight 和 BorderColorDark 是神馬黑技術!

拆解 BorderColorLight 和 BorderColorDark

圖片來源:linuxtopia

Linuxtopia 的圖片真的太到位,連光源都送你了,Light 是指被太陽照到的地方,圖片以淺藍色表示;Dark 則是太陽照不到的地方,圖片以深藍色表示。

理解意思後,就要找 CSS 有沒有可以解的解方。

答案是有的,只是和 IE 相比在 CSS 上並不容易呈現,必須以上下左右獨立設置,回頭看看 IE,簡單明瞭!

原 IE 程式碼:

<table border="2" cellspacing="2" cellpadding="2" 
  width="99%" bordercolordark="#99cc66" bordercolorlight="#ffcccc">
  <caption>Eden IE Table Test</caption>
  <tr>
    <td>IE Column 1</td>
    <td>IE Column 2</td>
    <td>IE Column 3</td>
  </tr>
</table>

改 CSS 程式碼:

在修改前還要說明下,cellspacing 和 cellpadding 這兩個 HTML 屬性又是 IE 限定,這下又多了一道關卡:

圖片來源:維基百科

簡單的說就是填上一堆空白或留白,好在 CSS 這裡相對容易理解,就是多了一道標籤手工活。

<style>
.cssIETable
{
  border-top: 2px solid #ffcccc;
  border-left: 2px solid #ffcccc;
  border-right: 2px solid #99cc66;
  border-bottom: 2px solid #99cc66;
  border-collapse: separate; /*cellspacing */
  border-spacing: 2px;
}
.cssIETable TD {      
   padding: 2;  /*cellpadding*/
} 
</style>
<body>
<table class="cssIETable" border="2"
  width="99%">
  <caption>Eden CSS Table Test</caption>
  <tr>
    <td>CSS Column 1</td>
    <td>CSS Column 2</td>
    <td>CSS Column 3</td>
  </tr>
</table>
</body>


嗯,那復古風味感終於又回來了!😎


See also

2021/07/21

Delphi CE 社群版版權到期延展方法


在【How to extend CE licence?】社群討論中顯示,當 CE 社群版的版權到期時,可以再到 Delphi 社群版下載頁面:https://www.embarcadero.com/products/delphi/starter/free-download/,使用同帳號再註冊一次,EMBT 系統會自動發送新的一組授權序號到你的信箱。

要注意的是這組序號只能註冊當下最新版的社群版中,若版號不一樣則無法使用,此時則必須重新安裝最新版本的社群版。

和你分享 ❤

2021/07/15

FastReport 報表檔 FR3 在 D7 升級 XE 前必須要了解的資訊

我家產品自從 D7 升級成 XE 後,在開發時,報表從零到有還蠻輕鬆的,FR (FastReport) 的報表產生器所產出的 fr3 報表定義檔會自動存為 UTF8 格式。上線後,才發現之前存在 D7 裡的 fr3 在 XE 中在中文的地方會出現亂碼。

D7 所設計的 fr3



XE 讀取 D7 設計的 fr3



沒有什麼比轉一半更令人揪心

在遇到問題時,如果這問題有一致性,就像文字轉碼一樣,全是亂碼的還容易處理:找到編碼,轉換,收工。

但現在的情況是 FR 轉出的 fr3 檔,有部分正常,有部分亂碼,這關最難解!

災難中的小確幸,確定是編碼問題

D7 只支援 Ansi,所以轉出來的 fr3 無庸至疑的是 Ansi,從圖片可知是採繁體中文大 5 碼  (Big5) 代碼頁 (CodePage=950)。

既然知道是 Ansi,現在就可以來猜亂碼的地方是什麼編碼。




我還是直接公佈答案好了:


沒錯,就是 Ansi 的 UTF8 代碼頁 (CodePage=65001)!


難解之處就在二選一

從上圖可以知道當切換代碼頁時,原本能顯示中文的地方會變成亂碼,反之亦然。哼哼,FastReport 真有你的,硬是不出升級工具。官方沒準備,只好自己硬上。

fr3 是 XML 格式,但


Delphi 的 XML Mapper 是很實用的 XML 解析工具,但無奈 fr3 是一個特規,它無法順利解析 fr3 的內容。

 

先說結論

經過在漫長的奮鬥之路後,總算是做出一個像樣的結果:


該顯示中文的地方能順利顯示中文,格式也採 UTF8,尤其是 XE 開始支援 Unicode 後,Ansi 文字處理變得相對麻煩,【System.AnsiStrings 單元】會是過這關的最佳利器!


和你分享 ❤

See also