109 lines
2.1 KiB
Plaintext
109 lines
2.1 KiB
Plaintext
Type Collection = class
|
|
|
|
public
|
|
Function Create();
|
|
Function SetIgnoreCase(value);
|
|
Function SetActivate(value);
|
|
Function GetActivate();
|
|
Function CalNewName(prefix);
|
|
Function CompareFunction(index, data);
|
|
|
|
Function AddCollection(obj, name);
|
|
Function RemoveCollection(index);
|
|
Function Operator[](index);
|
|
Function GetCount();
|
|
|
|
public
|
|
class Function GetInstance(value);
|
|
|
|
private
|
|
ignorecase_; // 忽略大小写
|
|
container_; // 容器对象
|
|
fp_; // 函数指针 -- 用来比较
|
|
activate_; // 激活的对象
|
|
|
|
private
|
|
static collection_;
|
|
|
|
End;
|
|
|
|
// ============== 实现 ================= //
|
|
Function Collection.Create();
|
|
Begin
|
|
container_ := ContainerList();
|
|
ignorecase_ := false;
|
|
fp_ := FindFunction("CompareFunction", self);
|
|
End;
|
|
|
|
Function Collection.SetIgnoreCase(value);
|
|
Begin
|
|
ignorecase_ := value;
|
|
End;
|
|
|
|
Function Collection.SetActivate(value);
|
|
Begin
|
|
activate_ := self[value];
|
|
End;
|
|
|
|
Function Collection.GetActivate();
|
|
Begin
|
|
return activate_;
|
|
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;
|
|
|
|
class Function Collection.GetInstance(value);
|
|
Begin
|
|
if not istable(collection_) then collection_ := array();
|
|
if not collection_[value] then
|
|
collection_[value] := new Collection();
|
|
return collection_[value];
|
|
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;
|
|
|