X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fshared%2Fxdynrec.pas;h=12d7256429d473c5f46061d7a7fe4084d2251f97;hb=96165a1a95f0ea18a20dd8578fade4b46ec23746;hp=8ebac36188754ef6349bbb7bbc5147a1a0ccfe7a;hpb=923fa980434e55419f35422119af2faae2bf68d7;p=d2df-sdl.git diff --git a/src/shared/xdynrec.pas b/src/shared/xdynrec.pas index 8ebac36..12d7256 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,10 @@ 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); + procedure setUserField (const fldname: AnsiString; v: Boolean); + public property id: AnsiString read mId; // for map parser property pasname: AnsiString read mPasName; @@ -358,6 +364,7 @@ function StrEqu (const a, b: AnsiString): Boolean; inline; begin result := (a = // ////////////////////////////////////////////////////////////////////////// // +{ constructor TDynField.TListEnumerator.Create (alist: TDynRecList); begin mList := alist; @@ -376,11 +383,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 +1936,81 @@ 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.setUserField (const fldname: AnsiString; v: Boolean); +var + fld: TDynField; +begin + if (Length(fldname) = 0) then exit; + fld := field[fldname]; + if (fld <> nil) then + begin + if (fld.mType <> fld.TType.TBool) 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.TBool); + fld.mOwner := self; + fld.mIVal := Integer(v); + fld.mInternal := true; + fld.mDefined := true; + addField(fld); + end; +end; + + procedure TDynRecord.parseDef (pr: TTextParser); var fld: TDynField;