Так на чем все закончилось?
Результат есть какой?
Smith2007 писал(а):Так на чем все закончилось?
Результат есть какой?
SASObjectSet: array of ISASObject
IC7K писал(а):мне не хватает знаний в области программирования
IC7K писал(а):я помогу чем смогу
type
PStructListItem=^TStructListItem;
TStructListItem=record
FPrev: PStructListItem;
FNext: PStructListItem;
// прочие поля структуры элемента списка
end;
TObjectListItem=class(TObject)
private
FPrev: TObjectListItem;
FNext: TObjectListItem;
// прочие поля объекта элемента списка
end;
TObjectListHolder=class(TObject,IObjectListHolder)
private
FList: TObjectListItem;
// прочие поля объекта
private
// для итерации
function GetFirst: Pointer;
function GetLast: Pointer;
function GetNext(Obj: Pointer): Pointer;
function GetPrev(Obj: Pointer): Pointer;
end;
{ TObjectListHolder }
function TObjectListHolder.GetFirst: Pointer;
begin
Result:=FList;
end;
function TObjectListHolder.GetLast: Pointer;
begin
Result:=FList.FPrev;
end;
function TObjectListHolder.GetNext(Obj: Pointer): Pointer;
begin
Result:=TObjectListItem(Obj).FNext;
end;
function TObjectListHolder.GetPrev(Obj: Pointer): Pointer;
begin
Result:=TObjectListItem(Obj).FPrev;
end;
function TObjectListHolder.AppendNew: Pointer;
begin
Result:=TObjectListItem.Create;
if (FList=nil) then
begin
// создали самый первый элемент
TObjectListItem(Result).FPrev:=TObjectListItem(Result);
TObjectListItem(Result).FNext:=TObjectListItem(Result);
FList:=TObjectListItem(Result);
end
else
if (FList.FPrev=FList) then
begin
// создали второй элемент в списке - тоже реализация попроще
FList.FPrev:=TObjectListItem(Result);
FList.FNext:=TObjectListItem(Result);
TObjectListItem(Result).FPrev:=FList;
TObjectListItem(Result).FNext:=FList;
end
else
begin
// создали очередной элемент в списке - полная реализация
// вставляем его в конец списка между FList.FPrev и FList и закольцовываем обе связи с 2 сторон
TObjectListItem(Result).FNext:=FList;
TObjectListItem(Result).FPrev:=FList.FPrev;
FList.FPrev:=TObjectListItem(Result);
TObjectListItem(Result).FPrev.FNext:=TObjectListItem(Result);
end;
end;
vdemidov писал(а):Зачем этот огород с двунаправленным списком?
vdemidov писал(а):Чем простой указатель на массив хуже?
vdemidov писал(а):почему бы ему не возвращать количество и указатель на первый элемент массива?
vdemidov писал(а):в программу лучше отдавать простой интерфейс итератора с двумя методами:
function Next(out AItem: ISASObject): boolean;
procedure Reset;
vasketsov писал(а):Причём интерфейс конкретного элемента вообще не надо вводить в оборот, методы Next и Show - это методы как бы всего плагина
vdemidov писал(а):Ой развеселили. И что с этим поинтером делать если не вводить интерфейс для итема?
vdemidov писал(а):А если вводить то нафиг поинтер?
vdemidov писал(а):Причем скорее всего еще и с указанием GUID ожидаемого интерфейса, что бы в случае изменения API проблем не было.
Вернуться в Раздел для разработчиков программы SAS.Планета
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1