簡體   English   中英

緊湊的delphi代碼,將TStringlist作為參數處理

[英]compact delphi code , handling TStringlist as parameter

以下代碼行失敗:

... 
ProcessStringLIst(ChecklistBox_CheckedStrings(MyCheckListBox));        
....

//  support functions

function ProcessStringLIst (alst : TStringlist);
begin
      ///  ....  process the stringlist 

end;

function ChecklistBox_CheckedStrings(aCheckListBox: TCheckListBox): TStringList;
var
  i: Integer;
begin
  result.Clear;
  for i := 0 to aCheckListBox.Items.Count - 1 do
    if aCheckListBox.Checked[i] then
      result.Add(aCheckListBox.Items[i])
end;

因為在ChecklistBox_CheckedStrings內部,結果尚未分配數據。 我可以避免以下4行版本:

 templist := TStringlist.Create;
 temList := ChecklistBox_CheckedStrings(MyCheckListBox);
 ProcessStringLIst(templist);
 templist.free;

在您的代碼中,函數的返回值未初始化,然后您的第一行代碼執行了:

result.Clear;

因為您尚未初始化result ,所以任何事情都可能發生。 如果啟用編譯器警告,則編譯器將告訴您這一點。

您需要下定決心是否要讓函數返回一個新創建的字符串列表對象,或者要使用該調用者創建的對象。 假設您選擇后者。 然后,您的函數將變成這樣的過程:

procedure GetChecklistBox_CheckedStrings(aCheckListBox: TCheckListBox; 
  aStringList: TStringList);
var
  i: Integer;
begin
  aStringList.Clear;
  for i := 0 to aCheckListBox.Items.Count - 1 do
    if aCheckListBox.Checked[i] then
      aStringList.Add(aCheckListBox.Items[i])
end;

然后,調用代碼變為:

templist := TStringlist.Create;
try
  GetChecklistBox_CheckedStrings(MyCheckListBox, templist);
  ProcessStringList(templist);
finally
  templist.free;
end;

如果要保護程序免受內存泄漏,則必須使用try/finally

而另一種方式是這樣的:

function CreateCheckListBox_CheckedStrings(aCheckListBox: TCheckListBox): TStringList;
var
  i: Integer;
begin
  Result := TStringList.Create;
  try
    for i := 0 to aCheckListBox.Items.Count - 1 do
      if aCheckListBox.Checked[i] then
        Result.Add(aCheckListBox.Items[i])
  except
    Result.Free;
    raise;
  end;
end;

.....

templist := CreateCheckListBox_CheckedStrings(MyCheckListBox);
try
  ProcessStringList(templist);
finally
  templist.free;
end;

同樣,將這兩種方法中的任何一種放入類幫助器中都很容易,以使調用語法看起來更清晰。

我最重要的建議:

  1. 啟用警告和提示,並確保您的代碼永不包含任何代碼。
  2. 正確使用try/finally final。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM