⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jcledixml.pas

📁 East make Tray Icon in delphi
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  // Set data start positon
  StartPos := SearchResult + FDelimiters.ETDLength;
  // Check for CData tag
  FCData := False;
  SearchResult := StrSearch(FDelimiters.BCDataD, FData, StartPos);
  if SearchResult > 0 then
  begin
    StartPos := SearchResult + FDelimiters.BCDataLength;
    FCData := True;
  end;
  //
  SearchResult := StrSearch(FDelimiters.BOfETD + XMLTag_Element, FData, StartPos);
  if SearchResult > 0 then
  begin
    EndPos := SearchResult;
    SearchResult := StrSearch(FDelimiters.ETD, FData, SearchResult);
    if SearchResult > 0 then
    begin
      if FCData then
        EndPos := EndPos - FDelimiters.ECDataLength;
      FData := Copy(FData, StartPos, (EndPos - StartPos));
    end
    else
      raise EJclEDIError.CreateRes(@EDIXMLError050);
  end
  else
    raise EJclEDIError.CreateRes(@EDIXMLError049);
  // Handle Entity Reference Characters
  StrReplace(FData, EDIXML_HTMLLessThanSign, EDIXML_LessThanSign, [rfReplaceAll]);
  StrReplace(FData, EDIXML_HTMLGreaterThanSign, EDIXML_GreaterThanSign, [rfReplaceAll]);
  StrReplace(FData, EDIXML_HTMLQuotationMark, EDIXML_QuotationMark, [rfReplaceAll]);
  StrReplace(FData, EDIXML_HTMLApostrophe, EDIXML_Apostrophe, [rfReplaceAll]);
  StrReplace(FData, EDIXML_HTMLAmpersand, EDIXML_Ampersand, [rfReplaceAll]);
  //
  FState := ediDisassembled;
end;

function TEDIXMLElement.GetIndexPositionFromParent: Integer;
var
  I: Integer;
begin
  Result := -1;
  if Assigned(Parent) and (Parent is TEDIXMLSegment) then
    for I := Low(TEDIXMLSegment(Parent).Elements) to High(TEDIXMLSegment(Parent).Elements) do
      if TEDIXMLSegment(Parent).Element[I] = Self then
        Result := I;
end;

function TEDIXMLElement.InternalAssignDelimiters: TEDIXMLDelimiters;
begin
  Result := nil;
  // Attempt to assign the delimiters
  if not Assigned(FDelimiters) then
    // Get the delimiters from the parent segment
    if Assigned(Parent) and (Parent is TEDIXMLSegment) then
      Result := Parent.Delimiters;
end;

//=== { TEDIXMLSegment } =====================================================

constructor TEDIXMLSegment.Create(Parent: TEDIXMLDataObject; ElementCount: Integer);
begin
  if Assigned(Parent) and (Parent is TEDIXMLTransactionSet) then
    inherited Create(Parent)
  else
    inherited Create(nil);
  FEDIDOT := ediSegment;
  SetLength(FElements, 0);
  AddElements(ElementCount);
end;

constructor TEDIXMLSegment.Create(Parent: TEDIXMLDataObject);
begin
  if Assigned(Parent) and (Parent is TEDIXMLDataObjectGroup) then
    inherited Create(Parent)
  else
    inherited Create(nil);
  FEDIDOT := ediSegment;
  SetLength(FElements, 0);
end;

destructor TEDIXMLSegment.Destroy;
begin
  DeleteElements;
  inherited Destroy;
end;

function TEDIXMLSegment.AddElement: Integer;
begin
  SetLength(FElements, Length(FElements) + 1);
  FElements[High(FElements)] := InternalCreateElement;
  Result := High(FElements); // Return position of element
end;

function TEDIXMLSegment.AddElements(Count: Integer): Integer;
var
  I, J: Integer;
begin
  I := Length(FElements);
  Result := I; // Return position of 1st element
  // Resize
  SetLength(FElements, Length(FElements) + Count);
  // Add
  for J := I to High(FElements) do
    FElements[J] := InternalCreateElement;
end;

function TEDIXMLSegment.AppendElement(Element: TEDIXMLElement): Integer;
begin
  SetLength(FElements, Length(FElements) + 1);
  FElements[High(FElements)] := Element;
  Element.Parent := Self;
  Result := High(FElements); // Return position of element
end;

function TEDIXMLSegment.AppendElements(ElementArray: TEDIXMLElementArray): Integer;
var
  I, J, K: Integer;
begin
  I := 0;
  J := Length(FElements);
  Result := J; // Return position of 1st element
  // Resize
  SetLength(FElements, Length(FElements) + Length(ElementArray));
  //Append
  for K := J to High(ElementArray) do
  begin
    FElements[K] := ElementArray[I];
    FElements[K].Parent := Self;
    Inc(I);
  end;
end;

function TEDIXMLSegment.Assemble: string;
var
  I: Integer;
  AttributeString: string;
begin
  FData := '';
  FLength := 0;
  Result := '';

  if not Assigned(FDelimiters) then // Attempt to assign the delimiters
  begin
    FDelimiters := InternalAssignDelimiters;
    if not Assigned(FDelimiters) then
      raise EJclEDIError.CreateRes(@EDIXMLError042);
  end;

  AttributeString := FAttributes.CombineAttributes;
  if AttributeString <> '' then
    FData := FDelimiters.BTD + XMLTag_Segment + FDelimiters.SpaceDelimiter +
      AttributeString + FDelimiters.ETD
  else
    FData := FDelimiters.BTD + XMLTag_Segment + FDelimiters.ETD;

  if Length(FElements) > 0 then
    for I := Low(FElements) to High(FElements) do
      if Assigned(FElements[I]) then
        FData := FData + FElements[I].Assemble
      else
        FData := FData + FDelimiters.BTD + XMLTag_Element + FDelimiters.ETD +
          FDelimiters.BOfETD + XMLTag_Element + FDelimiters.ETD;
  FData := FData + FDelimiters.BOfETD + XMLTag_Segment + FDelimiters.ETD;
  FLength := Length(FData);
  Result := FData; // Return assembled string

  DeleteElements;

  FState := ediAssembled;
end;

procedure TEDIXMLSegment.DeleteElement(Element: TEDIXMLElement);
var
  I: Integer;
begin
  for I := Low(FElements) to High(FElements) do
    if FElements[I] = Element then
      DeleteElement(I);
end;

procedure TEDIXMLSegment.DeleteElement(Index: Integer);
var
  I: Integer;
begin
  if (Length(FElements) > 0) and (Index >= Low(FElements)) and (Index <= High(FElements)) then
  begin
    // Delete
    FreeAndNil(FElements[Index]);
    // Shift
    for I := Index + 1 to High(FElements) do
      FElements[I - 1] := FElements[I];
    // Resize
    SetLength(FElements, High(FElements));
  end
  else
    raise EJclEDIError.CreateResFmt(@EDIXMLError058, [IntToStr(Index)]);
end;

procedure TEDIXMLSegment.DeleteElements;
var
  I: Integer;
begin
  for I := Low(FElements) to High(FElements) do
    // Delete
    FreeAndNil(FElements[I]);
  // Resize
  SetLength(FElements, 0);
end;

procedure TEDIXMLSegment.DeleteElements(Index, Count: Integer);
var
  I: Integer;
begin
  if (Length(FElements) > 0) and (Index >= Low(FElements)) and (Index <= High(FElements)) then
  begin
    // Delete
    for I := Index to (Index + Count) - 1 do
      FreeAndNil(FElements[I]);
    // Shift
    for I := (Index + Count) to High(FElements) do
    begin
      FElements[I - Count] := FElements[I];
      FElements[I] := nil;
    end;
    // Resize
    SetLength(FElements, Length(FElements) - Count);
  end
  else
    raise EJclEDIError.CreateResFmt(@EDIXMLError058, [IntToStr(Index)]);
end;

procedure TEDIXMLSegment.Disassemble;
var
  I, StartPos, SearchResult: Integer;
  XMLStartTag: string;
begin
  DeleteElements;
  // Check delimiter assignment
  if not Assigned(FDelimiters) then
  begin
    FDelimiters := InternalAssignDelimiters;
    if not Assigned(FDelimiters) then
      raise EJclEDIError.CreateRes(@EDIXMLError041);
  end;
  // Set next start positon
  StartPos := 1;
  // Move past begin segment tag
  SearchResult := StrSearch(FDelimiters.BTD + XMLTag_Segment, FData, StartPos);
  if SearchResult > 0 then
  begin
    StartPos := SearchResult;
    SearchResult := StrSearch(FDelimiters.ETD, FData, SearchResult);
    XMLStartTag := Copy(FData, StartPos, (SearchResult + FDelimiters.ETDLength) - StartPos);
    FAttributes.ParseAttributes(XMLStartTag);
  end
  else
    raise EJclEDIError.CreateRes(@EDIXMLError043);
  // Set next start positon
  StartPos := SearchResult + FDelimiters.ETDLength;
  // Search for element
  SearchResult := StrSearch(FDelimiters.BTD + XMLTag_Element, FData, StartPos);
  // Search for Segments
  while SearchResult > 0 do
  begin
    SearchResult := StrSearch(FDelimiters.BOfETD + XMLTag_Element, FData, SearchResult);
    if SearchResult > 0 then
    begin
      SearchResult := StrSearch(FDelimiters.ETD, FData, SearchResult);
      if SearchResult > 0 then
      begin
        I := AddElement; // Add Element
        FElements[I].Data :=
          Copy(FData, StartPos, ((SearchResult - StartPos) + FDelimiters.ETDLength));
        FElements[I].Disassemble;
      end
      else
        raise EJclEDIError.CreateRes(@EDIXMLError050);
    end
    else
      raise EJclEDIError.CreateRes(@EDIXMLError049);
    // Set next start positon
    StartPos := SearchResult + FDelimiters.ETDLength;
    // Search for element
    SearchResult := StrSearch(FDelimiters.BTD + XMLTag_Element, FData, StartPos);
  end;
  FData := '';
  //
  FState := ediDisassembled;
end;

function TEDIXMLSegment.GetElement(Index: Integer): TEDIXMLElement;
begin
  if Length(FElements) > 0 then
    if Index >= Low(FElements) then
      if Index <= High(FElements) then
      begin
        if not Assigned(FElements[Index]) then
          raise EJclEDIError.CreateResFmt(@EDIXMLError057, [IntToStr(Index)]);
        Result := FElements[Index];
      end
      else
        raise EJclEDIError.CreateResFmt(@EDIXMLError056, [IntToStr(Index)])
    else
      raise EJclEDIError.CreateResFmt(@EDIXMLError055, [IntToStr(Index)])
  else
    raise EJclEDIError.CreateResFmt(@EDIXMLError054, [IntToStr(Index)]);
end;

function TEDIXMLSegment.GetIndexPositionFromParent: Integer;
var
  I: Integer;
begin
  Result := -1;
  if Assigned(Parent) and (Parent is TEDIXMLTransactionSet) then
    for I := Low(TEDIXMLTransactionSet(Parent).EDIDataObjects) to
      High(TEDIXMLTransactionSet(Parent).EDIDataObjects) do
      if TEDIXMLTransactionSet(Parent).EDIDataObject[I] = Self then
      begin
        Result := I;
        Break;
      end;
end;

function TEDIXMLSegment.InsertElement(InsertIndex: Integer): Integer;
var
  I: Integer;
begin
  Result := InsertIndex;
  if (Length(FElements) > 0) and (InsertIndex >= Low(FElements)) and
    (InsertIndex <= High(FElements)) then
  begin
    // Resize
    SetLength(FElements, Length(FElements) + 1);
    // Shift
    for I := High(FElements) downto InsertIndex + 1 do
      FElements[I] := FElements[I - 1];
    // Insert
    FElements[InsertIndex] := InternalCreateElement;
  end
  else
    Result := AddElement;
end;

function TEDIXMLSegment.InsertElement(InsertIndex: Integer; Element: TEDIXMLElement): Integer;
var
  I: Integer;
begin
  Result := InsertIndex;
  if (Length(FElements) > 0) and (InsertIndex >= Low(FElements)) and
    (InsertIndex <= High(FElements)) then
  begin
    // Resize
    SetLength(FElements, Length(FElements) + 1);
    // Shift
    for I := High(FElements) downto InsertIndex + 1 do
      FElements[I] := FElements[I - 1];
    // Insert
    FElements[InsertIndex] := Element;
    FElements[InsertIndex].Parent := Self;
  end
  else
    Result := AppendElement(Element);
end;

function TEDIXMLSegment.InsertElements(InsertIndex: Integer;
  ElementArray: TEDIXMLElementArray): Integer;
var
  I, J, K: Integer;
begin
  Result := InsertIndex;
  I := Length(ElementArray);
  if (Length(FElements) > 0) and (InsertIndex >= Low(FElements)) and
    (InsertIndex <= High(FElements)) then
  begin
    // Resize

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -