OfficeVba/utils/Collection.tsf

95 lines
1.8 KiB
Plaintext

Type Collection = Class
public
Function Create();
Function CompareFunction(index, data);
Function SetIgnoreCase(value);
Function SetActivation(value);
Function GetActivation();
Function CalNewName(prefix);
Function AddCollection(obj, name);
Function RemoveCollection(index);
Function Operator[](index);
Function GetCount();
private
ignorecase_; // 忽略大小写
container_; // 容器对象
fp_; // 函数指针 -- 用来比较
activation_; // 激活的对象
End;
// ============== 实现 ================= //
Function Collection.Create();
Begin
container_ := new LinkList();
ignorecase_ := false;
fp_ := FindFunction("CompareFunction", self);
End;
Function Collection.SetIgnoreCase(value);
Begin
ignorecase_ := value;
End;
Function Collection.SetActivation(value);
Begin
activation_ := self[value];
End;
Function Collection.GetActivation();
Begin
return activation_;
End;
Function Collection.CompareFunction(index, data);
Begin
return (ifnumber(index) and data.index = index)
or data.name = index
or (ignorecase_ and lowercase(data.name) = lowercase(index));
End;
Function Collection.CalNewName(prefix);
Begin
len := GetCount() + 1;
name := prefix $ len;
while container_.Get(name, fp_) do
name := prefix $ ++len;
return name;
End;
Function Collection.AddCollection(obj, name);
Begin
data := new Data();
data.obj := obj;
data.name := name;
data.index := GetCount() + 1;
return container_.Add(data);
End;
Function Collection.RemoveCollection(index);
Begin
return container_.Remove(index, fp_);
End;
Function Collection.GetCount();
Begin
return container_.Size();
End;
Function Operator Collection.[](index);
Begin
ret := container_.Get(index, fp_);
return ret ? ret.obj : nil;
End;
// 集合中需要记录的数据
Type Data = class
obj;
name;
index;
End;