網頁

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)計數

原理:步進對字元計數

// D10 after
function OccurrencesOfChar(const S: string; const C: Char): Integer;
var
  Ch: Char;
begin
  Result := 0;
  // 使用 for-in 迴圈遍歷字串,語法更現代且安全
  for Ch in S do
  begin
    if Ch = C then
      Inc(Result);
  end;
end;

// D7 or Lazarus
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; 

// Example:
//var LNum = OccurrencesOfChar('Banana', 'a');
//Result LNum is 3




字串(String)計數




function Occurrences(const Substring, Text: string): Integer;
var
  Offset: Integer;
begin
  Result := 0;
  
  // 防呆處理:如果子字串為空,直接返回 0,避免無窮迴圈
  if (Substring = '') or (Text = '') then 
    Exit;

  // 尋找第一個匹配位置
  Offset := Pos(Substring, Text);
  
  while Offset <> 0 do
  begin
    Inc(Result);
    // 從「當前位置 + 子字串長度」繼續往後搜尋
    // 使用 Pos 的起始偏移量參數 (Offset + Length)
    Offset := Pos(Substring, Text, Offset + Length(Substring));
  end;
end;

// Example:
//var LNum = Occurrences('an', 'Banana');
//Result LNum is 2

資料來源: