2016/05/31

Delphi ORM 產生器 1.0.0.0 已在 Windows Store 上架!

Delphi 現在也可以做到 ORM 了! Photo source


您還在跟單引號與括弧對打嗎?

您的Pas裡早已充斥著這樣的程式碼:
DataSet.FieldByName('fieldname').AsString
DataSet.FindField('fieldname').AsString


又臭又長又噁心,又常常寫出在執行時期跳出「數值轉換失敗」的程式碼,您的開發效率就這樣打了折扣嗎?

老闆付您薪水卻產出這樣品質低劣的程式碼,不管是老闆或是您,在內心一定是充滿著悔恨吧!


還好,這並不是您的錯,千錯萬錯都是 Delphi 沒有滿足您的願望惹的禍!



更幸運的是,您現在看到了這篇。

為了讓您薪水領得安心,在這個星期,集合了傳說中 Delphi 社群的力量,終於將【Delphi ORM 產生器】完成!


千呼萬喚始出來,【Delphi ORM 產生器】終於完成!


它結合了【TField】,【T*Field】,【Native Type】三種模式,絕對可以滿足您多樣化的開發方式,而且,保留了最貼近 Delphi 原生 TDataSet 的程式寫法,又可以解決在編譯時期找出【型別錯誤】的長期 Delphi 之痛


【Delphi ORM 產生器】是彈性和實用兼具的好物,據統計,它至少可以節省 Delphi 開發人員 53% 以上的開發時間更可以提高程式正確率 92% 以上


更更更重要的,目前開放免費體驗中

【Delphi ORM 產生器】終於完成!

再寫下去就囉嗦了,想提高您在使用者心目中的地位嗎?那就快去下載使用吧!


2016/12/03 更新:

現在,Delphi ORM 產生器已在 Windows 商城上架!

軟體安全性更上一層樓,還沒體驗的 Delphier,趕快來體驗極速開發吧!


See also:

2016/05/24

IOUtils TDirectory.CreateDirectory 跳出 The drive cannot be found 錯誤

最近使用 IOUtils 單元的 TDirectory.CreateDirectory 來處理目錄建立的工作。

MSDN中說明這個函式的功能:
按照 path 所指定的來建立所有目錄和子目錄。

備註
會建立 path 中指定的任何和所有目錄,除非它們已經存在,或 path 的某些部分是無效的。path 參數指定的是目錄路徑,而不是檔案路徑。如果目錄已經存在,這個方法不執行任何動作。
所以DirectoryExists這類的工作都可以拿掉了,是個很方便的功能。

程式運作了好一陣子,都沒有出問題,一直到某天,客戶回傳了一個錯誤視窗:


於是,我又踏上抓鬼之路了。
  接著我請了個道士來 Debug   圖片來源


雖然已知是「TDirectory.CreateDirectory」造成的錯誤,但為什麼客戶會出現但我這裡完全沒事呢?


後來才知道,原來客戶的環境是以虛擬機器運作,以 UNC 路徑執行所有程式,看來就是 UNC 路徑搞的鬼。

What is "UNC"?就是像「\\ComputerName\DirectoryName」這樣的網路路徑。

總之,Bug找到了!讓我們來看看「它」長什麼樣子吧!



Bug 示意圖.........  圖片來源
































咳!………還是回到正題!


仔細研究原始碼,才發現在 IOUtils.pas 單元的函式出錯:
class procedure TDirectory.CheckCreateDirectoryParameters(const Path: string);

出錯的程式碼為:
if not TPath.DriveExists(TPath.DoGetPathRoot(Path)) then

因為沒有針對 UNC 路徑多做判斷,所以一定會跑「The drive cannot be found」錯誤。

找到了Bug,但要如何解決呢?很簡單,將出錯的那一列置換如下:
if TPath.IsDriveRooted(Path) and not TPath.DriveExists(TPath.DoGetPathRoot(Path)) then


如此便修正了這個問題,但最好是將底下路徑的IOUtils.dcu一併置換:
$(BDS)\lib\win32\debug
$(BDS)\lib\win32\release
$(BDS)\source\rtl\common


或是把 IOUtils.pas 複製到自己的專案進行修改後使用。


















最後,這個Bug在XE3之後已被修正。

See also:

2016/05/17

Delphi 加密解密(含數位簽章)的解決方案 -- 【初探篇】

嗯,今天不討論破解病毒的問題

一直以來,總是覺得自家系統的加密法很陽春,容易被破解,最近看到可怕的【 加密勒索病毒】,發現居然用到 RSA 4096 加密等級,凡是中招者,只能選擇「付贖金」或是「銷毀」這兩個選項。

看來這 RSA 加密真是個很可靠的東西,如果可以應用在自家的產品上……

2016/05/10

對於 Delphi 10.1 Berlin 推出的看法


在 Delphi 10.1 Berlin 中,大幅度地修正既有的 Bug 數量,這對於舊有用戶無疑是吃了很大的定心丸。

只是,在【教育 Delphi 開發者】上,依然還有完善的空間,這對於潛在的市場才是最有幫助的。

就我們所知,FireMonkey framework 是一個著重在跨平台的解決方法。

但是每個平台都自己的特色,就算是 FireMonkey,勢必也需要考量每個平台的設計重點而調整開發手法。

2016/05/03

淺談【架構天平】

在業界打滾一陣子,經常性的會聽到「前端效能不如後端」,或是「後端除錯是地獄」的一些言論,其實我認為真正的問題,在於【架構上的設計傾向】,由於系統架構師在「架構天平」上錯誤地過於傾向某一方,進而才會造成開發者的踏入前述的誤區。

前端超好開發,但使用者對系統最有印象的卻是轉轉轉圖標。
後端效能超級好,可是一旦發現拉到前端的資料不正確,除錯的過程和從地獄爬到人間的難度差沒多少。

2016/05/01

淺談 Delphi Class 和 Record Helper

Class (and Record) Helpers  圖片來源:Class Helper/Jobs Pictures

Helper 是一個從 Delphi 2005 開始就已經支援的特色之一。

使用時機:

在需要擴充現有Class或是Record裡的函式功能時使用之。

Delphi 7 之前我們要擴充或是修改現有Class功能時,我們會採取【基礎課程 - Delphi Interceptor Classes】這篇的作法。

然而在 Delphi 2005 之後,就可以利用 Helper 簡單作到對現有 Class 的擴充,以TStrings為例:我們在找尋字串是否在TStrings裡時,我們會用以下的判斷式: