2020/03/12

Delphi Easy Excel 基礎類別設計


Excel是許多從事行政人員必用且愛用的工具之一,所以在程式開發上最常遇到的就是客戶拿產品來和Excel做比較。


這能比嗎!(怒吼)


忠孝不能兩全的情況下,拿Excel檔案進行匯入似乎是很常見的折衷方案。

Delphi號稱VB Killer,操作個Excel自然是基本款,來看看Delphi準備了哪些方案?

Microsoft Office 2000/XP Sample Automation Server Wrapper Components

Microsoft Office 2000/XP Sample Automation Server Wrapper Components


Delphi很貼心的提供Office元件,自Delphi 7~10.3以來,也就這麼兩套。(2020.03.19更新:XE5之後有單獨提供 2010 套件,但只要 Office 更新也是會有相容性問題。延伸閱讀:Delphi XE5 Office 2013 组件更新)

Office 至目前為止已經2019了,許多使用者都開始使用XLSX新格式,這個元件很早就出現相容性不足的問題。

另一個類似元件的做法是使用Import ActiveX Control,匯入新版Excel ActiveX控制項,實務上還蠻類似元件的操作方式,只是問題在Excel升級後仍有可能會有相容性問題產生。

3rd party

三方元件最好的地方在於使用者電腦並不需要安裝Excel即可進行XLS檔案操作,速度和品質都非常好,我用過的有:

NikaSoft NativeExcel

NativeExcel設計上非常貼近OLE的操作方式,在轉換上十分方便,操作XLS檔效率也非常棒,體驗後就離不開它。

但NativeExcel現在已經沒有維護,對XLSX相容性問題也開始浮現。

無奈之餘,還是只能忍痛放棄它。

XLSReadWriteII


這套是資深Delphier Jason Wong 愛用的Excel元件,而且仍有維護,據稱其優點和NatvieExcel相同,但設計概念非OLE操作,所以沒有深入了解。


看來看去,似乎只能回歸OLE設計方式才能達到最高相容的可能性。

畢竟穩定比效能更加重要!

使用OLE開發


使用官方元件很像是使用全域變數的概念,如果OLE也這樣設計如何?


var FExcelApp: Variant;

function ExcelApp: Variant;
  function IsExcelInstalled: Boolean;
  var
    ClassID: TCLSID;
    strOLEObject: string;
  begin
    strOLEObject := 'Excel.Application';
    Result := (CLSIDFromProgID(PWideChar(WideString(strOLEObject)), ClassID) = S_OK);
  end;
begin
  if IsExcelInstalled then
  begin
    if VarIsEmpty(FExcelApp) then
      FExcelApp := CreateOleObject('Excel.Application');
    Result := FExcelApp;
  end
  else
    WinMsgBox.WinError('Not found Excel, call EdenWu, please.');
end;

procedure CloseExcelApp;
begin
  if not VarIsEmpty(FExcelApp) then
  begin
    FExcelApp.ActiveWorkBook.Saved:= 1;
    FExcelApp.DisplayAlerts:= 0;
    FExcelApp.ActiveWorkBook.Close(SaveChanges:=0);
    FExcelApp.Quit;
    VarClear(FExcelApp);
    FExcelApp:=Unassigned;
  end;
end;

initialization
  //FExcelApp := unassinged; // this should not be necessary
finalization
  CloseExcelApp;

把Excel Application視為全域變數,隨時要使用Excel Application都沒問題,非常方便。

開始要寫一些關於Worksheet相關的處理了。咦?

好像還不錯,但不夠OOP,還要更多的OOP

寫著寫著,全域變數和全域函式跑來跑去,程式碼看起來就不夠簡潔了,如果使用OOP設計方式會不會更好呢?

自己刻好像不錯,只是有個臨摹的對象更好,來看看有沒有好範本可以參考。

Github搜尋一陣後,發現有高手寫了個SimpleExcel,仔細看了下程式碼,嗯,很OO,這我可以。

這樣的程式碼要自己來寫到底要花多少時間呢?
如果站在巨人的肩膀上會不會省下更多時間做更重要的事呢?

一邊使用SimpleExcel的同時,一邊思考著。


-全文完-

See also

2020/03/04

外掛小幫手FastReport

原來是報表工具啊,我還以為是外掛開發程式呢! (笑)


Delphi最有趣的地方是它有很多三方元件可以支撐開發專案,以上圖為例,功能不多,通常列為小專案,這時使用諾大的Delphi開發專案顯得太小題大作。


這時FastReport就派上用場,FastReport雖然是報表工具,別小看它,它搭載的Report Designer備有Pascal直譯功能,還有內建VCL基礎元件,有效利用下,可以大幅減少小專案開發時間,還能降低Delphi升級所帶來的改版衝擊呢!


報表工具當然要著重在報表的設計,Report Designer提供的函式庫想當然是不夠使用。FastReport也明白這點,便在FR Document也寫了很多的輔助說明,在藉助FR Document的神奇力量後,我也添加了許多常用函式到Report Desinger中,開發起來便利度提高非常多!


除了可視元件外,像是常常用到的TStringList基礎類別也有提供,程式寫起來超安心。


還有ADO, DBX等資料庫元件,用了Report Designer,很多小型專案都在移轉到FR後就刪除,專案存放目錄差點手殘到刪光光!


和Delphi一樣可以下中斷點,這Debug很可以。

一想到Delphi要開個幾十秒,開啟FastReport Report Designer不僅快,刻起程式也是趣味十足,提供各位參考。


See also

購買連結:Fast-Report官方網站

2020/02/19

Json SQL (JSQL) 概述

打造自己的GraphQL!
縁起

研究GraphQL後,發現它和SOAP的概念蠻像的,要先製定出前後端都認識的Schema,查詢的方式就是透過Schema放入查詢條件,很特別的是GraphQL可以在1次查詢取得多個Schema或多個查詢結果。省下很多Client發送Request/Response交握的時間成本。

SOAP的WSIL(WS-Inspection document)很類似GrapQL的Schema

2020/01/31

GraphQL使用評估

在學習React的過程有接觸到GraphQL這個新名詞,簡單來說GraphQL是:
一種新興的JSON Remote Procedure Call (RPC)規範
REST API寫多了,不是發展出一套龐大的路由切換器就是龐大的參數解析器

路由切換器
/person/id
/friend/id
/person/id/friend
...

參數解析器
persion_id=id
friend_id=id
...

如果系統簡單還好,但當系統一變多或變大,一定會有以下的問題:
  • API根目錄(ROOT)數量爆增,後端專案管理是個問題
  • API一旦異動(常見型別不同或欄位異動),前端必須等待後端更新,徒增開發效率不彰
GraphQL制定了前後端規範,只要後端Schema制定好,前端即有極大自由,減少工程師橫向溝通的時間就能加快開發速度。

使用GraphQL就能飛天?

前面說到,GraphQL嚴格來說僅止於制定規範,實作也只有提供簡易的Server讓使用者【嘗鮮】,實戰使用GraphQL往往需要搭配三方工具:Apollo或Relay,看來也是一條漫漫長路。

或許我們直接取用GraphQL的概念進行實作會更佳合宜。

能不能再簡單一點?

GraphQL到目前為止還是很新的技術,目前已知的資訊還不算成熟,如果自己採用類似JSON ORM的概念是否會更加簡單?

以上是目前對GraphQL一些看法,提供各位參考。謝謝各位觀看!

See also





2020/01/30

【前端】實戰 ASP.NET C# 移轉到 REACT 03



上回提到Main的作法之後,就要把前端做個完整的Prototype,讓前端歸前端,後端歸後端。

完整範例在此:eden-first-todo-list-app

2020/01/22

【前端】實戰 ASP.NET C# 移轉到 REACT 02



上一回提到登入頁面製作後,這次要帶實作主畫面。

原本主畫面長這樣:
 修改時會另開視窗進行編輯:
當時是利用後端進行 HTML 繪製,也就是 Server side 的處理方式,現在使用 REACT 會擦出什麼火花呢?

當時不會排版,不會CSS,連HTML標籤都知道的很少, 所以排版方式使用 Table 處理,就如同上圖的畫面。

REACT + Bootstrap 對 Table 不是太友善,我在 Caption 屬性就卡關了。

故用 Tabs 和 ListGroup 進行排版,畫面如下:

2020/01/21

【新聞】土耳其教育部添購百萬套Delphi授權



TIMETURK(土耳其官媒)在 2020/01/16 發表關於土耳其教育部購買百萬套 Delphi 授權的新聞。

其中說到土耳其國家教育部(MEB)和 Bilgi ve Teknoloji Grubu (BTG)簽了 5 年約,並購買百萬套 Delphi 授權供 1600 所職校近百萬名學生使用,個人猜測是以教育版為主。

買了這麼多 Delphi 版權是要用在哪裡?