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

📄 jcledi_unedifact.pas

📁 East make Tray Icon in delphi
💻 PAS
📖 第 1 页 / 共 5 页
字号:
    if not Assigned(FDelimiters) then
      raise EJclEDIError.CreateRes(@RsEDIError019);
  end;
  // Find Functional Group Header Segment
  StartPos := 1;
  // Search for Functional Group Header
  if UNGSegmentId + FDelimiters.ED = Copy(FData, 1, Length(UNGSegmentId + FDelimiters.ED)) then
  begin
    // Search for Functional Group Header Segment Terminator
    SearchResult := StrSearch(FDelimiters.SD, FData, 1);
    if (SearchResult - StartPos) > 0 then // data exists
    begin
      FUNGSegment.Data := Copy(FData, 1, (SearchResult + FDelimiters.SDLen) - 1);
      FUNGSegment.Disassemble;
    end
    else
      raise EJclEDIError.CreateRes(@RsEDIError021);
  end
  else
    raise EJclEDIError.CreateRes(@RsEDIError022);
  // Search for Message Header
  SearchResult := StrSearch(FDelimiters.SD + UNHSegmentId + FDelimiters.ED, FData, StartPos);
  if SearchResult <= 0 then
    raise EJclEDIError.CreateRes(@RsEDIError032);
  // Set next start position
  StartPos := SearchResult + FDelimiters.SDLen; // Move past the delimiter
  // Continue
  while SearchResult <> 0 do
  begin
    // Search for Message Trailer
    SearchResult := StrSearch(FDelimiters.SD + UNTSegmentId + FDelimiters.ED, FData, StartPos);
    if SearchResult <> 0 then
    begin
      // Set the next start position
      SearchResult := SearchResult + FDelimiters.SDLen; // Move past the delimiter
      // Search for the end of Message Trailer
      SearchResult := StrSearch(FDelimiters.SD, FData, SearchResult);
      if SearchResult <> 0 then
      begin
        I := AddMessage;
        FEDIDataObjects[I].Data :=
          Copy(FData, StartPos, ((SearchResult - StartPos) + FDelimiters.SDLen));
        FEDIDataObjects[I].Disassemble;
      end
      else
        raise EJclEDIError.CreateRes(@RsEDIError033);
    end
    else
      raise EJclEDIError.CreateRes(@RsEDIError034);
    // Set the next start position
    StartPos := SearchResult + FDelimiters.SDLen; // Move past the delimiter
    //
    // Verify the next record is a Message Header
    if (UNHSegmentId + FDelimiters.ED) <>
      Copy(FData, StartPos, (Length(UNHSegmentId) + FDelimiters.EDLen)) then
      Break;
  end;
  // Set the next start position
  StartPos := SearchResult + FDelimiters.SDLen; // Move past the delimiter
  // Find Functional Group Trailer Segment
  if (UNESegmentId + FDelimiters.ED) =
    Copy(FData, StartPos, Length(UNESegmentId + FDelimiters.ED)) then
  begin
    // Find Functional Group Trailer Segment Terminator
    SearchResult := StrSearch(FDelimiters.SD, FData, StartPos + FDelimiters.SDLen);
    if (SearchResult - StartPos) > 0 then // data exists
    begin
      FUNESegment.Data := Copy(FData, StartPos, (SearchResult + FDelimiters.SDLen));
      FUNESegment.Disassemble;
    end
    else
      raise EJclEDIError.CreateRes(@RsEDIError023);
  end
  else
    raise EJclEDIError.CreateRes(@RsEDIError024);
  FData := '';
  FState := ediDisassembled;
end;

function TEDIFunctionalGroup.GetMessage(Index: Integer): TEDIMessage;
begin
  Result := TEDIMessage(GetEDIDataObject(Index));
end;

function TEDIFunctionalGroup.InsertMessage(InsertIndex: Integer): Integer;
begin
  Result := InsertEDIDataObject(InsertIndex);
end;

function TEDIFunctionalGroup.InsertMessage(InsertIndex: Integer;
  Message: TEDIMessage): Integer;
begin
  Result := InsertEDIDataObject(InsertIndex, Message);
end;

function TEDIFunctionalGroup.InsertMessages(InsertIndex: Integer;
  MessageArray: TEDIMessageArray): Integer;
begin
  Result := InsertEDIDataObjects(InsertIndex, TEDIDataObjectArray(MessageArray));
end;

function TEDIFunctionalGroup.InsertMessages(InsertIndex, Count: Integer): Integer;
begin
  Result := InsertEDIDataObjects(InsertIndex, Count);
end;

function TEDIFunctionalGroup.InternalAssignDelimiters: TEDIDelimiters;
begin
  Result := nil;
  // Attempt to assign the delimiters
  if not Assigned(FDelimiters) then
    if Assigned(Parent) and (Parent is TEDIInterchangeControl) then
      Result := Parent.Delimiters;
end;

function TEDIFunctionalGroup.InternalCreateMessage: TEDIMessage;
begin
  Result := TEDIMessage.Create(Self);
end;

procedure TEDIFunctionalGroup.InternalCreateHeaderTrailerSegments;
begin
  FUNGSegment := TEDIFunctionalGroupSegment.Create(Self);
  FUNESegment := TEDIFunctionalGroupSegment.Create(Self);
end;

procedure TEDIFunctionalGroup.SetMessage(Index: Integer; Message: TEDIMessage);
begin
  SetEDIDataObject(Index, Message);
end;

procedure TEDIFunctionalGroup.SetUNESegment(const UNESegment: TEDIFunctionalGroupSegment);
begin
  FreeAndNil(FUNESegment);
  FUNESegment := UNESegment;
  if Assigned(FUNESegment) then
    FUNESegment.Parent := Self;
end;

procedure TEDIFunctionalGroup.SetUNGSegment(const UNGSegment: TEDIFunctionalGroupSegment);
begin
  FreeAndNil(FUNGSegment);
  FUNGSegment := UNGSegment;
  if Assigned(FUNGSegment) then
    FUNGSegment.Parent := Self;
end;

function TEDIFunctionalGroup.InternalCreateEDIDataObject: TEDIDataObject;
begin
  Result := InternalCreateMessage;
end;

//=== { TEDIInterchangeControl } =============================================

constructor TEDIInterchangeControl.Create(Parent: TEDIDataObject; FunctionalGroupCount: Integer);
begin
  if Assigned(Parent) and (Parent is TEDIFile) then
    inherited Create(Parent, FunctionalGroupCount)
  else
    inherited Create(nil, FunctionalGroupCount);
  FEDIDOT := ediInterchangeControl;
  InternalCreateHeaderTrailerSegments;
  FCreateObjectType := ediFunctionalGroup;
end;

destructor TEDIInterchangeControl.Destroy;
begin
  FUNASegment.Free;
  FUNBSegment.Free;
  FUNZSegment.Free;
  FreeAndNil(FDelimiters);
  inherited Destroy;
end;

function TEDIInterchangeControl.AddFunctionalGroup: Integer;
begin
  FCreateObjectType := ediFunctionalGroup;
  Result := AddEDIDataObject;
end;

function TEDIInterchangeControl.AddFunctionalGroups(Count: Integer): Integer;
begin
  FCreateObjectType := ediFunctionalGroup;
  Result := AddEDIDataObjects(Count);
end;

function TEDIInterchangeControl.AppendFunctionalGroup(
  FunctionalGroup: TEDIFunctionalGroup): Integer;
begin
  FCreateObjectType := ediFunctionalGroup;
  Result := AppendEDIDataObject(FunctionalGroup);
end;

function TEDIInterchangeControl.AppendFunctionalGroups(
  FunctionalGroupArray: TEDIFunctionalGroupArray): Integer;
begin
  Result := AppendEDIDataObjects(TEDIDataObjectArray(FunctionalGroupArray));
end;

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

  if not Assigned(FDelimiters) then
    raise EJclEDIError.CreateRes(@RsEDIError013);

  FData := FUNBSegment.Assemble;
  FUNBSegment.Data := '';

  if GetCount > 0 then
    for I := 0 to GetCount - 1 do
      if Assigned(FEDIDataObjects[I]) then
        FData := FData + FEDIDataObjects[I].Assemble;

  DeleteEDIDataObjects;

  FData := FData + FUNZSegment.Assemble;
  FUNZSegment.Data := '';

  FLength := Length(FData);
  Result := FData;

  FState := ediAssembled;
end;

procedure TEDIInterchangeControl.Disassemble;
var
  I, StartPos, SearchResult: Integer;
begin
  FUNBSegment.Data := '';
  FUNBSegment.DeleteElements;
  FUNZSegment.Data := '';
  FUNZSegment.DeleteElements;
  DeleteEDIDataObjects;

  if not Assigned(FDelimiters) then
    raise EJclEDIError.CreateRes(@RsEDIError012);

  StartPos := 1;
  // Search for Interchange Control Header    
  if UNBSegmentId + FDelimiters.ED = Copy(FData, 1, Length(UNBSegmentId + FDelimiters.ED)) then
  begin
    SearchResult := StrSearch(FDelimiters.SD, FData, StartPos);
    if (SearchResult - StartPos) > 0 then // data exists
    begin
      FUNBSegment.Data := Copy(FData, 1, (SearchResult + FDelimiters.SDLen) - 1);
      FUNBSegment.Disassemble;
    end
    else
      raise EJclEDIError.CreateRes(@RsEDIError014);
  end
  else
    raise EJclEDIError.CreateRes(@RsEDIError015);
  // Search for Functional Group Header
  SearchResult := StrSearch(FDelimiters.SD + UNGSegmentId + FDelimiters.ED, FData, StartPos);
  if SearchResult > 0 then
  begin
    // Set next start positon
    StartPos := SearchResult + FDelimiters.SDLen; // Move past the delimiter
    // Continue
    while ((StartPos + Length(UNGSegmentId)) < Length(FData)) and (SearchResult > 0) do
    begin
      // Search for Functional Group Trailer
      SearchResult := StrSearch(FDelimiters.SD + UNESegmentId + FDelimiters.ED, FData, StartPos);
      if SearchResult > 0 then
      begin
        // Set next start positon
        SearchResult := SearchResult + FDelimiters.SDLen; // Move past the delimiter
        // Search for end of Functional Group Trailer Segment Terminator
        SearchResult := StrSearch(FDelimiters.SD, FData, SearchResult);
        if SearchResult > 0 then
        begin
          I := AddFunctionalGroup;
          FEDIDataObjects[I].Data :=
            Copy(FData, StartPos, ((SearchResult - StartPos) + FDelimiters.SDLen));
          FEDIDataObjects[I].Disassemble;
        end
        else
          raise EJclEDIError.CreateRes(@RsEDIError023);
      end
      else
        raise EJclEDIError.CreateRes(@RsEDIError024);
      // Set next start positon
      StartPos := SearchResult + FDelimiters.SDLen; // Move past the delimiter
      // Verify the next record is a Functional Group Header
      if (UNGSegmentId + FDelimiters.ED) <>
        Copy(FData, StartPos, (Length(UNGSegmentId) + FDelimiters.EDLen)) then
        Break;
    end;
  end
  else
  begin
    // Search for Message Header
    SearchResult := StrSearch(FDelimiters.SD + UNHSegmentId + FDelimiters.ED, FData, StartPos);
    if SearchResult <= 0 then
      raise EJclEDIError.CreateRes(@RsEDIError032);
    // Set next start position
    StartPos := SearchResult + FDelimiters.SDLen; // Move past the delimiter
    // Continue
    while SearchResult <> 0 do
    begin
      // Search for Message Trailer
      SearchResult := StrSearch(FDelimiters.SD + UNTSegmentId + FDelimiters.ED, FData, StartPos);
      if SearchResult <> 0 then
      begin
        // Set the next start position
        SearchResult := SearchResult + FDelimiters.SDLen; // Move past the delimiter
        // Search for the end of Message Trailer
        SearchResult := StrSearch(FDelimiters.SD, FData, SearchResult);
        if SearchResult <> 0 then
        begin
          I := AddMessage;
          FEDIDataObjects[I].Data :=
            Copy(FData, StartPos, ((SearchResult - StartPos) + FDelimiters.SDLen));
          FEDIDataObjects[I].Disassemble;
        end
        else
          raise EJclEDIError.CreateRes(@RsEDIError033);
      end
      else
        raise EJclEDIError.CreateRes(@RsEDIError034);
      // Set the next start position
      StartPos := SearchResult + FDelimiters.SDLen; // Move past the delimiter
      // Verify the next record is a Message Header
      if (UNHSegmentId + FDelimiters.ED) <>
        Copy(FData, StartPos, (Length(UNHSegmentId) + FDelimiters.EDLen)) then
        Break;
    end;
  end;
  // Verify the next record is a Interchange Control Trailer
  if (UNZSegmentId + FDelimiters.ED) =
    Copy(FData, StartPos, Length(UNZSegmentId + FDelimiters.ED)) then
  begin
    // Search for the end of Interchange Control Trailer Segment Terminator
    SearchResult := StrSearch(FDelimiters.SD, FData, StartPos);
    if (SearchResult - StartPos) > 0 then // data exists
    begin
      FUNZSegment.Data := Copy(FData, StartPos, (SearchResult + FDelimiters.SDLen));
      FUNZSegment.Disassemble;
    end
    else
      raise EJclEDIError.CreateRes(@RsEDIError016);
  end
  else
    raise EJclEDIError.CreateRes(@RsEDIError017);
  FData := '';

  FState := ediDisassembled;
end;

function TEDIInterchangeControl.InsertFunctionalGroup(InsertIndex: Integer;
  FunctionalGroup: TEDIFunctionalGroup): Integer;
begin
  Result := InsertEDIDataObject(InsertIndex, FunctionalGroup);
end;

function TEDIInterchangeControl.InsertFunctionalGroup(InsertIndex: Integer): Integer;
begin
  FCreateObjectType := ediFunctionalGroup;
  Result := InsertEDIDataObject(InsertIndex);
end;

function TEDIInterchangeControl.InsertFunctionalGroups(InsertIndex, Count: Integer): Integer;
begin
  FCreateObjectType := ediFunctionalGroup;
  Result := InsertEDIDataObjects(InsertIndex, Count);
end;

function TEDIInterchangeControl.InsertFunctionalGroups(InsertIndex: Integer;
  FunctionalGroupArray: TEDIFunctionalGroupArray): Integer;
begin
  Result := InsertEDIDataObjects(InsertIndex, TEDIDataObjectArray(FunctionalGroupArray));
end;

function TEDIInterchangeControl.InternalCreateFunctionalGroup: TEDIFunctionalGroup;
begin
  Result := TEDIFunctionalGroup.Create(Self);
end;

⌨️ 快捷键说明

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