2021/09/10

Delphi XE 存取目錄檔案清單、和排序方式


 

最近同事詢問到 Delphi 如何讀出檔案時間,而版本為 Delphi 7,網路資料很多,Google 一找一大把,但關於 XE 以上的新版本卻找不到什麼資料,究竟新版 Delphi 有沒有更好的解法呢?

這問題可以拆分為:

  • 讀取目錄檔案
  • 讀取檔案時間
  • 儲存檔案清單(含時間)
  • 排序檔案清單

有了以上步驟後,各別突破就簡單了。😉

讀取磁碟資料在 XE 後,為了跨平台特別設計了【IOUtils】單元,目的在各家平台都能使用相同程式碼讀取其儲存媒體內容,所以 IOUtils 是非常值得投資學習的單元。

讀取目錄檔案

IOUtils.TDirectory 是讀取目錄結構的物件,只要使用 GetFiles 就可以讀出目錄內所有檔案,簡單程式碼如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
var
  LFileList: TStringDynArray;
  LFile: string;
begin
  LFileList := IOUtils.TDirectory.GetFiles('D:\Eden的目錄');
  for LFile in LFileList do
  begin
    ListBox1.Items.Add(LFile);
  end;
end;


讀取檔案時間

取得檔案路徑後,就可以依序取得它們的時間,在 IOUtils 中,TFile 物件可以取得以下時間

  • GetCreationTime: 檔案建立時間
  • GetLastAccessTime: 檔案最後讀取時間
  • GetLastWriteTime: 檔案最後寫入時間

以「檔案建立時間」為例,簡單程式碼如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
var
  LFileList: TStringDynArray;
  LFile: string;
begin
  LFileList := IOUtils.TDirectory.GetFiles('D:\Eden的目錄');
  for LFile in LFileList do
  begin
    ListBox2.Items.Add(DateTimeToStr(IOUtils.TFile.GetCreationTime(LFile)));
  end;
end;


儲存檔案清單(含時間)

有了檔案和時間清單,就要進行兩者的結合,使用快取資料集是不錯的選擇,Delphi 內建的快取資料集有兩個:

  • TClientDataSet
  • TFdMemTable

TFdMemTable 是比 TClientDataSet 更為輕巧的資料集物件,而 TClientDataSet 則是經典物件,選擇上看個人喜好,設計上大同小異。簡單程式碼如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var
  LFilePos: Integer;
begin
  with ClientDataSet1.FieldDefs do
  begin
    Add('File', ftWideString, 200);
    Add('CreationTime', ftDateTime);
  end;
  ClientDataSet1.CreateDataSet;
  ClientDataSet1.LogChanges := False;
  ClientDataSet1.IndexFieldNames := 'CreationTime;File';
  for LFilePos := 0 to ListBox1.Items.Count-1 do
  begin
    ClientDataSet1.Append;
    ClientDataSet1.Fields[0].Value := ListBox1.Items[LFilePos];
    ClientDataSet1.Fields[1].Value := ListBox2.Items[LFilePos];
    ClientDataSet1.Post;
  end;
  ClientDataSet1.First;
  while not ClientDataSet1.Eof do
  begin
    ListBox3.Items.Add(Format('%s, %s', [ClientDataSet1.Fields[0].AsString, ClientDataSet1.Fields[1].AsString]));
    ClientDataSet1.Next;
  end;
end;


使用 TFdMemTable 請注意

TFdMemTable 預設不會記錄資料歷程 (TFdMemTable.CachedUpdates default value is False),故 LogChanges 該行程式碼要刪除。


排序檔案清單

ClientDataSet1.IndexFieldNames 屬性設定好以時間欄位排序,即可得到理想的結果,如果要倒序,則可以參閱【【Delphi】ClientDataSet 的排序】,裡面有詳細的解說。


資料集太大?泛型物件也可以

如果認為資料集物件過於龐大,則可以考慮使用泛型物件,在這裡使用 Generics.Collections 單元裡的 TDictionary 物件,目的是它可以存放 Key=Value 字典,在這個場合可以存放兩種值,適合使用 TDictionary 物件。

搭配 TArray 處理排序功能便可以取代資料集的設計方式,完整程式碼如下:


結論時間

在 Windows 平台下找尋 Win32 API 是一件再正常不過的事情了,但進入到 64 位元或是行動裝置等平台後,以往的開發習慣也要跟著一起改變,Delphi 隨著科技的更新也一同進步,你不需要 Win64 API、Android API、MacOS API、iOS API 等全部自行實作一次,只需要在設計程式上跟著 Delphi 轉換開發思維,如前面的範例所述,不僅僅是 API 上的改變,框架的整合應用也是重要且必學的技術,本文提供了硬體存取和資料庫存取的綜合應用,期待你的發揮 ❤


和你分享 😉


See also


2021/09/07

Delphi 10.4 Community Edition (CE) 社群版初體驗

你遲早都要用編譯器來編譯跨平台 APP,何不現在就用最好的! 

你開發 APP 所消耗的心力遠超過你的想像?

以往以 Web 平台為基礎的開發框架,到最後都必須使用 NodeJS 進行編譯,看著 NodeJS 的編譯效率和 WebPack 的龐大,這還不包含配置各家平台的開發工具,你花了多少心力在「部署」你的環境? 你遲早都要用編譯器來編譯跨平台 APP 專案,何不現在就用最好的! 

2021/09/03

Desktop First UX Summit 2021 桌面第一高峰會


2021 年的「桌面第一高峰會」研討會內容十分豐富,各家贊助商也來參與這難得齊聚的盛事。

其中 Marco Cantu 提到 RAD Studio (Delphi, C++ Builder) 11 預覽版本的內容,他認為有三個值得一提的亮點:

  1. 高解析度的工具介面

  2. 隨主題變化,所見即所得的設計介面

  3. 改良 VCL TRichEdit 元件

當然還有很多,例如 FMX 上的 TWebBrowser 在 Windows 平台上支援 WebView2 (edge) 版本等。

研討會訴求主軸從【升級】變為【推廣】。

感受到 EMBT 是下定決心要擺脫【老派】應用程式的惡名,未來提供教育版時,新人或學生的接受度也會提高,才不會有「現在都 202x 年了你還讓我開發 WinXP APP」的反抗心態。

重新雕塑 VCL 和 FMX 的選擇

VCL 重回主角身份,依舊是地表上最強的桌面開發框架無誤,FMX 持續發展,相較於 VCL 少了三方廠商的支援,FMX 不再訴求「取代 VCL」,反而比較適合作為 VCL 的延伸。

在應用程式開發會是以 Windows 為核心,Mac 和行動裝置為延伸。對我們已有的產品來說,原有的產品提高了全功能的重要性,跨平台會以重新檢視和篩選出必要的功能實現為主軸,旨在提供使用者便利性和即時性,加強提供全方位的服務為其核心價值。

總結

小孩才做選擇,我全都要!

VCL 你要學,FMX 也是必學的功課,你的薪資也莫名地變薄了呢 (誤),是說能給服務的對象更有價值的內容,才是我們作產品最大的樂趣,你說是吧!

SEE ALSO

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