Translate

2016/12/05

政治大學磨課師課程:作業 2 衝鋒陷陣

花了好多時間,這題目真是太有趣了!

  • ★ 接續作業一,完成作業一之所有要求。
  • ★ 主角可透過上下左右鍵流暢移動,不能飛到畫面外。
  • ★ 血條數值為 0-100 依比例顯示,初始值為20。
  • ★★ 被敵機碰到扣20滴血,吃到寶物加10滴血。
  • ★★ 敵機與寶物碰到戰機後就會消失,敵機再從左側出發,寶物則隨機在畫面任一點出現。
  • ★★ 實作完整遊戲流程:開始畫面、遊戲中、失敗畫面,且每個畫面都能實際運作且在正確的時機顯示。(失敗條件:血量為零時進入失敗畫面)
  • ★★★ 敵機只能由左往右飛,且在飛的過程中會衝向戰機。戰機不動會被撞,但動了就有機會閃躲

底下是執行擷圖:



See also:

2016/12/02

政治大學磨課師課程:Pong Game


遊戲規則:
  • 按任意鍵啟動/重啟遊戲
  • 玩家控制右邊綠色棒子
  • 使用滑鼠控制上下移動




執行畫面

See also:

2016/12/01

政治大學磨課師課程:作業 1 空中漫遊

最近終於有時間可以學習新的東西,感謝政大推出【磨課師課程】讓我有機會學習如何製作遊戲。

不過課程核心應是偏重【學程式】,而非【學寫遊戲】。 (笑)

作業內容是這樣的:
【作業 1 空中漫遊】
  • ★: 放上戰機、血條和寶物。血量和寶物位置隨機指定
  • ★: 為作業加上註解,並標註與作業要求有關的程式碼
  • ★: 變數名稱要能適切代表其意義,並使用 camelCase 方式命名
  • ★★:放上敵機由左向右重複飛行。敵機完全移出右方螢幕後,從左方重新開始飛行。
  • ★★★: 放上背景,並向右無限捲動

實際運作畫面

之後會再用 FireMonkey 來實作後面課程內容

See also:

2016/11/28

【踏上 Windows Store 之路】進入App審核階段


由於經由Desktop Bridge轉換出來的appx並不能直接上傳Windows Store。

必須另外向Mircosoft申請。

現在已經得到MS客服人員的回覆,距離上架似乎僅剩一步之遙。


真令人期待!

See also:

2016/11/21

苦盡甘來!Windows程式設計師的春天

還有回到場內的機會嗎?  圖片來源


2015年底,在【風水輪流轉,這次又會轉回【Windows-base Client】了嗎?】系列文章中發表了關於探討Windows程式設計師的悲歌和展望。


這座橋會是【奈何橋】亦或是【彩虹橋】呢? 圖片來源:MSDN


2016/11/17

加入 Windows Store 前的暖身‧使用 RAD Studio 10.1 Update 2


VCL 終於可以上 Windows Store 了嗎?

藉由微軟的【Desktop Bridge】,讓這件事情成為可能,RAD Studio 10.1 Update 2 打包了【Desktop Bridge】技術,讓使用 C++ Builder 和 Delphi 的開發者可以比使用 Visual Studio 更方便的轉換到 Windows Store。

教學無用,直接看熱身的結果吧!

2016/11/14

RAD Studio IDE的巨集(Macros)功能

最近同事反應有沒有什麼可以加快輸入大量建構式(Create)的方法。
這讓我想起從RAD Studio 2007年開始,有個一直讓我很在意的功能:

RAD Studio IDE的Macros
Macros,其實就是Excel的【錄製巨集】功能,這個效果,沒有自己親身嚐試,還真不知道它的好用之處,底下便是示範小技巧:

2016/11/07

初探 C++【Vector容器】與【VCL/FireMonkey framework】的結合

其實 Vector 就是 C++ 容器符號的表徵(【{】和【}】) 圖片來源

最近,有人在群裡問了在C++ Builder裡要怎麼有效率的處理【動態陣列】,讓群裡頓時又熱鬧起來,而「陣列」就屬於「容器」的應用,在群裡被廣泛提到的有『TList』、『TStringList』等『VCL Framework』專屬容器,這不禁讓我回想起多年前與【Vector】的奮戰歷程。

Vector

C++標準函式庫的容器成員之一,和C#的泛型相比,C++顯得更早想到【容器】概念。

Vector在C++界被廣泛應用,但不知道為什麼和VCL/FireMonkey framework就是難以結合應用,成為CB裡經典的遺珠之憾之一。


Vector:中文翻譯為【向量】,怎麼會跟向量扯上邊呢?

2016/11/03

免費、可商業使用的 Delphi 和 C++ Builder Berlin 介紹及下載教學


Delphi / C++ Builder Starter Edition (入門版) 是繼 Turbo Delphi Explorer 和 Turbo C++ Explorer 之後,走向推廣路線的產品。


這是體驗世界上最棒的開發工具一個很好的機會!

2016/10/31

淺談物件的釋放以及使用時機的探討 -- 使用 RAD Studio C++ Builder Berlin


據說,未來是個沒有 Delete 的世界(大誤) 圖片來源

在說明物件釋放方法之前,還得先聊聊 C++ Builder 開發者的習慣

就目前所接觸到會使用 C++ Builder 的開發者所整理的經驗,他們使用 C++ Builder 的理由大致上是以下兩點:
  1. 本身具有極高的 C 語言造詣,通常具有硬體開發經驗
  2. 和 Visual Studio C++ 相比,C++ Builder 的 UI 更是直覺的建立

由 1 可知,會使用 C 語言的開發者,通常有很強烈的語言潔癖,以及有自己一套對記憶體控制的要求

由 2 可知,C++ Builder 對從 C 過來的開發者來說,是很棒的 UI 建模工具

<以下 C++ Builder 簡稱 CB>
 
只是,由於 CB 的 WinForm 是建構在 VCL framework 之上,所以學習 C++ 的物件自然是必須要的。在擴充C++的基本知識後,底下便是常見的寫法:

2016/10/24

雲端服務捉妖錄──REST DataSnap (上)

許多人在體驗 REST DataSnap 開發過程時,應該沒有遇過自己的 DataSnap Client 連不上自己的 Server 這種情況。

當然……

2016/09/02

中文版舊軟體的續命丹:【全字庫】

有些人事薪資系統在輸入 Unicode 字元。如:【堃、伃】等

往往會造成文字在存檔後變成【?】

通常這時我們有兩種做法:

  1. 升級系統
  2. 自行造字 

第一種作法一定要去找原開發商,而開發商也會給兩個答案
  • 改,要錢
  • 不改 (改不了)

所以一般小公司會選擇第二個作法。


身為最大受災戶的政府機關想必是首當其衝,於是有了官方解決辦法:【全字庫


接下來當然是造福我們啦!

But!全字庫的安裝說明實在是……還是自己寫一份吧。

2016/08/26

Delphi 免寫 FreeAndNil 的方法

好的 Free 帶你上天堂 (咦?) 圖片來源


最近看到一篇關於葡萄牙人寫的文章:FreeAndNil... Esqueça

內文是說明在物件導向的時代,JAVA、C# 這類的語言都有垃圾自動回收機制,進化中的 Delphi 其實也有。

接著便開始說明了使用 FreeAndNil 讓我們的原始碼非常噁心的經過。


提出的解法是使用 Interface!


原先我們的寫法可能是:

2016/08/19

泛型(Generic)容器的小技巧

泛型 (Generic) 是程式毒藥還是解藥? 圖片來源

在Delphi 2009開始便加入了【泛型容器】相關類別,如下所列:

  • TList,TObjectList
  • TQueue,TObjectQueue
  • TStack,TObjectStack
  • TDictionary,TObjectDictionary

不過也只知道可以放像是「string, Integer, TComponent」等,基本型別或是物件都可以自由宣告使用。

乍看下和 TStringList 重疊率很高啊,如果是宣告TList,居然不能使用以下的函式:
  • CommaText
  • DelimitedText 

不能用這兩個常用率特高的函式感覺很廢啊。泛型容器到底有什麼好用的?

一直到需要放置物件時,才開始覺得泛型容器超好用。


2016/08/12

[整理]如何計算出一個字元,在一個字串中出現的次數

字元(Char)計數
function OccurrencesOfChar(const S: string; const C: char): integer;
var
  i: Integer;
begin
  result := 0;
  for i := 1 to Length(S) do
    if S[i] = C then
      inc(result);
end;



字串(String)計數
function Occurrences(const Substring, Text: string): integer;
var
  offset: integer;
begin
  result := 0;
  offset := PosEx(Substring, Text, 1);
  while offset <> 0 do
  begin
    inc(result);
    offset := PosEx(Substring, Text, offset + length(Substring));
  end;
end;

資料來源:

2016/07/12

IntraWeb學習日記:【TIWTreeView】

TreeView真的很常在應用程式裡被看到,IntraWeb也有個相同的元件:【TIWTreeView】。

實際應用上也很好理解,在這邊就不賣關子,按例直接看成果圖:

程式碼如下:

2016/07/05

IntraWeb 學習日記:【TIWTabControl】

為了要實作像 Win32 Form MDI 那樣的程式,我們可以借用 IntraWeb 的 TIWTabControl 來實現多支程式的執行。

實務操作起來也不是很難,雛形大概會長成這樣:

實作程式碼如下:

2016/06/28

IntraWeb 學習日記:【Parameters】

在Web網頁應用中,常常會使用到網址列利用GET指令來傳遞參數,比方像是:
http://grandruru.blogspot.tw/index.html?MyParam=HelloEden

接著便Response給伺服器一個參數為「MyParam」,值為「HelloEden」的內容。


在IntraWeb中,由於Web Application特性,我們不能直接呼叫其它的html為起始網頁(會被引導到首頁),但是,我們仍然可以使用參數,例如:

2016/06/21

IntraWeb 學習日記:【Login】

之前有提過 IntraWeb 原始目標和ASP.NET 2.0 Web Form 一樣,都是拖拉元件的方式產生。
不過單獨介紹元件意義不大,直接看看可以做些什麼出來吧!

目前已知,要撐起一套 Win32 應用程式,大概需要以下幾個元素:

2016/06/14

堅持,就是在遇到錯的人還能勇往前行

圖片來源

有一天晚上,在和孩子講著「父子與驢」的故事。

故事是這樣的:
父親打算到市集賣掉驢子,便帶著孩子一同前往市集,路上遇見三個對他們說三道四的鄉民:

「怎麼不騎驢?」、
「怎麼不讓孩子騎?」、
「怎麼這麼不孝順?」、
「為什麼虐待驢子!」,

每一次這對父子都對來者的「建議」照辦,最後這驢子就在市集前的橋上掉到水裡,父子窩囊地丟了面子,也失去了銀子。


相信這類的人你身邊很多,而這世上也的確不乏很多愛胡亂提供 批評 建議的人。

2016/06/07

不是不努力,而是不專業

Photo from lime122
近梅雨季來臨,不是一直下雨,就是濕氣含著不下雨,不只戶外像熱帶叢林,就連回到家裡,也感受到家中【滿滿地 Juice】和【濃濃地發霉味】。

一連幾個晚上,都將冷氣開著除濕睡整晚,過了快一個星期後的某一日,如往常的回到家,撲鼻而來的不只是滿滿 Juice 的濕氣,連發霉味也更加地沉重!


不是每晚都開除濕了嗎?為什麼還會有發霉的味道跑出來!


這次決定不用冷氣的除濕功能,把那台迷你的小小除濕機給請了出來,開始工作不到半個小時,神奇的事發生了,不僅 Juice 感沒了,就連發霉感也湮消雲散了!


看著地上迷你除濕機,再看看牆上巨大的冷氣機,心中突然有感而發:

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裡時,我們會用以下的判斷式:

2016/04/26

Delphi 和它的夥伴最近動態

象徵高品質和精湛工藝的 Delphi 10.1 Berlin!

  • Delphi 10.1 Berlin 上市! 
修正了更多 FireMonkey framework 的問題。
看到了久違的 dbExpress 更新(dbExpress no longer depends on OpenSSL or Indy to perform HTTPS requests. )!超開心!

其它詳見: Delphi 10.1 Berlin What's New

  • Firebird 3.0 正式釋出!
Symmetric Multi-Processing (SMP 多元處理) 完全支援 Super server!
Boolean 欄位型態支援。

其它詳見:New In Firebird 3.0
  • IntraWeb Bundle for Delphi 10.1 Berlin 進入最後編譯階段
期待有更多的 Bug fix!

  • Embarcadero 新活動:MVP of the Week!
MVP of the Week: Robert Love
MVP of the Week: Danny Wind
MVP of the Week: Jens Fudge
MVP of the Week: Yilmaz Yörü
MVP of the Week: Nick Hodges

看到好多傳說中高手的生活,真棒的體驗!

有時間會再來補完下這篇內容,敬請期待!

2016/04/19

IntraWeb TIWDBGrid 綁定 TIWDBEdit 編輯功能可行性研究

IntraWeb 的 IWDBGrid 似乎可以做到像是 TDBGrid 的編輯功能,於是我做了一個範例:
紫色列為TClientDataSet.RecNo
把 TIWDBGrid.Columns[1].Control 和 TIWDBEdit 綁定,畫面就如上面所示。

看起來一切都很美好,對吧?

2016/04/12

IntraWeb + Apache -- 開啟 ISAPI 支援功能

最近又沉迷 IntraWeb 的開發,在 IIS 實機一直撞牆,於是心一橫,決定使用 Apache 上試試看。

我使用的是 XAMPP Lite 1.7.2 版,在建立環境上是很簡單的。

不論是 XAMPP 是哪一個版本,搭配的 Apache 都是 2.2 版,所以設定上應該都大同小異。

一、打開 httpd.conf

2016/04/05

HTML5 Builder 對非 PRCL framework 網站的除錯

HTML 5 Builder (以下簡稱 H5B),在除錯時,可以發現在網址列中有著「XDEBUG」字樣的訊息,如下圖:


H5B 在進行 Debug 時會接著一組帶有 XDEBUG 的字串

由此可知,H5B 利用了 Xdebug 完成「除錯工作」,不過目前在非 PRCL 專案,進入第二層後的網頁都無法除錯,還在查問題在哪邊……

to be continued...


See also:

2016/03/29

品味程式碼【變數篇】

在碼農界待久了,很喜歡品茗各式各樣的程式碼

程式碼有個特色,可能人類一句話可以交待的事,但程式碼可能要用數十列來表達

看各學派命名規則也是很有趣的事,雖然有可能會像魯迅筆下的孔乙己一樣對「茴」字走火入魔,但我仍然是樂此不疲的欣賞著


各家語言對變數宣告的方式不太一樣,以 Delphi 為例,它的特色是把變數和常數進行分區,實際上寫起來大概會像下面表示:
procedure  DoSomething;
var
  ValueStr: String;
  ValueInt: Integer;
begin
...

C# 的宣告方式和 C++ 一樣,在程式進行的過程中可自由宣告,實際寫起來會像下面表示:
static void main() {
  int ValueInt = 0;
  string ValueStr = 'HelloWorld';
}

如何宣告是有學問的,所以出現了以下學派:

2016/03/22

FireMonkey 學習日記06 --【骰子搖搖樂實作】(下)

前情提要:
FireMonkey 學習日記06 --【骰子搖搖樂實作】(上)
FireMonkey 學習日記06 --【骰子搖搖樂實作】(中)

接著就是最難的部份:搖搖樂

在 Delphi 下要怎麼實現呢?

很貼心的,Delphi有個叫【TMotionSensor】。

這個元件集合了重力感知器(G. Sensor)、加速度感知器(Acceleration Sensor)、陀螺儀(Gyroscope Sensor)的探知功能。

我在這裡則是使用了加速度感知器來搭配。
因為 Android 只吐上面幾個項目……


不過呢,該怎麼讓程式知道有在震動呢?

2016/03/15

FireMonkey 學習日記06 --【骰子搖搖樂實作】(中)

繼上回一時衝動,決定自己要寫 App 之後,就要來動手了!

首先,必須先去 Embarcader 官網,下載最新試用版的 Delphi,而且還要申請一個新的帳號,目前一個帳號可以試用30 天,每個版本都以一次為先。

對目前的我來說,我只想快點玩遊戲,什麼30天,3天都嫌久了!

究竟,Delphi 是否可以完成這不可能的任務呢?


3 天熟成 App!

2016/03/12

FireMonkey 學習日記06 --【骰子搖搖樂實作】(上)

最近去圖書館借小朋友的童書,裡面有附桌遊,真是讓人懷念以前小學和同學玩桌遊同樂的日子。
不過好像沒有附骰子,如果要買的話……

2016/03/11

圖書館也要2.0:成為偏鄉孩子對世界的窗口


早些年,我還在當學生的時候,去圖書館找書看一直是我的習慣。隨著時間的推進,可以自己買書後,就很少再回圖書館了。

不知道過了多久,某一天,路過那原本應該很破舊的圖書館,我停下腳步。

「咦?圖書館變新了?」看著外牆閃亮亮地金色文字,才曉得圖書館不知道翻新多久了。

滿懷期待的進入圖書館內,嗯……。

2016/03/09

淺談【物件關係對映(Object Relational Mapping ORM)】

在許多年前,資訊界突然興起了一陣ORM風氣,不ORM都不潮了說。

ORM: Object Relational Mapping;中文被稱為【物件關係對映】,聽起來很奇妙,物件就物件,有關係就是沒關係(?),是要對映什麼?

ORM理論是以「軟體工程師」和「資料庫管理師」為對象,將兩者產出的「物件」再做一次「關係」的「對映」處理。

你有看懂嗎?








看完我自己也不知道自己在寫什麼,重新再寫一次。

2016/03/07

證照的最大功能:快速得到一位專業的伯樂

我還在唸書時,被當時的職人證照化風氣影響,我也跟著跑去考了好多款證照。有資料庫的、程式語言的、作業系統的……還很驕傲的向家裡炫耀。

畢業後不久的某一天晚上,老媽問我一個簡單的Office問題,我竟然答不出來,不免老媽海念一頓,其中有句話是這麼說的:

2016/03/04

敏捷開發,你他媽雜碎


敏捷開發(scrum),在這名詞發明前,老早就已經被玩爛了,套一句電影的名言,他是這麼說的:



敏捷開發,你他媽雜碎!

在應用程式的開發過程中,常常遇到五花八門的問題,但歸究起來,顯示介面(User Interface UI)的呈現大概不會脫離以下幾種:

2016/02/29

Delphi ORM Generator

Can Delphi do it?  Photo source


What is your code pattern? Like below:

MyDataSet.FieldByName(‘MYFIELD’).AsString := something…;
MyDataSet.Fields[n].AsString := something…;


Why can not used ORM(Object-relational mapping) code in Delphi?
Ex:
Employee.EmpNo := 1;
Employee.Name := 'Eden';


Because TDataSet! It's always only one mapping method: FieldByName. You are always only to use:

  1. IDE design mode, drop down TDataSet...
  2. Open TFields box, append all fields...
  3. Type innumerable "FieldByName" and "Fields" in Editor...

That is not your best solution, ever!

You need "Strong Type"! It is like String, Integer, Double etc!

  Strong Type is...   Photo Source


So "Delphi ORM generator" application is born! as shown below:
Main page

The demo is used MyBase


How to connect?
“Delphi ORM generator” that uses ODBC, it can connection any database.

“With Table”
It can select multi items to build source unit in right memo. (Select only one Table in current version)

“With SQL” and “By MyBase”
It provides analysis SQL statement / MyBase data to build source unit (Only one table).

Why use “Delphi ORM generator”?

  • Elegant: You can call Code Insight when editor, this fast input and code is clear!
  • Correct: “Delphi ORM generator” out the code is hard-coded, so you can aware be wrong if typing a spelling errors in Design mode.
  • Efficient: Besides quickly type, your program can increase the performance of more than 53.73%

Delphi ORM generator have 3 Field mode selector:
  • TField
  • T*Field
  • Native Type

TField:

The mode is easy mapping about property to field, it's simple code like below:
  type T: class (T)
    Fid: TField;
   public
    property id: TField read Fid;

T*Field:

The mode is "Strong Field", like TStringField, TIntegerField, TFloatField etc. It's simple code like below:
  type T: class (T)
    Fid: TIntegerField;  
  public
    property id: TIntegerField read Fid;
Use be like:
  Emp: TEmpRow;
  Emp.Id.Value := 1; // The Value is Integer type, it's Strong Type! 

Native Type:

The mode is "Strong Type" and support "NULL" value, if field IS_NULLABLE is True in database table. It's simple code like below:
  type T: class (T)
    Fid: Integer; //Primary Key, IS_NULLABLE = False
     FName: TNullableString; // IS_NULLABLE = True
  public
    property id: Integer read getId write setId;
    property Name: TNullableString read getName write setName;


The mode, you could write code, like below:
var
  LEmpRow: TEmpRow;
  n: Integer;
  n_str: string;
begin
  ...
  LEmpRow := TEmpRow.Create(YourDataSet);
  // Control original DataSet methods.
   if LEmpRow.DataSet.Locate(EMP_ID, 100, []) then Break;
   LEmpRow.DataSet.RecNo := n;
  LEmpRow.DataSet.Append;

  // Control row field method.
  LEmpRow.Id := n; // Right
  LEmpRow.Id := n_str; // Compiler Error: The property is Integer!

  LEmpRow.Name := nil; // Can input nil!
  if LEmpRow.Name.HasValue then // Output need check NULL
    n_str := LEmpRow.Name.Value; // Get Value method.
  ...


You can download preview version: 7z Version!

or

Windows 10 Store: Delphi ORM Generator

Enjoy it!!!

2016/02/25

About Me

Hello there,

Welcome to my blog! My name is Eden Wu.

I am Software Developer with over 10 years of experience in the area.


I wrote some of the product shipped in commercial products such as: C++ Builder 6, Delphi XE, and Delphi XE7.

I'm the ONLY ONE Embarcadero MVP from Greater China!
In 2016 Embarcadero invited me to join a select group of Delphi experts from around the world to form the Embarcadero MVP program, to which fewer than 100 people worldwide have been admitted (I'm the only one from Greater China).


I am very proud to announce that Embarcadero has appointed me as one of their MVP(Most Valuable Professionals)!



I hope you'll enjoy your visit here.

=========================
歡迎!

歡迎你來到我的部落格,我是【大匠之風】的作者:「Eden Wu」。

我是一名資料庫應用程式開發者(軟體工程師),有超過十年的程式開發經驗。

過往曾以「C++ Builder 6、Delphi XE 和 Delphi XE7」,為服務的公司打造出符合其需求的商業應用程式。


大中華區唯一的 Embarcadero MVP!
在 2016 年,我獲得 Delphi 最高榮耀【Embarcadero 最有價值專家(MVP)】資格,在全球超過 100 名的最有價值專家中,在大中華區,我是唯一的【Embarcadero 最有價值專家(MVP)】。

我要驕傲的再次重申:我是 Embarcadero 認可的最有價值專家之一!

謝謝你來到我的部落格,也期待你能享受我的文章。

2016/02/23

Field common unit generator by Delphi

What is your code pattern? Like below:

MyDataSet.FieldByName(‘MyField’).AsString := something…;
MyDataSet.FieldByName(‘MYFIELD’).AsString := something…;
MyDataSet.FieldByName(‘myfield’).AsString := something…;

Like these codes in the maintenance often have lost a string or sensitive issues, so "Field common unit generator" application is born! as shown below:
Field common unit generator


How to connection?
“Field common unit generator” that uses ODBC, it cans connection any database.

“With Table”
It can select multi items to build source unit in right memo.

“With SQL” and “By MyBase”
It provides analysis SQL statement / MyBase data to build source unit (Only one table).

Why use “Field common unit generator”?

  • Elegant: You can call Code Insight when editor, this fast input and code is clear!
  • Correct: “Field common unit generator” out the code is hard-coded, so you can aware be wrong if typing a spelling errors in Design mode.
  • Efficient: Besides quickly type, if use DataSet.Fields in design, the program can increase the performance of more than 50%

Now, you could write code, like below:

ADataSet.FieldByName(TORDERColumns.EmpNo).AsString := something....;
or
ADataSet.Fields[TORDERIndex.EmpNo].AsString := something...;



You can download preview version: here!

2016/02/21

FireMonkey 學習日記05 -- 實現 Login 功能(下)

繼上回所做出來的結果:

結果輸入畫面會被虛擬鍵盤摭住,所以接下來就是參考【FireMonkey -- 實現 Login 功能(中) 】所提到的「KeyboardDemoForm」專案來解決這個問題


比較有意思的是,為了能方便在 Windows 下的 Debug,可以設定全域變數:

2016/02/20

FireMonkey 學習日記04 -- 實現 Login 功能(中)

原來官方的 Demo 裡有解決虛擬鍵盤擋住輸入元件的辦法

範例專案名是:KeyboardDemoForm

看了看原始碼,我認為是利用拉霸(Scroll Bar)來操作輸入欄位的處理

2016/02/19

FireMonkey 學習日記03 -- 實現 Login 功能(上)

繼昨日的 FireMonkey 範例專案後,就在這個專案上加點東西吧,就以 Login 功能來實作好了

首先,再加入 TTabControl,給了兩個分頁
在「LOGIN」分頁加入了 TLabel, TEdit 物件,畫面如下:

2016/02/18

FireMonkey 學習日記02 -- 從範例專案學分頁技巧

FireMonkey最原先的目標是在行動平台上,就以行動平台範例來學習吧!

專案精靈裡有個「Tabbed with Navigation」項目
Tabbed with Navigation
在這個專案中,我們可以學習到:

2016/02/17

FireMonkey 學習日記01 -- 多國語言嘗試

FireMonkey 裡有個 TLang 元件

主要是使用 TLang 裡的「Language designer」進行映射工作,如下圖:
博君一笑的成分很大


來試試看結果如何吧!

比較重要的是,標籤的部份沒有區分大小寫

英文版:


正體中文版:


意外的簡單用 ^_^

See also:

2016/02/14

讀書心得 -- 【資料庫設計ER Model基礎講座】

前一陣子為了修改舊專案裡的小問題,發生了以下的情形:
  • 修正了 A 問題,卻冒出了 B 問題
  • 資料計算結果一直都有問題,但程式碼到手上時就已經這個版本

於是我決定重寫這個專案的核心,然而遇到更悲慘的狀況:

2016/02/08

讀書心得--【劉備不是傳說】

繼【明朝的那些事兒】和【秦始皇:一場歷史的思辨之旅】後,終於有機會認真看完這一本書:【劉備不是傳說】

劉備不是傳說 圖片來源:博客來

說起劉備,大家不約而同的會勾起一個印象 -- 【一名把天下哭出來的君王】。

這比把長城哭倒的【孟姜女】還要生猛,然而孟姜女的故事只是傳說,更何況如果真有其人,以她的神話性,想要成為武則天第二,又或是東方版的【聖女貞德】,那也是非常有可能的事情。

2016/02/05

那些年 DBeXpress 所教我的事:DBXCommon 單元

今天是臺灣農曆年的最後一個工作日,也用技術文章作最後的收尾吧!
==============================


資料庫應用程式設計一直以來都是 Delphi 的強項之一。

Dbx 的目標是為了要讓所有資料庫存取方式統一,在核心上用了很多技巧。

在【dbExpress MetaData 徹底攻略】 文中便大量的應用到 DBX 的獨特設計方法。

例如:【如何取得資料表的所有欄位?】

2016/01/29

淺談雲端服務【模型篇】

你知道雲端服務是什麼嗎?

最近除了「大數據」之外,「雲端服務」也是另一個常被提起的名詞,但每當被問到:

【什麼是雲端服務】?

被問到這個問題時,總是會讓我愣了一下,然後也講出自己也聽不太懂的解釋。


仔細想想,雲端服務本質上還蠻簡單的:就是服務主機存放在某個網際網路的一角,被客戶端載具,像是瀏覽器,或是指定的 App,又經過網際網路存取它,這個主機所提供的「服務」便被稱為雲端服務。


等等,這概念好像有點抽象,有點懂,又有點好像不懂。

來張圖來說明好了:

2016/01/22

軟體經常被殺價,是台灣人對專業的不尊重

最近家中的電器產品一個接著一個損壞,你是否也有遇過以下情形?
  • 電視不能看,壞了?
  • 電冰箱出現漏氣、結霜、不停運轉?
  • 洗衣機漏水、聲音變大、一拖水就嗶嗶叫?
  • 冷氣沒有吵個兩個小時不會冷,一關掉就又馬上變熱?
  • 暖氣會熱的範圍從兩公尺變成兩公分?

通常遇到上述的問題,都會立即打電話到維修站,一般來說,可能會出現:
  • 運氣好的——保固內,免費修到好。
  • 運氣不好的,不好意思——技術人員到場一次就是【數張孫中山】起跳,看問題的大小再往上累加。最後沒有個【幾張小朋友】結不了案!!


這是硬體所遇到的情況,那,軟體呢?

2016/01/15

完成 Delphi 在 Web 上的未竟之夢?【Elevate Web Builder 介紹】

Delphi 從 1.0 以來,一直都是以「Native」,中文來說,是以「原生碼」的方式存在著。


不論是以前的 Kylix 還是現在的 FireMonkey,主打的就是「每個平台都會有自己的原生碼」的應用程式。


而不像是 JAVA 般,以 JVM 的方式,在每個平台都有自己的虛擬機器代工來執行 Java 程式。

也不像是 .NET,以 .NET Framework 作為轉接器,讓每個語言都能在透過它在不同的 Windows 系統執行。


Delphi,總是以原生的方式,在世人的面前展露它利落的身段,而不是利用一層肥大轉接器的裙帶關係,或是一種緩慢及安全性有疑慮的虛擬機器,所帶給使用者那種痴呆煩悶的遲滯感覺。

2016/01/12

程式猿都把不到妹,是因為自己心理上先放棄

你是否覺得會寫程式的人很宅,很死腦筋?
你是否覺得和他們都搭不上話?
所以你覺得【會寫程式 = 把不到妹】是必然的結果?

嗯……話說,身為程式猿的一份子,我連小孩都生了一個了說。
在這邊分享一下程式猿的SWOT分析好了

啥?想知道把妹攻略?這種事講出來就失效了,我才不會講出來呢!

這篇基本上是寫給公的程式猿來看的,母的在這個圈子可是很搶手der,所以請不要擔心的喲~但基於「想知道公程式猿的內心結構」,這篇應該還是蠻有參考價值的

那麼,要開始囉!

首先,撇開你可能是這個樣子:

DataSnap REST API Authorization with PHP

About Authentication with DataSet REST JavaScript client. In connection.js: function setCredentials(user, password) { connectionInf...