2014/12/25

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",
  // 當前 Line 高亮
    "highlight_line": true,
    // 增加 Line 的間距
    "line_padding_bottom": 1,
     "line_padding_top": 1,
     // 括弧可摺疊
     "fade_fold_buttons": false,
     // Folders 的目錄字體加粗
     "bold_folder_labels": true,
     // 把 Tab 換成 2 個空白
  "translate_tabs_to_spaces": true,
     "tab_size": 2,
  // 存檔時移除多餘空白
     "trim_trailing_white_space_on_save": true


個人使用的 Package:

  • EMMET - HTML + CSS 指令快捷生成
  • ConvertToUTF8 - 提供非英文語格式支援
  • IMESupport - 輸入法框跟隨
  • BracketHighlighter - 對應區塊高亮
  • TrailingSpaces (Ctrl + Shift + P) - 行末多餘空白處理
  • DocBlockr - 自動註解(含格式)產生


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

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

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

2014/12/11

Delphi XE 新特性 -- SplitString

官方手冊上是這麼寫的:

這個功能和 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 但只接受一個字元的內容。
如果超過兩個字元,會得到無法預期的結果。


2014/12/02

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

2018/05/04 更新:
要取得編譯給 Indy 用的 SSL 檔案才行。連結置於「延伸閱讀」裡。

延伸閱讀:

2014/11/28

線上編譯器 -- CodingGround 介紹

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

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

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


幾乎囊括了所有(含曾經)熟門的語言,給有潔癖的軟體開發人員一個不一樣的 Coding 選擇!

大致上分為:
  • Text Technologies
  • Database Programming
  • Programming Languages

試用一下效果還真的不錯!
這下練程式就不用裝好多套 IDE ,太好了!

網址在這兒

2014/10/24

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

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

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

2014/10/17

Delphi 的四捨五入方法

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

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

Math.SimpleRoundTo

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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;

2014/10/06

溫習 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 畫面很漂亮!學習資料:

其它新增的類別大都是為了上述元件產生的。
==================================

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 強化了許多功能和樣版(Live Templates)。大推

DataSnap 系:

  • 持續增強 RESTful 框架,並加強 dbExpress 對 JSON 的支援。

RTL 系:

  • 增加 IOUtils 單元。
  • TStrings 加入 TEncoding 初始化功能。
  • 加入一票 3rd 函式庫;如:RegularExpressions、Boots 等。
  • TThread.Suspend 和 Resume 被刪除了,新的使用方式請詳閱公開說明書。
  • C++ VCL 增加了對 Unicode 的支援。

消化完再走到下一版。

XE7 Add:


    2014/09/10

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

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

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

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

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

    2014/09/01

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



    Delphi 這麼久,Class 一直都是我愛用的關鍵字之一。
    在看了 Code in Delphi 之後,還是不了解為什麼要使用 Interface

    於是又看了下 Head First Design Patterns (深入淺出設計模式) 的第一章。

    按照我現在只會的物件導向概念,在鴨子類別及實體的設計,大概會長成這樣:

    2014/08/27

    RAD Studio XE7 其它亮點

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


    2014/08/22

    FireMonkey 核心 -- LiveBinding

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

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

    2014/08/19

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

    Android:

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

    ZipAlign.exe:

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

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

    2014/08/03

    再戰 FireMonkey

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


    TBindingsList :記錄該 Form 下所有的 BindingExpr

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

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

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

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

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




    2014/07/30

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

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

    看來是抄 M$ Framework 抄很大。哈!

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


    2014/07/29

    [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」日這種超出日期的可能,這種小缺點就忍耐一下吧 (笑)


    2014/07/15

    TDataSet.OnValidate 和 OnChange 事件使用心得

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


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

    2014/07/07

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

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

    2014/06/27

    FireBird Recursive (遞迴) 的支援

    今天在查詢 SQL SERVER 對遞迴的支援時,查到這個網頁

    一試果然提升效率 600%

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

    2014/06/26

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

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

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

    2014/06/16

    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

    執行畫面:

    執行結果:



    • 要取得資料集合的方式如下:
    EXECUTE BLOCK
       RETURNS (arge varchar(100))
    AS
    BEGIN
      FOR SELECT cast(KDT as varchar(100)) FROM M_TSE WHERE KDT >= '2014/06/16' into :arge
      DO
      suspend;
    END

    會得到



    總結:
    雖然沒有像 SQL Server 那樣的方便,但也算得上比 PostgreSQL 好設計,在 Run-Time 時期的作業有更多選擇了! :D


    See also:
    DSQL, ESQL, PSQL, ISQL 名詞解釋
    FireBird Document: EXECUTE BLOCK

    2014/05/19

    IntraWeb 入門的幾個小問題

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

    2014/05/16

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

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

    先說說結論吧!

    2014/05/09

    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 還有什麼讓人拒絕它的理由?

    IntraWeb 的教學影片在此,親自實作後,認真地覺得這真的是個好物啊!



    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 是個不錯的好選擇

    2014/04/16

    Excel Group command with ExcelXP Component

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

    2014/04/02

    ClientDataSet 的 MergeChangeLog 和 Reconcile

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

    2014/03/20

    TExcelWorksheet 取值

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



    上面的「A、B、C」是 Column,座標軸 X,以下用 COL 表示。
    左邊的「1、2、3」是 Row,座標軸 Y,以下用 ROW 表示。

    所以我們通常會使用座標方式來指定游標所在的位置,常見用語有使用名稱「C3」或座標值「3, 3」之類的表達方式。

    在這邊要注意的是,在Excel中座標的表示法是「ROW, COL」。並不是常見的「COL, ROW」

    所以我們得知 ExcelWorksheet 的座標取值方法是:

    ExcelWorksheet.Cells.Item[ROW, COL]

    要使用名稱定義也可以,以下都是正確的作法

    //property Range[Cell1: OleVariant; Cell2: OleVariant]: ExcelRange read Get_Range;
    ExcelWorksheet.Cells.Range['A1', EmptyParam].Value;
    ExcelWorksheet.Cells.Range['A1',       'A1'].Value;
    ExcelWorksheet.Cells.Range['A1', EmptyParam].Value2;
    ExcelWorksheet.Cells.Range['A1',       'A1'].Value2;
    

    請注意!參數Cell1, Cell2不能為數字,也不能為 nil,否則會報 「OLE error XXXXXXXX」 的錯誤!


    追加補充,如何取得 ExcelWorksheet 的列印範圍:

    ExcelWorksheet.UsedRange[_LCID].Columns.Count
    ExcelWorksheet.UsedRange[_LCID].Rows.Count

    到這邊為止,已經可以處理絕大部分Excel檔案匯入的工作了。

    想知道 ExcelWorksheet更多的功能嗎?去找吧,所有功能屬性都寫在 ExcelWorksheet 的元件裡!

    2014/03/18

    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 起始。

    2.      ExcelWorksheet 元件連結或轉型後立即使用
    I.            ExcelWorksheet 元件連結:(經常呼叫時使用)
    ExcelWorksheet.ConnectTo(ExcelWorkbook.Worksheet[Sheet3] as _Worksheet);
    II.         轉型後立即使用:(臨時呼叫時使用)
    (ExcelWorkbook.Worksheet[Sheet3] as _Worksheet).ExcelWorksheet屬性

            例如:
        ExcelWorksheet.ConnectTo(ExcelWorkbook.Worksheet[Sheet3] as _Worksheet);
       _YYYMM := ExcelWorksheet.Cells.Item[y, x];
        _CONNO := ExcelWorksheet.Cells.Item[y1, x1];
       
        _CURID := (ExcelWorkbook.Worksheet[Sheet3] as _Worksheet).Cells.Item[y1, x1]


            不知道 Cells, Item 的屬性也沒有關係,下一節我們會再聊到。

    2014/03/12

    無狀態的DataSnap寫法參考


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

    努力學習中!

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

    資料來源:

    2014/03/10

    悲劇的版本 Delphi 2009

    悲劇的版本 Delphi 2009

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

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

    2014/02/21

    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为何物?

    2014/02/20

    [笑話]熱狗不是狗

    最近在程式執行時老是踩到未知地雷,仔細尋找後才發現我踩到「熱狗不是狗」陷阱。
            以下就是當時發生的概況:

            1.動物:會叫
            2.動物中有「狗」這個物種,狗會叫﹔會汪汪叫
            3.狗還會吃,最愛吃熱狗

            於是在 Google上,我下了這樣的搜尋條件:
            「動物(熱狗)的叫聲」

            Google 回答了我:
            「讚」

            按了十次,得到十個讚,看來這個括號有神奇的效果,於是修改了一下搜尋內容

            「熱狗是動物,牠的叫聲」

            當我按下『搜尋』時,立馬就跳出錯誤視窗:

            嗯,下次就知道別犯這個錯誤了。


    ============下面是給 Delphier 的內容=============
    Sound := TAnimal(HotDog).;    // 強制轉型﹔執行時會發生 Error ,出錯當下不容易找出問題

    Sound := (HotDog as TAnimal).;  // 軟性轉型﹔在編譯時就會產生 Error ,隨即就能夠 Debug
    ============上面是給 Delphier 的內容=============