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

📄 jcledi_unedifact.pas

📁 East make Tray Icon in delphi
💻 PAS
📖 第 1 页 / 共 5 页
字号:
procedure TEDIInterchangeControl.InternalCreateHeaderTrailerSegments;
begin
  FUNASegment := TEDIInterchangeControlSegment.Create(Self);
  FUNBSegment := TEDIInterchangeControlSegment.Create(Self);
  FUNZSegment := TEDIInterchangeControlSegment.Create(Self);
end;

procedure TEDIInterchangeControl.SetUNZSegment(const UNZSegment: TEDIInterchangeControlSegment);
begin
  FreeAndNil(FUNZSegment);
  FUNZSegment := UNZSegment;
  if Assigned(FUNZSegment) then
    FUNZSegment.Parent := Self;
end;

procedure TEDIInterchangeControl.SetUNBSegment(const UNBSegment: TEDIInterchangeControlSegment);
begin
  FreeAndNil(FUNBSegment);
  FUNBSegment := UNBSegment;
  if Assigned(FUNBSegment) then
    FUNBSegment.Parent := Self;
end;

function TEDIInterchangeControl.InternalCreateEDIDataObject: TEDIDataObject;
begin
  case FCreateObjectType of
    ediFunctionalGroup:
      Result := InternalCreateFunctionalGroup;
    ediMessage:
      Result := InternalCreateMessage;
  else
    Result := nil;
  end;
end;

function TEDIInterchangeControl.InternalAssignDelimiters: TEDIDelimiters;
begin
  Result := nil;
end;

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

function TEDIInterchangeControl.AddMessage: Integer;
begin
  FCreateObjectType := ediMessage;
  Result := AddEDIDataObject;
end;

function TEDIInterchangeControl.AddMessages(Count: Integer): Integer;
begin
  FCreateObjectType := ediMessage;
  Result := AddEDIDataObjects(Count);
end;

function TEDIInterchangeControl.AppendMessage(Message: TEDIMessage): Integer;
begin
  FCreateObjectType := ediMessage;
  Result := AppendEDIDataObject(Message);
end;

function TEDIInterchangeControl.AppendMessages(MessageArray: TEDIMessageArray): Integer;
begin
  Result := AppendEDIDataObjects(TEDIDataObjectArray(MessageArray));
end;

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

function TEDIInterchangeControl.InsertMessage(InsertIndex: Integer): Integer;
begin
  FCreateObjectType := ediMessage;
  Result := InsertEDIDataObject(InsertIndex);
end;

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

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

//=== { TEDIFile } ===========================================================

constructor TEDIFile.Create(Parent: TEDIDataObject; InterchangeCount: Integer);
begin
  if Assigned(Parent) then
    inherited Create(Parent, InterchangeCount)
  else
    inherited Create(nil, InterchangeCount);
  FEDIFileOptions := [foVariableDelimiterDetection, foRemoveCrLf, foRemoveCr, foRemoveLf];
  FEDIDOT := ediFile;
end;

destructor TEDIFile.Destroy;
begin
  inherited Destroy;
end;

function TEDIFile.AddInterchange: Integer;
begin
  Result := AddEDIDataObject;
end;

function TEDIFile.AddInterchanges(Count: Integer): Integer;
begin
  Result := AddEDIDataObjects(Count);
end;

function TEDIFile.AppendInterchange(Interchange: TEDIInterchangeControl): Integer;
begin
  Result := AppendEDIDataObject(Interchange);
end;

function TEDIFile.AppendInterchanges(InterchangeControlArray: TEDIInterchangeControlArray): Integer;
begin
  Result := AppendEDIDataObjects(TEDIDataObjectArray(InterchangeControlArray));
end;

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

  if GetCount > 0 then
    for I := 0 to GetCount - 1 do
    begin
      if Assigned(FEDIDataObjects[I]) then
      begin
        EDIInterchangeControl := TEDIInterchangeControl(FEDIDataObjects[I]);
        if EDIInterchangeControl.SegmentUNA.EDIDataObjectCount > 0 then
        begin
          FData := FData + EDIInterchangeControl.SegmentUNA.Assemble;
          EDIInterchangeControl.SegmentUNA.Data := '';
        end;
        FData := FData + FEDIDataObjects[I].Assemble;
      end;
      FEDIDataObjects[I].Data := '';
    end;

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

  DeleteInterchanges;

  FState := ediAssembled;
end;

procedure TEDIFile.DeleteInterchange(Index: Integer);
begin
  DeleteEDIDataObject(Index);
end;

procedure TEDIFile.DeleteInterchanges(Index, Count: Integer);
begin
  DeleteEDIDataObjects(Index, Count);
end;

procedure TEDIFile.DeleteInterchanges;
begin
  DeleteEDIDataObjects;
end;

procedure TEDIFile.Disassemble;
var
  I, StartPos, SearchResult: Integer;
  UNASegmentData: string;
begin
  DeleteInterchanges;

  if not Assigned(FDelimiters) then
  begin
    FDelimiters := InternalAssignDelimiters;
    FEDIFileOptions := FEDIFileOptions + [foVariableDelimiterDetection];
  end;

  if foRemoveCrLf in FEDIFileOptions then
    {$IFDEF OPTIMIZED_STRINGREPLACE}
    FData := JclEDI.StringReplace(FData, AnsiCrLf, '', [rfReplaceAll]);
    {$ELSE}
    FData := SysUtils.StringReplace(FData, AnsiCrLf, '', [rfReplaceAll]);
    {$ENDIF OPTIMIZED_INTERNAL_STRUCTURE}
  if foRemoveCr in FEDIFileOptions then
    {$IFDEF OPTIMIZED_STRINGREPLACE}
    FData := JclEDI.StringReplace(FData, AnsiCarriageReturn, '', [rfReplaceAll]);
    {$ELSE}
    FData := SysUtils.StringReplace(FData, AnsiCarriageReturn, '', [rfReplaceAll]);
    {$ENDIF OPTIMIZED_STRINGREPLACE}
  if foRemoveLf in FEDIFileOptions then
    {$IFDEF OPTIMIZED_STRINGREPLACE}
    FData := JclEDI.StringReplace(FData, AnsiLineFeed, '', [rfReplaceAll]);
    {$ELSE}
    FData := SysUtils.StringReplace(FData, AnsiLineFeed, '', [rfReplaceAll]);
    {$ENDIF OPTIMIZED_STRINGREPLACE}

  StartPos := 1;
  if UNASegmentId = Copy(FData, StartPos, Length(UNASegmentId)) then
  begin
    if foVariableDelimiterDetection in FEDIFileOptions then
      InternalDelimitersDetection(StartPos);
    SearchResult := StrSearch(FDelimiters.SD + UNBSegmentId + FDelimiters.ED, FData, StartPos);
    UNASegmentData := Copy(FData, StartPos, (SearchResult - StartPos) + FDelimiters.SDLen);
    StartPos := SearchResult + FDelimiters.SDLen;    
  end
  else
  if UNBSegmentId = Copy(FData, StartPos, Length(UNBSegmentId)) then
  begin
    if foVariableDelimiterDetection in FEDIFileOptions then
      InternalAlternateDelimitersDetection(StartPos);
  end
  else
    raise EJclEDIError.CreateRes(@RsEDIError015);

  // Continue
  while (StartPos + Length(UNBSegmentId)) < Length(FData) do
  begin
    // Search for Interchange Control Trailer
    SearchResult := StrSearch(FDelimiters.SD + UNZSegmentId + FDelimiters.ED, FData, StartPos);
    if SearchResult > 0 then
    begin
      SearchResult := SearchResult + FDelimiters.SDLen; // Move past the delimiter
      // Search for the end of Interchange Control Trailer
      SearchResult := StrSearch(FDelimiters.SD, FData, SearchResult);
      if SearchResult > 0 then
      begin
        I := AddInterchange;
        FEDIDataObjects[I].Delimiters :=
          TEDIDelimiters.Create(FDelimiters.SD, FDelimiters.ED, FDelimiters.SS);
        TEDIInterchangeControl(FEDIDataObjects[I]).SegmentUNA.Data := UNASegmentData;
        TEDIInterchangeControl(FEDIDataObjects[I]).SegmentUNA.Disassemble;
        FEDIDataObjects[I].Data :=
          Copy(FData, StartPos, ((SearchResult - StartPos) + FDelimiters.SDLen));
        FEDIDataObjects[I].Disassemble;
      end
      else
        raise EJclEDIError.CreateRes(@RsEDIError016);
    end
    else
      raise EJclEDIError.CreateRes(@RsEDIError017);
    // Set next start position, Move past the delimiter
    StartPos := SearchResult + FDelimiters.SDLen;
    //
    if UNASegmentId = Copy(FData, StartPos, Length(UNASegmentId)) then
    begin
      if foVariableDelimiterDetection in FEDIFileOptions then
        InternalDelimitersDetection(StartPos);
      SearchResult := StrSearch(FDelimiters.SD + UNBSegmentId + FDelimiters.ED, FData, StartPos);
      UNASegmentData := Copy(FData, StartPos, (SearchResult - StartPos) + FDelimiters.SDLen);
      StartPos := SearchResult + FDelimiters.SDLen;
    end
    else
    if UNBSegmentId = Copy(FData, StartPos, Length(UNBSegmentId)) then
    begin
      if foVariableDelimiterDetection in FEDIFileOptions then
        InternalAlternateDelimitersDetection(StartPos);
    end
    else
    if (StartPos + Length(UNBSegmentId)) < Length(FData) then
    begin
      if foIgnoreGarbageAtEndOfFile in FEDIFileOptions then
        Break
      else
        raise EJclEDIError.CreateRes(@RsEDIError018);
    end;
  end;
  FData := '';
  FState := ediDisassembled;
end;

function TEDIFile.GetInterchangeControl(Index: Integer): TEDIInterchangeControl;
begin
  Result := TEDIInterchangeControl(GetEDIDataObject(Index));
end;

function TEDIFile.InsertInterchange(InsertIndex: Integer;
  Interchange: TEDIInterchangeControl): Integer;
begin
  Result := InsertEDIDataObject(InsertIndex, Interchange);
end;

function TEDIFile.InsertInterchange(InsertIndex: Integer): Integer;
begin
  Result := InsertEDIDataObject(InsertIndex);
end;

function TEDIFile.InsertInterchanges(InsertIndex, Count: Integer): Integer;
begin
  Result := InsertEDIDataObjects(InsertIndex, Count);
end;

function TEDIFile.InsertInterchanges(InsertIndex: Integer;
  InterchangeControlArray: TEDIInterchangeControlArray): Integer;
begin
  Result := InsertEDIDataObjects(InsertIndex, TEDIDataObjectArray(InterchangeControlArray));
end;

procedure TEDIFile.InternalLoadFromFile;
var
  EDIFileStream: TFileStream;
begin
  FData := '';
  if FFileName <> '' then
  begin
    EDIFileStream := TFileStream.Create(FFileName, fmOpenRead or fmShareDenyNone);
    try
      SetLength(FData, EDIFileStream.Size);
      EDIFileStream.Read(Pointer(FData)^, EDIFileStream.Size);
    finally
      EDIFileStream.Free;
    end;
  end
  else
    raise EJclEDIError.CreateRes(@RsEDIError001);
end;

procedure TEDIFile.LoadFromFile(const FileName: string);
begin
  FFileName := FileName;
  InternalLoadFromFile;
end;

procedure TEDIFile.ReLoadFromFile;
begin
  InternalLoadFromFile;
end;

procedure TEDIFile.SaveAsToFile(const FileName: string);
var
  EDIFileStream: TFileStream;
begin
  FFileName := FileName;
  if FFileName <> '' then
  begin
    EDIFileStream := TFileStream.Create(FFileName, fmCreate or fmShareDenyNone);
    try
      EDIFileStream.Write(Pointer(FData)^, Length(FData));
    finally
      EDIFileStream.Free;
    end;
  end
  else
    raise EJclEDIError.CreateRes(@RsEDIError002);
end;

procedure TEDIFile.SaveToFile;
var
  EDIFileStream: TFileStream;
begin
  if FFileName <> '' then
  begin
    EDIFileStream := TFileStream.Create(FFileName, fmCreate or fmShareDenyNone);
    try
      EDIFileStream.Write(Pointer(FData)^, Length(FData));
    finally
      EDIFileStream.Free;
    end;
  end
  else
    raise EJclEDIError.CreateRes(@RsEDIError002);
end;

procedure TEDIFile.SetInterchangeControl(Index: Integer; Interchange: TEDIInterchangeControl);
begin
  SetEDIDataObject(Index, Interchange);
end;

procedure TEDIFile.InternalDelimitersDetection(

⌨️ 快捷键说明

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