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

📄 jcledixml.pas

📁 East make Tray Icon in delphi
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  else
    FParentTransactionSet := nil;
  FEDIDOT := ediLoop;
end;

destructor TEDIXMLTransactionSetLoop.Destroy;
begin
  inherited Destroy;
end;

function TEDIXMLTransactionSetLoop.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(@EDIXMLError030);
  end;

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

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

  DeleteEDIDataObjects;

  FState := ediAssembled;
end;

procedure TEDIXMLTransactionSetLoop.Disassemble;
var
  I, J, StartPos, SearchResult: Integer;
  XMLStartTag, SearchTag: string;
  NestedLoopCount: Integer;
begin
  DeleteEDIDataObjects;
  // Check delimiter assignment
  if not Assigned(FDelimiters) then
  begin
    FDelimiters := InternalAssignDelimiters;
    if not Assigned(FDelimiters) then
      raise EJclEDIError.CreateRes(@EDIXMLError029);
  end;
  // Set next start positon
  StartPos := 1;
  // Move past begin loop tag
  SearchResult := StrSearch(FDelimiters.BTD + XMLTag_TransactionSetLoop, 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(@EDIXMLError031);
  // Set next start positon
  StartPos := SearchResult + FDelimiters.ETDLength;
  // Determine the nearest tag to search for
  I := StrSearch(FDelimiters.BTD + XMLTag_Segment, FData, StartPos);
  J := StrSearch(FDelimiters.BTD + XMLTag_TransactionSetLoop, FData, StartPos);
  if (I < J) or (J <= 0) then
  begin
    SearchTag := XMLTag_Segment;
    SearchResult := I;
  end
  else
  begin
    SearchTag := XMLTag_TransactionSetLoop;
    SearchResult := J;
  end;
  // Search for Segments or Loops
  while SearchResult > 0 do
  begin
    if SearchTag = XMLTag_Segment then
    begin
      SearchResult := StrSearch(FDelimiters.BOfETD + SearchTag, FData, SearchResult);
      if SearchResult > 0 then
      begin
        SearchResult := StrSearch(FDelimiters.ETD, FData, SearchResult);
        if SearchResult > 0 then
        begin
          I := AddSegment; // Add Segment
          EDIDataObjects[I].Data :=
            Copy(FData, StartPos, ((SearchResult - StartPos) + FDelimiters.ETDLength));
          EDIDataObjects[I].Disassemble;
        end
        else
          raise EJclEDIError.CreateRes(@EDIXMLError045);
      end
      else
        raise EJclEDIError.CreateRes(@EDIXMLError044);
    end
    else
    begin
      NestedLoopCount := 0;
      SearchResult := StartPos;
      // Search for the proper end loop tag
      repeat
        I := StrSearch(FDelimiters.BOfETD + SearchTag, FData, SearchResult); //Find loop end
        J := StrSearch(FDelimiters.BTD + SearchTag, FData, SearchResult); //Find loop begin
        if (I < J) or (J <= 0) then
        begin
          Dec(NestedLoopCount);
          SearchResult := I + FDelimiters.ETDLength;
        end
        else
        if (I > J) and (J > 0) then
        begin
          Inc(NestedLoopCount);
          SearchResult := J + FDelimiters.ETDLength;
        end;
      until (NestedLoopCount <= 0) or (I <= 0);
      SearchResult := I;
      //
      if SearchResult > 0 then
      begin
        SearchResult := StrSearch(FDelimiters.ETD, FData, SearchResult);
        if SearchResult > 0 then
        begin
          I := AddGroup; // Add Transaction Set Loop
          EDIDataObjects[I].Data :=
            Copy(FData, StartPos, ((SearchResult - StartPos) + FDelimiters.ETDLength));
          EDIDataObjects[I].Disassemble;
        end
        else
          raise EJclEDIError.CreateRes(@EDIXMLError032);
      end
      else
        raise EJclEDIError.CreateRes(@EDIXMLError031);
    end;
    // Set next start positon
    StartPos := SearchResult + FDelimiters.ETDLength;
    // Determine the nearest tag to search for
    I := StrSearch(FDelimiters.BTD + XMLTag_Segment, FData, StartPos);
    J := StrSearch(FDelimiters.BTD + XMLTag_TransactionSetLoop, FData, StartPos);
    if (I < J) or (J <= 0) then
      SearchTag := XMLTag_Segment
    else
      SearchTag := XMLTag_TransactionSetLoop;
    SearchResult := StrSearch(FDelimiters.BTD + SearchTag, FData, StartPos);
    StartPos := SearchResult;
  end;
  FData := '';
  //
  FState := ediDisassembled;
end;

function TEDIXMLTransactionSetLoop.InternalAssignDelimiters: TEDIXMLDelimiters;
begin
  Result := nil;
  if Assigned(FParentTransactionSet) then
    Result := Parent.Delimiters;
end;

function TEDIXMLTransactionSetLoop.InternalCreateDataObjectGroup: TEDIXMLDataObjectGroup;
begin
  Result := TEDIXMLTransactionSetLoop.Create(Self);
end;

//=== { TEDIXMLTransactionSet } ==============================================

constructor TEDIXMLTransactionSet.Create(Parent: TEDIXMLDataObject);
begin
  inherited Create(Parent);
  FParentTransactionSet := Self;
  FEDIDOT := ediTransactionSet;
end;

destructor TEDIXMLTransactionSet.Destroy;
begin
  inherited Destroy;
end;

function TEDIXMLTransactionSet.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(@EDIXMLError026);
  end;

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

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

  DeleteEDIDataObjects;

  FState := ediAssembled;
end;

procedure TEDIXMLTransactionSet.Disassemble;
var
  I, J, StartPos, SearchResult: Integer;
  SearchTag, TempData: string;
  NestedLoopCount: Integer;
begin
  DeleteEDIDataObjects;
  // Check delimiter assignment
  if not Assigned(FDelimiters) then
  begin
    FDelimiters := InternalAssignDelimiters;
    if not Assigned(FDelimiters) then
      raise EJclEDIError.CreateRes(@EDIXMLError025);
  end;
  // Set next start positon
  StartPos := 1;
  // Determine the nearest tag to search for
  I := StrSearch(FDelimiters.BTD + XMLTag_Segment, FData, StartPos);
  J := StrSearch(FDelimiters.BTD + XMLTag_TransactionSetLoop, FData, StartPos);
  if (I < J) or (J <= 0) then
    SearchTag := XMLTag_Segment
  else
    SearchTag := XMLTag_TransactionSetLoop;
  // Search for Segments or Loops
  SearchResult := StrSearch(FDelimiters.BTD + SearchTag, FData, StartPos);
  StartPos := SearchResult;
  while SearchResult > 0 do
  begin
    if SearchTag = XMLTag_Segment then
    begin
      SearchResult := StrSearch(FDelimiters.BOfETD + SearchTag, FData, SearchResult);
      if SearchResult > 0 then
      begin
        SearchResult := StrSearch(FDelimiters.ETD, FData, SearchResult);
        if SearchResult > 0 then
        begin
          I := AddSegment; //A dd Segment
          EDIDataObjects[I].Data :=
            Copy(FData, StartPos, ((SearchResult - StartPos) + FDelimiters.ETDLength));
          EDIDataObjects[I].Disassemble;
        end
        else
          raise EJclEDIError.CreateRes(@EDIXMLError045);
      end
      else
        raise EJclEDIError.CreateRes(@EDIXMLError044);
    end
    else
    begin
      NestedLoopCount := 0;
      SearchResult := StartPos;
      // Search for the proper end loop tag
      repeat
        I := StrSearch(FDelimiters.BOfETD + SearchTag, FData, SearchResult); //Find loop end
        J := StrSearch(FDelimiters.BTD + SearchTag, FData, SearchResult); //Find loop begin
        if (I < J) or (J <= 0) then
        begin
          Dec(NestedLoopCount);
          SearchResult := I + FDelimiters.ETDLength;
        end
        else
        if (I > J) and (J > 0) then
        begin
          Inc(NestedLoopCount);
          SearchResult := J + FDelimiters.ETDLength;
        end;
      until (NestedLoopCount <= 0) or (I <= 0);
      SearchResult := I;
      //
      if SearchResult > 0 then
      begin
        SearchResult := StrSearch(FDelimiters.ETD, FData, SearchResult);
        if SearchResult > 0 then
        begin
          I := AddGroup; // Add Transaction Set Loop
          EDIDataObjects[I].Data :=
            Copy(FData, StartPos, ((SearchResult - StartPos) + FDelimiters.ETDLength));
          EDIDataObjects[I].Disassemble;
        end
        else
          raise EJclEDIError.CreateRes(@EDIXMLError032);
      end
      else
        raise EJclEDIError.CreateRes(@EDIXMLError031);
    end;
    // Set next start positon
    StartPos := SearchResult + FDelimiters.ETDLength;
    // Determine the nearest tag to search for
    I := StrSearch(FDelimiters.BTD + XMLTag_Segment, FData, StartPos);
    J := StrSearch(FDelimiters.BTD + XMLTag_TransactionSetLoop, FData, StartPos);
    if (I < J) or (J <= 0) then
      SearchTag := XMLTag_Segment
    else
      SearchTag := XMLTag_TransactionSetLoop;
    SearchResult := StrSearch(FDelimiters.BTD + SearchTag, FData, StartPos);
  end;

  if Length(FEDIDataObjects) > 0 then
  begin
    // Search for Transaction Set Header and Trailer
    FSTSegment := TEDIXMLSegment(FEDIDataObjects[0]);
    FSESegment := TEDIXMLSegment(FEDIDataObjects[High(FEDIDataObjects)]);

    if FSTSegment.Attributes.GetAttributeValue(XMLAttribute_Id) = XMLTag_TSHSegmentId then
    begin
      TempData := FEDIDataObjects[0].Assemble;
      FreeAndNil(FEDIDataObjects[0]);
      //
      FSTSegment := TEDIXMLTransactionSetSegment.Create(Self);
      FSTSegment.Data := TempData;
      FSTSegment.Disassemble;
      //
      FEDIDataObjects[0] := FSTSegment;
    end
    else
    begin
      FSTSegment := nil;
      raise EJclEDIError.CreateRes(@EDIXMLError059);
    end;

    if FSESegment.Attributes.GetAttributeValue(XMLAttribute_Id) = XMLTag_TSTSegmentId then
    begin
      TempData := FEDIDataObjects[High(FEDIDataObjects)].Assemble;
      FreeAndNil(FEDIDataObjects[High(FEDIDataObjects)]);
      //
      FSESegment := TEDIXMLTransactionSetSegment.Create(Self);
      FSESegment.Data := TempData;
      FSESegment.Disassemble;
      //
      FEDIDataObjects[High(FEDIDataObjects)] := FSESegment;
    end
    else
    begin
      FSESegment := nil;
      raise EJclEDIError.CreateRes(@EDIXMLError060);
    end;
  end
  else
  begin
    FSTSegment := nil;
    FSESegment := nil;
    raise EJclEDIError.CreateRes(@EDIXMLError061);
  end;
  FData := '';
  //
  FState := ediDisassembled;
end;

function TEDIXMLTransactio

⌨️ 快捷键说明

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