發表文章

目前顯示的是 2014的文章

Sublime Text 3 的相關資源

Sublime Text 全程指南
Sublime Text 3 新手上路:必要的安裝、設定與基本使用教學
ZEN-CODING - 教你極速撰寫HTML5與CSS3程式碼

快捷鍵:自動完成 (ctrl + space)
因為和輸入法快捷鍵衝突,所以開啟 Preferences → Key Bindings - User
輸入:
{ "keys": ["alt+/"], "command": "auto_complete" },
{ "keys": ["alt+/"], "command": "replace_completion_with_auto_complete", "context":
[
{ "key": "last_command", "operator": "equal", "operand": "insert_best_completion" },
{ "key": "auto_complete_visible", "operator": "equal", "operand": false },
{ "key": "setting.tab_completion", "operator": "equal", "operand": true }
]
},
    { "keys": ["ctrl+k", "ctrl+/"], "command": "set_mark" }
存檔即可。

Preferences.sublime-settings:
    // 游標設為呼吸燈模式
    "caret_style": "phase",
  // 當前 …

Devart UniDAC 和旗下的專用DAC 有何不同?

UniDAC 屬萬用型,各式資料庫都可以使用,但不支援資料庫 API

專用DAC,如 PgDAC, MyDAC, IbDAC 等,只支援其特定資料庫 (但 IbDAC 同時支援 Interbase 和 Firebird 兩種),支援直接連線 (Direct Connect) 和 API (如備份功能) 是其特色。

Delphi XE 新特性 -- SplitString

圖片
官方手冊上是這麼寫的:

New string splitting capability using System.StrUtils.SplitString:
System.StrUtils.SplitString uses a string of delimiters to split an input string into an array of substrings of type System.Types.TStringDynArray. 這個功能和 TStringList 的 Delimiter 有重疊,但卻少了 Create 和 Free 的動作,在程式寫作上會更為方便。
這也是從 .NET 上學習過來的,就使用它的範例吧:
procedure TForm1.Button1Click(Sender: TObject); var vText: string; vStrArray: TStringDynArray; vPos: Integer; vStrList: TStringList; begin vStrList := TStringList.Create(); vText := 'there is a cat'; vStrArray := StrUtils.SplitString(vText, ' '); for vPos := 0 to Length(vStrArray)-1 do vStrList.Add(vStrArray[vPos]); ShowMessage(vStrList.Text); FreeAndNil(vStrList); end;
回傳結果:

比較要注意的地方是,Delimiters 參數雖然是 String 但只接受一個字元的內容。
如果超過兩個字元,會得到無法預期的結果。


Indy 操作 SMTP 發生 "Could not load SSL library"?

在 Indy 操作 SMTP 時,Delphi 跳出「Could not load SSL library」的訊息。

去 Win32 OpenSSL 網站下載個 「Light」版來安裝,就能解決這個問題了!

另外,這個網站有更詳盡的解說:"Cannot load SSL Library" using Delphi XE7


延伸閱讀:
Sending email with attachments using Delphi, Indy 10.5.5 and GMail

線上編譯器 -- CodingGround 介紹

圖片
CodingGround 是一個給程式人員方便使用的線上編譯網站,內含 IDE + Linux 系統。
不論是初心者學習,或是臨時想到什麼語法時,很容易就能在這個網站上測試使用。

更棒的是,不需要註冊就可以使用!

來看看這個網站提供哪些語言吧:



大致上分為:
Text TechnologiesDatabase ProgrammingProgramming Languages
這下練程式就不用裝好多套 IDE ,太好了!

網址在這兒

UML Pad 設計 UML 的簡易工具,或許也可以拿來這樣用

圖片
UML Pad 是一套免費、免安裝且易用的 UML 繪圖工具,在不考慮輸出成真正原始碼時,是個可以上手的好工具。

而我,因為臨時要畫出跨部門的文件流程,使用這套工具畫了一個簡單的循序圖:
 是否算得上簡單明瞭呢?

Delphi 的四捨五入方法

Delphi 以往的「四捨六入五成雙」 -- Round
要改成常用的「四捨五入」,坊間有一大票使用很彆扭的方式來達成。

但 Delphi 的 Math 單元早已經有這樣的函式了:

Math.SimpleRoundTo

可是這樣的命名規則很不討喜,所以我們可以再重新封裝一下

uses Math; function RoundA(A_Float: Extended): Integer; overload; begin Result := Trunc(Math.SimpleRoundTo(A_Float, 0)); // 取整數部分即可 end; function RoundA(A_Float: Extended; A_Digit: Integer=-2): Extended; overload; begin Result := Math.SimpleRoundTo(A_Float, A_Digit); end;

溫習 RAD Studio 各個版本新增的內容

很好奇每個版本間到底有什麼差異,把 HELP 的連結貼過來,方便溫習。

What Was New in Past Releases


底下是個人筆記重點:
===========================================
2007 Add: dbExpress 系:Driver 最佳化。Driver 增加部份對資料庫的 Unicode 支援。(但 VCL UI 元件還不支援 Unicode,白搭) RTL 系: TFileOpenDialog, TFileSaveDialog, TTaskDialog:
但這些都是 Vista (含以上) 限定, XP 以下不工作。

TTaskDialog 畫面很漂亮!學習資料:
How to use the TTaskDialog?Open Source SynTaskDialog unit for XP,Vista,Seven ← 懶人包
其它新增的類別大都是為了上述元件產生的。
==================================
2009 Add: DataSnap 系:基於 Indy 的 TDSxxx 元件,所做出的 RESTful 框架。(Base WinHTTP)納入 Blackfish 資料庫 ($$$)。 RTL 系:正式導入 Unicode增加更多的 UI 元件。如:Tiburon 和 Ribbon改變 TDataSet.Bookmark 的方法因應 GlyFx 而增加的單元: PNG = pngimage; Gif = gifImg; Jpg = jpeg ← 超重要! ==================================
2010 Add: IDE 最佳化。
DataSnap 系:提供 MIDAS DLL 的原始碼。強化 RESTful 框架。 RTL 系:增加 RTTI 單元。增加支援平板的 手勢、 Touch 功能。重製 .NET: TStringBuilder 元件在 RAD Studio 上。新增的元件 Bug 修正和補強。 ==================================
XE Add: Blackfish 死掉了。 IDE 增加 Code Formatting 功能,終於可以自動化編排原始碼了。
Code Editor 強化了許…

淺談協調者模式[Mediator Pattern] - 使用 Delphi + Interface

圖片
在「深入淺出-設計模式」一書中談到「居間協調者模式」時,把它歸類在不受設計人歡迎的模式中(請參閱:14 附錄:剩下的模式-居間協調者模式)。

只是,它有提到在 MVC 中經常會使用這個模式來設計。看了下它的介紹,就真的是簡短到一個極致。

接著便拿起「參悟物件設計模式 - 使用 Delphi」一書,翻到了「協調者模式」一節。

……還是有點難理解,按本人羸弱的思考能力是這樣解讀的:

淺談策略模式[Strategy Pattern] - 使用 Delphi + Interface

圖片
用Delphi 這麼久,Class 一直都是我愛用的關鍵字之一。 在看了Code in Delphi 之後,還是不了解為什麼要使用Interface。
於是又看了下Head First Design Patterns (深入淺出設計模式) 的第一章。
按照我現在只會的物件導向概念,在鴨子類別及實體的設計,大概會長成這樣:

RAD Studio XE7 其它亮點

Pull to refresh in TListView.
OnGesture 和 OnTouch 事件終於切開了!再也不會誤觸 TEdit 而拉不動了!
TScaledLayout 上的元件會自動隨解析度調整大小。(不過裡面有 TWebControl 時會有相容性問題)


FireMonkey 核心 -- LiveBinding

LiveBinding 幾乎完美發揮泛型的優點。
不須再使用 IntToStr, FloatToStr 等轉換函式。

TBindingsList.Notify             ← 配合已綁定 Class 事件呼叫時可用。
TBindExpression.Evaluate   ← 應用上,只要記得 BindExpression 是讓哪個 Class 作動即可。

[筆記]RAD Studio XE6 的環境設定

圖片
Android:

Create a New Android SDK
RAD Studio 的編譯器會自動從 Android SDK 路徑找出機器對應的版本,只要確保相關版本有被下載下來即可。

ZipAlign.exe:

[上課心得]執行力提升的四個技巧

鎖定至關重要的目標 (聚焦少數,達成更多﹔設定終點線)從領先目標 (短期目標) 下手設置醒目計分板落實當責 (檢討領先指標)

再戰 FireMonkey

先記錄一下未來的幾個課題:

FMX ExpressFireMonkey LiveBindingsFireMonkey SVG Vector Graphic來自土耳其的 FM
TBindingsList :記錄該 Form 下所有的 BindingExpr

TDataSource :在 FireMonkey 還是有很大的用途 -- 和 TBindSourceDB 綁定

所有的元件都可以和 TBindSourceDB 做雙向綁定

TListBox, TListView 兩個好像的元件……
TListBox: 概念比較像一本帶有活動內頁的雜誌。
TListView: 如果 TListBox 是一本帶有內頁的雜誌,那 TListView 就是只具有多樣化封面的單一頁面元件。

但 TListView 和 TListBox 是兩個獨立的元件。

TListView 實際應用上可參考:FireMonkey中TabControl的滑动效果




[RegEx] Delphi XE 增加的 TRegEx 資料整理

原來從 Delphi XE 開始就有內建 RegEx 類別了,現在開始要重新學習了

Delphi Regular Expressions ClassesDelphi XE2中如何使用Native Regular Express官方的正则表达式组件 RegularExpressions (1) : 基本应用System.Text.RegularExpressions 命名空間 看來是抄 M$ Framework 抄很大。哈!

有關錢字號「$」的說明:
C# Regular Expressions Substitutions (經常用在 Replacement 中)


[DateUtils]查出指定時間的當月第一天和最後一天

突然有這樣的一個需求,上網查了一下發現很大一票的高手在這塊都自己刻一份副程式。

難道 VCL Framework 裡就沒有好用的函式可使嗎?

答案是:有的!

EndOfAMonth in Delphi Basics 中有提到了我想要的東西。

在 DateUtils 裡有「StartOfTheMonth」和「EndOfTheMonth」這兩個函式,可以很輕鬆地取得指定時間的 1 號 和 28.29.30.31 的最末日

範例如下:
var vFirstDate, vLastDate: TDateTime; begin vFirstDate := DateUtils.StartOfTheMonth(Now()); vLastDate := DateUtils.EndOfTheMonth(Now()); ShowMessage('The Month first Date: ' + DateToStr(vFirstDate) + #13#10 + 'The Month last Date: ' + DateToStr(vLastDate));


只是,按「易讀程式之美學」一書所建議的起始和最末範圍命名法則有點小小的衝突,
==============
Start → First
End → Last
==============
但因為不會有「32」日這種超出日期的可能,這種小缺點就忍耐一下吧 (笑)


TDataSet.OnValidate 和 OnChange 事件使用心得

OnValidate:
  單純的檢查事件,在這個事件中無法對 Sender(TField) 進行改值。


OnChange:
  接在 OnValidate 事件後觸發,值的變更可在此事件中處理。

State-Less? DataSnap for RESTful is easy!!!

在看了「Delphi XE2 DataSnap Development Essentials」元件章節後,才發現幾個很特別的屬性:

FireBird Recursive (遞迴) 的支援

今天在查詢 SQL SERVER 對遞迴的支援時,查到這個網頁
T-SQL使用遞迴的方式來查詢同一資料表
一試果然提升效率 600%

那 FireBird 能否支援呢?
請參考 FireBird Select -- Recursive CTEs 一節

RAD Studio XE6 在行動開發上總覺得還不是很穩

不論是新的 REST DataSnap 還是 FireMonkey 開發

總是讓我感到 EMBT 的謎團爆多,看來只能繼續觀望了

Session function in FireBird

圖片
我在 Session funtion programming in PostgreSQL's PL/pgSQL 這篇文章中有提到:
PostgreSQL 對 Session function 的支援程度。

這次換上 FireBird 又會擦出什麼火花呢?

在 FireBird 裡,所使用的是 DSQL (Dynamic SQL) ,在 FireBird 2.0 新增,2.1 和 2.5 都有部分調整。

實際操作的感覺是:
即時性的 PSQL 在 DSQL 下實現 (“on-the-fly” PSQL within a DSQL context.)

語法是:EXECUTE BLOCK

EXECUTE BLOCK 做單一值的回傳 語法如下:
execute block
returns (mm Integer)
as
begin
  mm = 100;
  suspend;  --要加這句話做回傳輸出
end
如此,我們會得到


帶有參數的處理語法如下:EXECUTE BLOCK(arge1 Integer = ? arge1, arge2 Integer = ? arge2)
   RETURNS (SimpleSum Integer)
AS
BEGIN
  SimpleSum = arge1 + arge2;
  suspend;
END
執行畫面:

IntraWeb 入門的幾個小問題

Q1. 支援的瀏覽器好像很少?Q2. IWFrame 怎麼裝載到 IWForm 裡?Q3. Intraweb 在不使用 Templete 下如何使用 CSS?

IntraWeb 架構淺談 -- 所有 Browser 都是我的 EXE

圖片
繼上回 「Intro to IntraWeb (VCL for Web) 觀後感」之後,我就開始動手試著使用 C++ Builder XE6 所附的 IntraWeb XIV 來試做一個簡單專案來玩玩,想不到就出了這篇 IntraWeb 初探了。

先說說結論吧!

Intro to IntraWeb (VCL for Web) 觀後感

圖片
Intraweb (底下簡稱 IW) 的架構其實和 ASP.NET 實在有像,如果不考慮那鳥鳥的介面,在開發效率上真的是首選。

UserSessionUnit 就是一目了然的 Session 容器,可以把它視為一個 DataModule

如果 Database Session 處理得好,那這個框架最大的危機應該就剩記憶體容量了吧
(就 ClientDataSet 裝個 100K * 100 = 10MB,面對現在 T 級記憶體的 Server ……其實也不算是個問題)

就目前來看,只要 xxxConnection.KeepConnection 設為 False,其它設計上就跟 Win32 2-Tier Application 一模一樣!

真不明白 IW 還有什麼讓人拒絕它的理由?

 底下是 IW 的教學影片,親自實作後,認真地覺得這真的是個好物啊!


2015/03/10 補充:
在影片裡,「FishData.pas」其中的全域變數:var dmFish: TdmFish,被修改為 function dmFish: TdmFish,由於名稱未按命名規則設計,如能修改為"getPublicFish"或"PUBLIC_FISH"會更容易讓觀看人理解。
但因為是要做Runtime時期「變數覆蓋」所以才這樣處理,這一點要注意。

建議先看「Getting Started」再回頭看這篇Youtube會比較容易學習。

HTML5 Builder 的試用心得

圖片
HTML5 Builder 是 Embarcadero 的網頁製作產品之一
RadPHP 即是它的前身,HTML5 Builder 這名字更明確的表示它不只是著重在 PHP 設計上,也強化在 Client 端的 HTML5、Javascript 和 CSS 快速設計

如果想設計 Web Application 的話, HTML5 Builder 是個不錯的好選擇

Excel Group command with ExcelXP Component

ExcelWorksheet1.Range[_RangeBeg+':'+_RangeEnd,EmptyParam].Rows.Group(EmptyParam,EmptyParam,EmptyParam,EmptyParam);

ClientDataSet 的 MergeChangeLog 和 Reconcile

這兩個方式都用在合併 Data 和 Delta 的用途:

TExcelWorksheet 取值

圖片
在開始介紹 ExcelWorksheet 如何取值前,我們要先了解 Excel 的專業術語:

ExcelXP TExcelWorksheet 連結 Worksheet

圖片
前情提要: 1.使用 Delphi ExcelXP 元件開啟 Excel 和活頁簿(Workbook) 2.把開啟的 Excel 和活頁簿關閉
這一節我們要聊的是「工作表」(Worksheet) 的連結 (是的,不含操作)。
ExcelWorksheet 這個元件的連結方式比較特別,它必須: 1.先指定前一節已開啟的ExcelWorkbook 指向哪一個 Worksheet, 語法如下: ExcelWorkbook.Worksheet[________]
這邊的填空處可以放兩種類型,一種是文字,另一種就是數字: 也就是 Worksheet 的「名字」或「排列的序號」 以這個例子來說,我們要開啟「Sheet3」時,程式可以這麼寫:         ExcelWorkbook.Worksheet[‘Sheet3’] 或         ExcelWorkbook.Worksheet[2] 序號是按左至右,從 1 起始。

無狀態的DataSnap寫法參考

由於DCOM可以在網際網路直接傳送 OleVariant,所以有網友提出這個方案,可擴充機能很高。

努力學習中!

※※※ 已經 2014 年 4 月份完成 COM / RESTful 中間層的建置,目前看起來還是 COM 版的 DataSnap 效能要好。 ※※※

資料來源:
Delphi之MIDAS三層完美解決方案—-中間層構建(1)Delphi之MIDAS三層完美解決方案—-中間層構建(2)

悲劇的版本 Delphi 2009

圖片
悲劇的版本 Delphi 2009

就我印象所知,它是第一個支援 Unicode 的版本,也是被駡最慘的一個版本
(當時我以為 Delphi 2006 年版已經是爛中極致)

當我還不信邪的要使用它的時候,才知道這箇中奧秘

DsnDBCst.dcu 找不到的問題

DsnDBCst 是 DSDesign 元件中的檔案之一。

但在 Delphi 7 之後就找不到這個檔案了,所以在編譯舊元件時可能會出錯。
而且也找不到這個神奇元件在哪邊。

所幸,萬能的 Google 大神引領我,找到了替代品
 「VclDesigner」
將原有的 uses DsnDBCst 拿掉,並且引入 VclDesigner 到 Package 的 Requires 區,如此一來就可以了。

但可能編譯時,還是會失敗。

實際看過網路上流傳的 DsnDBCst.pas 後,才發現原來這個檔案的功用,有一半的功能是做 ResourceString 映射功能,如果有需要也可以自己補在需要出現的地方。

See Also:
[Pascal Fatal Error] DSDesign.pas(18): F1026 File not found: 'DsnDBCst.dcu'
kbmMemTable missing DSDesign.dcu
DsnDBCst为何物?

[笑話]熱狗不是狗

圖片
最近在程式執行時老是踩到未知地雷,仔細尋找後才發現我踩到「熱狗不是狗」陷阱。 以下就是當時發生的概況:
        1.動物:會叫         2.動物中有「狗」這個物種,狗會叫﹔會汪汪叫         3.狗還會吃,最愛吃熱狗
於是在 Google上,我下了這樣的搜尋條件: 「動物(熱狗)的叫聲」
        Google 回答了我: 「讚」
按了十次,得到十個讚,看來這個括號有神奇的效果,於是修改了一下搜尋內容
「熱狗是動物,牠的叫聲」
當我按下『搜尋』時,立馬就跳出錯誤視窗: