[英]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;
同樣,將這兩種方法中的任何一種放入類幫助器中都很容易,以使調用語法看起來更清晰。
我最重要的建議:
try/finally
final。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.