📄 jcledi.pas
字号:
FEDIObject := EDIObject;
FPriorItem := PriorItem;
FNextItem := nil;
if FPriorItem <> nil then
FItemIndex := FPriorItem.ItemIndex + 1;
{$IFDEF ENABLE_EDI_DEBUGGING}
Inc(Debug_EDIDataObjectListItemsCreated);
{$ENDIF ENABLE_EDI_DEBUGGING}
end;
destructor TEDIObjectListItem.Destroy;
begin
{$IFDEF ENABLE_EDI_DEBUGGING}
Inc(Debug_EDIDataObjectListItemsDestroyed);
{$ENDIF ENABLE_EDI_DEBUGGING}
FPriorItem := nil;
FNextItem := nil;
if FParent.OwnsObjects then
FreeAndNilEDIDataObject;
FEDIObject := nil;
FParent := nil;
inherited Destroy;
end;
procedure TEDIObjectListItem.FreeAndNilEDIDataObject;
begin
FreeAndNil(FEDIObject);
end;
function TEDIObjectListItem.GetIndexPositionFromParent: Integer;
begin
Result := FParent.IndexOf(Self);
end;
//=== { TEDIObjectList } =====================================================
constructor TEDIObjectList.Create(OwnsObjects: Boolean = True);
begin
inherited Create;
FOwnsObjects := OwnsObjects;
FFirstItem := nil;
FLastItem := nil;
FCurrentItem := nil;
FCount := 0;
FOptions := [loAutoUpdateIndexes];
{$IFDEF ENABLE_EDI_DEBUGGING}
Inc(Debug_EDIDataObjectListCreated);
{$ENDIF ENABLE_EDI_DEBUGGING}
end;
destructor TEDIObjectList.Destroy;
begin
{$IFDEF ENABLE_EDI_DEBUGGING}
Inc(Debug_EDIDataObjectListDestroyed);
{$ENDIF ENABLE_EDI_DEBUGGING}
Clear;
inherited Destroy;
end;
procedure TEDIObjectList.Clear;
var
ListItem: TEDIObjectListItem;
TempItem: TEDIObjectListItem;
begin
ListItem := FFirstItem;
while ListItem <> nil do
begin
TempItem := ListItem;
ListItem := ListItem.NextItem;
TempItem.Free;
end;
FFirstItem := nil;
FLastItem := nil;
FCurrentItem := nil;
FCount := 0;
end;
function TEDIObjectList.First(Index: Integer): TEDIObjectListItem;
begin
if Index = 0 then
Result := FFirstItem
else
Result := GetItem(Index);
FCurrentItem := Result;
end;
function TEDIObjectList.Last: TEDIObjectListItem;
begin
FCurrentItem := FLastItem;
Result := FCurrentItem;
end;
function TEDIObjectList.Next: TEDIObjectListItem;
begin
FCurrentItem := FCurrentItem.NextItem;
Result := FCurrentItem;
end;
function TEDIObjectList.Prior: TEDIObjectListItem;
begin
FCurrentItem := FCurrentItem.PriorItem;
Result := FCurrentItem;
end;
function TEDIObjectList.Add(EDIObject: TEDIObject; Name: string): TEDIObjectListItem;
begin
Result := CreateListItem(FLastItem, EDIObject);
Result.Name := Name;
if FLastItem <> nil then
FLastItem.NextItem := Result;
if FFirstItem = nil then
FFirstItem := Result;
FLastItem := Result;
FCurrentItem := Result;
Inc(FCount);
end;
function TEDIObjectList.FindItemByName(Name: string;
StartItem: TEDIObjectListItem): TEDIObjectListItem;
var
ListItem: TEDIObjectListItem;
begin
Result := nil;
if StartItem <> nil then
ListItem := StartItem
else
ListItem := First;
while ListItem <> nil do
begin
if ListItem.Name = Name then
begin
Result := ListItem;
Break;
end;
ListItem := Next;
end;
end;
procedure TEDIObjectList.Insert(InsertIndex: Integer; EDIObject: TEDIObject);
var
ListItem: TEDIObjectListItem;
begin
FCurrentItem := GetItem(InsertIndex);
if FCurrentItem <> nil then
begin
//Link new item
ListItem := CreateListItem(FCurrentItem.PriorItem);
ListItem.NextItem := FCurrentItem;
ListItem.EDIObject := EDIObject;
//Relink current item
if FCurrentItem.PriorItem <> nil then
FCurrentItem.PriorItem.NextItem := ListItem
else
FFirstItem := ListItem;
FCurrentItem.PriorItem := ListItem;
//
FCurrentItem := ListItem;
Inc(FCount);
// Update the indexes starting at the current item.
if loAutoUpdateIndexes in FOptions then
UpdateIndexes(FCurrentItem); //Pass nil to force update of all items
end
else
Add(EDIObject);
end;
function TEDIObjectList.GetItem(Index: Integer): TEDIObjectListItem;
var
I: Integer;
ListItem: TEDIObjectListItem;
begin
Result := nil;
if FCurrentItem <> nil then // Attempt to search from the current item.
begin
if Index = FCurrentItem.ItemIndex then // The index already points to the current item.
Result := FCurrentItem
else
if Index > FCurrentItem.ItemIndex then // Search forward in the list.
begin
I := FCurrentItem.ItemIndex - 1;
ListItem := FCurrentItem;
while ListItem <> nil do
begin
Inc(I);
if I = Index then
begin
Result := ListItem;
Break;
end;
ListItem := ListItem.NextItem;
end;
FCurrentItem := Result;
end
else // if Index < FCurrentItem.ItemIndex then // Search backward in the list.
begin
I := FCurrentItem.ItemIndex + 1;
ListItem := FCurrentItem;
while ListItem <> nil do
begin
Dec(I);
if I = Index then
begin
Result := ListItem;
Break;
end;
ListItem := ListItem.PriorItem;
end;
FCurrentItem := Result;
end;
end
else // No current item was assigned so search from the beginning of the structure.
begin
I := -1;
FCurrentItem := FFirstItem;
ListItem := FFirstItem;
while ListItem <> nil do
begin
Inc(I);
if I = Index then
begin
Result := ListItem;
Break;
end;
ListItem := ListItem.NextItem;
end;
FCurrentItem := Result;
end;
end;
procedure TEDIObjectList.Delete(Index: Integer);
var
ListItem: TEDIObjectListItem;
begin
ListItem := GetItem(Index);
if ListItem <> nil then
begin
Remove(ListItem);
// Update the indexes starting at the current item.
if loAutoUpdateIndexes in FOptions then
UpdateIndexes(FCurrentItem.PriorItem); //Pass nil to force update of all items
end;
end;
procedure TEDIObjectList.Delete(EDIObject: TEDIObject);
begin
Remove(EDIObject);
// Update the indexes starting at the current item.
if loAutoUpdateIndexes in FOptions then
UpdateIndexes(nil); //Pass nil to force update of all items
end;
procedure TEDIObjectList.UpdateIndexes(StartItem: TEDIObjectListItem = nil);
var
I: Integer;
ListItem: TEDIObjectListItem;
begin
if StartItem <> nil then
begin
ListItem := StartItem;
I := StartItem.ItemIndex - 1;
end
else
begin
ListItem := FFirstItem;
I := -1;
end;
while ListItem <> nil do
begin
Inc(I);
ListItem.ItemIndex := I;
ListItem := ListItem.NextItem;
end;
end;
procedure TEDIObjectList.UpdateCount;
var
ListItem: TEDIObjectListItem;
begin
FCount := 0;
ListItem := FFirstItem;
while ListItem <> nil do
begin
ListItem := ListItem.NextItem;
Inc(FCount);
end;
end;
procedure TEDIObjectList.Remove(EDIObject: TEDIObject);
var
ListItem: TEDIObjectListItem;
begin
ListItem := Find(EDIObject);
if ListItem <> nil then
begin
// Remove the item from the list
ListItem := Extract(ListItem);
// Free the list item
FreeAndNil(ListItem);
end;
end;
function TEDIObjectList.Extract(EDIObject: TEDIObject): TEDIObject;
var
ListItem: TEDIObjectListItem;
begin
Result := nil;
ListItem := Find(EDIObject);
if ListItem <> nil then
begin
// Extract the EDI Data Object
Result := ListItem.EDIObject;
ListItem.EDIObject := nil;
// Remove the item from the list
ListItem := Extract(ListItem);
// Free the list item
FreeAndNil(ListItem);
end;
end;
function TEDIObjectList.IndexOf(EDIObject: TEDIObject): Integer;
var
I: Integer;
ListItem: TEDIObjectListItem;
begin
Result := -1;
I := 0;
ListItem := FFirstItem;
while ListItem <> nil do
begin
if ListItem.EDIObject = EDIObject then
begin
FCurrentItem := ListItem;
FCurrentItem.ItemIndex := I;
Result := I;
Break;
end;
ListItem := ListItem.NextItem;
Inc(I);
end;
end;
function TEDIObjectList.GetEDIObject(Index: Integer): TEDIObject;
var
ListItem: TEDIObjectListItem;
begin
Result := nil;
ListItem := GetItem(Index);
if ListItem <> nil then
Result := ListItem.EDIObject;
end;
procedure TEDIObjectList.SetEDIObject(Index: Integer; const Value: TEDIObject);
var
ListItem: TEDIObjectListItem;
begin
ListItem := GetItem(Index);
if ListItem <> nil then
ListItem.EDIObject := Value;
end;
function TEDIObjectList.ReturnListItemsByName(Name: string): TEDIObjectList;
var
ListItem: TEDIObjectListItem;
begin
Result := TEDIObjectList.Create(False);
ListItem := First;
while ListItem <> nil do
begin
if ListItem.Name = Name then
Result.Add(ListItem.EDIObject, ListItem.Name);
ListItem := Next;
end; //while
end;
function TEDIObjectList.IndexOf(Item: TEDIObjectListItem): Integer;
var
I: Integer;
ListItem: TEDIObjectListItem;
begin
Result := -1;
I := 0;
ListItem := FFirstItem;
while ListItem <> nil do
begin
if ListItem = Item then
begin
FCurrentItem := ListItem;
FCurrentItem.ItemIndex := I;
Result := I;
Break;
end;
ListItem := ListItem.NextItem;
Inc(I);
end;
end;
procedure TEDIObjectList.Remove(Item: TEDIObjectListItem);
begin
// Remove the item from the list
Item := Extract(Item);
// Free the list item
FreeAndNil(Item);
end;
function TEDIObjectList.Extract(Item: TEDIObjectListItem): TEDIObjectListItem;
begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -