X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fshared%2Fxdynrec.pas;h=ac55cf5d0360202e28589c97e5525e71253dc3e2;hb=b0369ee9442a79c9ace3454e7e1709cd61ed6a8e;hp=8ebac36188754ef6349bbb7bbc5147a1a0ccfe7a;hpb=0c5455dd0914c9a9466668f3231c20ebb2f80522;p=d2df-sdl.git diff --git a/src/shared/xdynrec.pas b/src/shared/xdynrec.pas index 8ebac36..ac55cf5 100644 --- a/src/shared/xdynrec.pas +++ b/src/shared/xdynrec.pas @@ -110,6 +110,7 @@ type function addListItem (rec: TDynRecord): Boolean; inline; public + { type TListEnumerator = record private @@ -121,6 +122,7 @@ type function getCurrent (): TDynRecord; inline; property Current: TDynRecord read getCurrent; end; + } public constructor Create (const aname: AnsiString; atype: TType); @@ -145,7 +147,7 @@ type procedure setValue (const s: AnsiString); - function GetEnumerator (): TListEnumerator; + function GetEnumerator (): TDynRecList.TEnumerator; inline; public property pasname: AnsiString read mPasName; @@ -245,6 +247,9 @@ type // number of records of the given instance function instanceCount (const typename: AnsiString): Integer; + procedure setUserField (const fldname: AnsiString; v: LongInt); + procedure setUserField (const fldname: AnsiString; v: AnsiString); + public property id: AnsiString read mId; // for map parser property pasname: AnsiString read mPasName; @@ -358,6 +363,7 @@ function StrEqu (const a, b: AnsiString): Boolean; inline; begin result := (a = // ////////////////////////////////////////////////////////////////////////// // +{ constructor TDynField.TListEnumerator.Create (alist: TDynRecList); begin mList := alist; @@ -376,11 +382,13 @@ function TDynField.TListEnumerator.getCurrent (): TDynRecord; inline; begin result := mList[mCurIdx]; end; +} -function TDynField.GetEnumerator (): TListEnumerator; +function TDynField.GetEnumerator (): TDynRecList.TEnumerator; inline; begin - result := TListEnumerator.Create(mRVal); + //result := TListEnumerator.Create(mRVal); + if (mRVal <> nil) then result := mRVal.GetEnumerator else result := TDynRecList.TEnumerator.Create(nil, 0); end; @@ -1927,6 +1935,56 @@ begin end; +procedure TDynRecord.setUserField (const fldname: AnsiString; v: LongInt); +var + fld: TDynField; +begin + if (Length(fldname) = 0) then exit; + fld := field[fldname]; + if (fld <> nil) then + begin + if (fld.mType <> fld.TType.TInt) or (fld.mEBS <> fld.TEBS.TNone) then + begin + raise Exception.Create(Format('invalid user field ''%s'' type', [fld.name])); + end; + end + else + begin + fld := TDynField.Create(fldname, fld.TType.TInt); + fld.mOwner := self; + fld.mIVal := v; + fld.mInternal := true; + fld.mDefined := true; + addField(fld); + end; +end; + + +procedure TDynRecord.setUserField (const fldname: AnsiString; v: AnsiString); +var + fld: TDynField; +begin + if (Length(fldname) = 0) then exit; + fld := field[fldname]; + if (fld <> nil) then + begin + if (fld.mType <> fld.TType.TString) or (fld.mEBS <> fld.TEBS.TNone) then + begin + raise Exception.Create(Format('invalid user field ''%s'' type', [fld.name])); + end; + end + else + begin + fld := TDynField.Create(fldname, fld.TType.TString); + fld.mOwner := self; + fld.mSVal := v; + fld.mInternal := true; + fld.mDefined := true; + addField(fld); + end; +end; + + procedure TDynRecord.parseDef (pr: TTextParser); var fld: TDynField;