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

📄 jcledi_unedifact.pas

📁 East make Tray Icon in delphi
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  public
    constructor Create(Parent: TEDIDataObject; InterchangeCount: Integer = 0); reintroduce;
    destructor Destroy; override;

    procedure LoadFromFile(const FileName: string);
    procedure ReLoadFromFile;
    procedure SaveToFile;
    procedure SaveAsToFile(const FileName: string);

    function AddInterchange: Integer;
    function AppendInterchange(Interchange: TEDIInterchangeControl): Integer;
    function InsertInterchange(InsertIndex: Integer): Integer; overload;
    function InsertInterchange(InsertIndex: Integer;
      Interchange: TEDIInterchangeControl): Integer; overload;
    procedure DeleteInterchange(Index: Integer); overload;
    procedure DeleteInterchange(Interchange: TEDIInterchangeControl); overload;

    function AddInterchanges(Count: Integer): Integer;
    function AppendInterchanges(
      InterchangeControlArray: TEDIInterchangeControlArray): Integer;
    function InsertInterchanges(InsertIndex, Count: Integer): Integer; overload;
    function InsertInterchanges(InsertIndex: Integer;
      InterchangeControlArray: TEDIInterchangeControlArray): Integer; overload;
    procedure DeleteInterchanges; overload;
    procedure DeleteInterchanges(Index, Count: Integer); overload;

    function Assemble: string; override;
    procedure Disassemble; override;

    property Interchange[Index: Integer]: TEDIInterchangeControl read GetInterchangeControl
      write SetInterchangeControl; default;
    property Interchanges: TEDIDataObjectList read FEDIDataObjects;
  published
    property FileID: Integer read FFileID write FFileID;
    property FileName: string read FFileName write FFileName;
    property Options: TEDIFileOptions read FEDIFileOptions write FEDIFileOptions;
    property InterchangeControlCount: Integer read GetCount;
  end;

  TEDIFileArray = array of TEDIFile;  

implementation

uses
  JclResources, JclStrings;

//=== { TEDIElement } ========================================================

constructor TEDIElement.Create(Parent: TEDIDataObject);
begin
  if Assigned(Parent) and ((Parent is TEDISegment) or (Parent is TEDICompositeElement)) then
    inherited Create(Parent)
  else
    inherited Create(nil);
  FEDIDOT := ediElement;
end;

function TEDIElement.Assemble: string;
begin
  Result := FData;
  FState := ediAssembled;
end;

procedure TEDIElement.Disassemble;
begin
  FState := ediDisassembled;
end;

function TEDIElement.GetIndexPositionFromParent: Integer;
var
  I: Integer;
  EDISegment: TEDISegment;
  EDICompositeElement: TEDICompositeElement;
begin
  Result := -1;
  if Assigned(Parent) and (Parent is TEDISegment) then
  begin
    EDISegment := TEDISegment(Parent);
    for I := 0 to EDISegment.EDIDataObjectCount - 1 do
      if EDISegment.EDIDataObjects[I] = Self then
      begin
        Result := I;
        Break;
      end;
  end
  else
  if Assigned(Parent) and (Parent is TEDICompositeElement) then
  begin
    EDICompositeElement := TEDICompositeElement(Parent);
    for I := 0 to EDICompositeElement.EDIDataObjectCount - 1 do
      if EDICompositeElement.EDIDataObjects[I] = Self then
      begin
        Result := I;
        Break;
      end;
  end;
end;

//=== { TEDISegment } ========================================================

constructor TEDISegment.Create(Parent: TEDIDataObject; ElementCount: Integer);
begin
  if Assigned(Parent) and (Parent is TEDIMessage) then
    inherited Create(Parent, ElementCount)
  else
    inherited Create(nil, ElementCount);
  FSegmentID := '';
  FEDIDOT := ediSegment;
  FCreateObjectType := ediElement;
  //FSegmentIdData := T???.Create(Self);
end;

destructor TEDISegment.Destroy;
begin
  //FSegmentIdData.Free;
  inherited Destroy;
end;

function TEDISegment.AddElements(Count: Integer): Integer;
begin
  FCreateObjectType := ediElement;
  Result := AddEDIDataObjects(Count);
end;

function TEDISegment.AddElement: Integer;
begin
  FCreateObjectType := ediElement;
  Result := AddEDIDataObject;
end;

function TEDISegment.AppendElement(Element: TEDIElement): Integer;
begin
  Result := AppendEDIDataObject(Element);
end;

function TEDISegment.AppendElements(ElementArray: TEDIElementArray): Integer;
begin
  Result := AppendEDIDataObjects(TEDIDataObjectArray(ElementArray));
end;

function TEDISegment.Assemble: string;
var
  I: Integer;
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(@RsEDIError036);
  end;

  FData := FSegmentID;
  if GetCount > 0 then
    for I := 0 to GetCount - 1 do
      if Assigned(FEDIDataObjects[I]) then
        FData := FData + FDelimiters.ED + FEDIDataObjects[I].Assemble
      else
        FData := FData + FDelimiters.ED;
  FData := FData + FDelimiters.SD;
  FLength := Length(FData);
  Result := FData; // Return assembled string

  DeleteElements;

  FState := ediAssembled;
end;

procedure TEDISegment.DeleteElement(Index: Integer);
begin
  DeleteEDIDataObject(Index);
end;

procedure TEDISegment.DeleteElement(Element: TEDIElement);
begin
  DeleteEDIDataObject(Element);
end;

procedure TEDISegment.DeleteElements(Index, Count: Integer);
begin
  DeleteEDIDataObjects(Index, Count);
end;

procedure TEDISegment.DeleteElements;
begin
  DeleteEDIDataObjects;
end;

procedure TEDISegment.Disassemble;
var
  I, StartPos, SearchResult: Integer;
  ElementData: string;
begin
  // Data Input Scenarios
  // 4.)  SegID+data+data'
  // Composite Element Data Input Secnarios
  // 9.)  SegID+data+data:data'
  FSegmentID := '';
  DeleteElements;
  if not Assigned(FDelimiters) then // Attempt to assign the delimiters
  begin
    FDelimiters := InternalAssignDelimiters;
    if not Assigned(FDelimiters) then
      raise EJclEDIError.CreateRes(@RsEDIError035);
  end;
  // Continue
  StartPos := 1;
  SearchResult := StrSearch(FDelimiters.ED, FData, StartPos);
  FSegmentID := Copy(FData, 1, SearchResult - 1);
  StartPos := SearchResult + 1;
  SearchResult := StrSearch(FDelimiters.ED, FData, StartPos);
  while SearchResult <> 0 do
  begin
    ElementData := Copy(FData, ((StartPos + FDelimiters.EDLen) - 1), (SearchResult - StartPos));
    if StrSearch(FDelimiters.SS, ElementData, 1) <= 0 then
      I := AddElement
    else
      I := AddCompositeElement;
    if (SearchResult - StartPos) > 0 then // data exists
    begin
      FEDIDataObjects[I].Data := ElementData;
      FEDIDataObjects[I].Disassemble;
    end;
    StartPos := SearchResult + 1;
    SearchResult := StrSearch(FDelimiters.ED, FData, StartPos);
  end;
  // Get last element before next segment
  SearchResult := StrSearch(FDelimiters.SD, FData, StartPos);
  if SearchResult <> 0 then
    if (SearchResult - StartPos) > 0 then // data exists
    begin
      ElementData := Copy(FData, ((StartPos + FDelimiters.EDLen) - 1),
        (SearchResult - StartPos));
      if StrSearch(FDelimiters.SS, ElementData, 1) <= 0 then
        I := AddElement
      else
        I := AddCompositeElement;
      FEDIDataObjects[I].Data := ElementData;
      FEDIDataObjects[I].Disassemble;
    end;
  FData := '';

  FState := ediDisassembled;
end;

function TEDISegment.InsertElement(InsertIndex: Integer): Integer;
begin
  FCreateObjectType := ediElement;
  Result := InsertEDIDataObject(InsertIndex);
end;

function TEDISegment.InsertElement(InsertIndex: Integer; Element: TEDIElement): Integer;
begin
  Result := InsertEDIDataObject(InsertIndex, Element);
end;

function TEDISegment.InsertElements(InsertIndex: Integer; ElementArray: TEDIElementArray): Integer;
begin
  Result := InsertEDIDataObjects(InsertIndex, TEDIDataObjectArray(ElementArray));
end;

function TEDISegment.InsertElements(InsertIndex, Count: Integer): Integer;
begin
  FCreateObjectType := ediElement;
  Result := InsertEDIDataObjects(InsertIndex, Count);
end;

function TEDISegment.InternalAssignDelimiters: TEDIDelimiters;
begin
  Result := nil;
  if not Assigned(FDelimiters) then // Attempt to assign the delimiters
  begin
    // Get the delimiters from the Message
    if Assigned(Parent) and (Parent is TEDIMessage) then
    begin
      if Assigned(Parent.Delimiters) then
      begin
        Result := Parent.Delimiters;
        Exit;
      end;
      // Get the delimiters from the functional group
      if Assigned(Parent.Parent) and (Parent.Parent is TEDIFunctionalGroup) then
      begin
        if Assigned(Parent.Parent.Delimiters) then
        begin
          Result := Parent.Parent.Delimiters;
          Exit;
        end;
        // Get the delimiters from the interchange control header
        if Assigned(Parent.Parent.Parent) and (Parent.Parent.Parent is TEDIInterchangeControl) then
          Result := Parent.Parent.Parent.Delimiters;
      end;
    end;
  end;
end;

function TEDISegment.InternalCreateElement: TEDIElement;
begin
  Result := TEDIElement.Create(Self);
end;

function TEDISegment.InternalCreateEDIDataObject: TEDIDataObject;
begin
  case FCreateObjectType of
    ediElement:
      Result := InternalCreateElement;
    ediCompositeElement:
      Result := InternalCreateCompositeElement;
  else
    Result := nil;
  end;
end;

function TEDISegment.InternalCreateCompositeElement: TEDICompositeElement;
begin
  Result := TEDICompositeElement.Create(Self);
end;

function TEDISegment.AddCompositeElement: Integer;
begin
  FCreateObjectType := ediCompositeElement;
  Result := AddEDIDataObject;
end;

function TEDISegment.AddCompositeElements(Count: Integer): Integer;
begin
  FCreateObjectType := ediCompositeElement;
  Result := AddEDIDataObjects(Count);
end;

function TEDISegment.AppendCompositeElement(CompositeElement: TEDICompositeElement): Integer;
begin
  Result := AppendEDIDataObject(CompositeElement);
end;

function TEDISegment.AppendCompositeElements(
  CompositeElementArray: TEDICompositeElementArray): Integer;
begin
  Result := AppendEDIDataObjects(TEDIDataObjectArray(CompositeElementArray));
end;

function TEDISegment.InsertCompositeElement(InsertIndex: Integer): Integer;
begin
  FCreateObjectType := ediCompositeElement;
  Result := InsertEDIDataObject(InsertIndex);
end;

function TEDISegment.InsertCompositeElement(InsertIndex: Integer;
  CompositeElement: TEDICompositeElement): Integer;
begin
  Result := InsertEDIDataObject(InsertIndex, CompositeElement);
end;

function TEDISegment.InsertCompositeElements(InsertIndex, Count: Integer): Integer;
begin
  FCreateObjectType := ediCompositeElement;
  Result := InsertEDIDataObjects(InsertIndex, Count);
end;

function TEDISegment.InsertCompositeElements(InsertIndex: Integer;
  CompositeElementArray: TEDICompositeElementArray): Integer;
begin
  Result := InsertEDIDataObjects(InsertIndex, TEDIDataObjectArray(CompositeElementArray));
end;

//=== { TEDIMessageSegment } =================================================

constructor TEDIMessageSegment.Create(Parent: TEDIDataObject; ElementCount: Integer);
begin
  inherited Create(Parent, ElementCount);
  if Assigned(Parent) and (Parent is TEDIMessage) then
    FParent := Parent;
end;

function TEDIMessageSegment.InternalAssignDelimiters: TEDIDelimiters;
begin
  Result := inherited InternalAssignDelimiters;
end;

//=== { TEDIFunctionalGroupSegment } =========================================

⌨️ 快捷键说明

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