📄 jcledi_unedifact.pas
字号:
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 + -