编程大师如是说:
一个程序应当是轻盈的、灵活的,它的子程序就像一串珍珠一样连接着。它的精神和意图应该贯穿始终。在程序中,内容既不应太多,也不应太少;既不应该有不需要的循环结构,也不该有冗余的变量;既不缺乏结构性,又不过分僵化。
我实在很喜欢这个开发包,它凝结大家的智慧和精华,可能我这个人有点完美主义,嘿嘿。比如组件选取专家,我经常用这个,因为我弄的界面真的很乱。我也看看代码,不过重复的地方不少,我有个习惯,如果一组代码重复出现两次,我就定义一个方法来用。
如选取某一个字段的时候,两个ListBox之间的ADD和Delete其实是一样的。
procedure TCnComponentSelectorForm.actDeleteExecute(Sender: TObject);
var
i: Integer;
begin
BeginUpdateList;
try
for i := 0 to lbDest.Items.Count - 1 do // 只有当前过滤列表中有的才加入到左边
if lbDest.Selected[i] and (CurrList.IndexOf(lbDest.Items[i]) >= 0) then
lbSource.Items.AddObject(lbDest.Items[i], lbDest.Items.Objects[i]);
for i := lbDest.Items.Count - 1 downto 0 do
if lbDest.Selected[i] then
lbDest.Items.Delete(i);
finally
UpdateSourceOrders;
EndUpdateList;
end;
end;
只不过处理的对象对调了,那就弄一个方法如下:
procedure MoveFieldToOther(aLstSource, aLstDest: TListBox);
var
i: Integer;
begin
BeginUpdateList;
try
for i := 0 to aLstSource.Items.Count - 1 do // 只有当前过滤列表中有的才加入到左边
if aLstSource.Selected[i] and (CurrList.IndexOf(aLstSource.Items[i]) >= 0) then
aLstDest.Items.AddObject(aLstSource.Items[i], aLstSource.Items.Objects[i]);
for i := aLstSource.Items.Count - 1 downto 0 do
if aLstSource.Selected[i] then
aLstSource.Items.Delete(i);
finally
UpdateSourceOrders;
EndUpdateList;
end;
end;
调用的时候
需要这么写而已
add的Action
MoveFieldToOther(lbSource, lbDest: TListBox);
delete的Action
MoveFieldToOther(lbDest, lbSource: TListBox);
是的,有一些小区别,(CurrList.IndexOf(aLstSource.Items[i]) >= 0)
但是区别不大,那可以用开关参数定义他们。
是的,类似上面所说:上下移动的方法也是有重复的。写成方法主要是减少代码量,代码重复copy,以及最大的优点就是,能一定的防止代码写错。易于管理。
正如编程大师所说:它的子程序就像一串珍珠一样连接着。
而且我相信,以后对于两个ListBox相互移动的地方肯定不少,为什么不定好几个方法呢。
定义好了一些方法扔到另一个pas文件里面,然后主窗体调用,这样就做到了UI分离了。
嘿嘿,一点小建议。
[ 本贴由 leeon 于 2003-12-9 20:59 最后编辑 ]