diff --git a/src/shared/xdynrec.pas b/src/shared/xdynrec.pas
index cdabf24010918c630a1ac82e8e2f6a4c1daeb6ec..e56266351a060fd6e0dad26351a58c1e6af99ed2 100644 (file)
--- a/src/shared/xdynrec.pas
+++ b/src/shared/xdynrec.pas
private
mOwner: TDynRecord; // owner record
mName: AnsiString; // field name
+ mTip: AnsiString; // short tip
+ mHelp: AnsiString; // long help
mType: TType; // field type
mIVal: Integer; // for all integer types
mIVal2: Integer; // for point and size
// field value as Variant
property value: Variant read getVar write setVar;
+ property tip: AnsiString read mTip;
+ property help: AnsiString read mHelp;
+
public
// userdata (you can use these properties as you want to; they won't be written or read to files)
property tagInt: Integer read mTagInt write mTagInt;
mOwner: TDynMapDef;
mId: AnsiString;
mTypeName: AnsiString;
+ mTip: AnsiString; // short tip
+ mHelp: AnsiString; // long help
mSize: Integer;
mFields: TDynFieldList;
{$IF DEFINED(XDYNREC_USE_FIELDHASH)}
property headerRec: TDynRecord read mHeaderRec; // get header record for this one (header contains all other records, enums, bitsets, etc.)
property isHeader: Boolean read mHeader; // is this a header record?
+ property tip: AnsiString read mTip;
+ property help: AnsiString read mHelp;
+
public
// user fields; user can add arbitrary custom fields
// by default, any user field will be marked as "internal"
mOwner: TDynMapDef;
mIsEnum: Boolean;
mTypeName: AnsiString;
+ mTip: AnsiString; // short tip
+ mHelp: AnsiString; // long help
mIds: array of AnsiString;
mVals: array of Integer;
mMaxName: AnsiString; // MAX field
property isEnum: Boolean read mIsEnum; // is this enum? `false` means "bitset"
property has[const aname: AnsiString]: Boolean read hasByName;
property field[const aname: AnsiString]: Integer read getFieldByName;
+
+ property tip: AnsiString read mTip;
+ property help: AnsiString read mHelp;
end;
procedure TDynField.cleanup ();
begin
mName := '';
+ mTip := '';
+ mHelp := '';
mType := TType.TInt;
mIVal := 0;
mIVal2 := 0;
result.mOwner := mOwner;
if (newOwner <> nil) then result.mOwner := newOwner else result.mOwner := mOwner;
result.mName := mName;
+ result.mTip := mTip;
+ result.mHelp := mHelp;
result.mType := mType;
result.mIVal := mIVal;
result.mIVal2 := mIVal2;
asmonid: Boolean;
defech: AnsiChar;
xalias: AnsiString;
+ atip, ahelp: AnsiString;
begin
fldname := '';
fldtype := '';
lmaxdim := -1;
lebs := TDynField.TEBS.TNone;
xalias := '';
+ atip := '';
+ ahelp := '';
// field name
fldname := pr.expectStrOrId();
continue;
end;
+ if pr.eatId('tip') then
+ begin
+ if (Length(atip) > 0) then raise TDynParseException.CreateFmt(pr, 'duplicate tip definition for field ''%s''', [fldname]);
+ atip := pr.expectStr(false);
+ continue;
+ end;
+
+ if pr.eatId('help') then
+ begin
+ if (Length(ahelp) > 0) then raise TDynParseException.CreateFmt(pr, 'duplicate tip definition for field ''%s''', [fldname]);
+ ahelp := pr.expectStr(false);
+ continue;
+ end;
+
if pr.eatId('offset') then
begin
if (fldofs >= 0) then raise TDynParseException.CreateFmt(pr, 'duplicate field ''%s'' offset', [fldname]);
self.mWriteDef := writedef;
self.mInternal := ainternal;
self.mAlias := xalias;
+ self.mTip := atip;
+ self.mHelp := ahelp;
end;
result.mOwner := mOwner;
result.mId := mId;
result.mTypeName := mTypeName;
+ result.mTip := mTip;
+ result.mHelp := mHelp;
result.mSize := mSize;
result.mHeader := mHeader;
result.mBinBlock := mBinBlock;
if (mBinBlock < 1) then raise TDynParseException.CreateFmt(pr, 'invalid record ''%s'' binblock: %d', [mTypeName, mBinBlock]);
continue;
end;
+ if pr.eatId('tip') then
+ begin
+ if (Length(mTip) > 0) then raise TDynParseException.CreateFmt(pr, 'duplicate tip definition for record ''%s''', [mTypeName]);
+ mTip := pr.expectStr(false);
+ continue;
+ end;
+ if pr.eatId('help') then
+ begin
+ if (Length(mHelp) > 0) then raise TDynParseException.CreateFmt(pr, 'duplicate help definition for record ''%s''', [mTypeName]);
+ mHelp := pr.expectStr(false);
+ continue;
+ end;
end;
end;
begin
mIsEnum := false;
mTypeName := '';
+ mTip := '';
+ mHelp := '';
mIds := nil;
mVals := nil;
mMaxName := '';
mTypeName := pr.expectId();
mMaxVal := Integer($80000000);
if mIsEnum then cv := 0 else cv := 1;
+ while (pr.tokType <> pr.TTBegin) do
+ begin
+ if pr.eatId('tip') then
+ begin
+ if (Length(mTip) > 0) then raise TDynParseException.CreateFmt(pr, 'duplicate tip definition for enum/bitset ''%s''', [mTypeName]);
+ mTip := pr.expectStr(false);
+ continue;
+ end;
+ if pr.eatId('help') then
+ begin
+ if (Length(mHelp) > 0) then raise TDynParseException.CreateFmt(pr, 'duplicate help definition for enum/bitset ''%s''', [mTypeName]);
+ mHelp := pr.expectStr(false);
+ continue;
+ end;
+ break;
+ end;
pr.expectTT(pr.TTBegin);
while (pr.tokType <> pr.TTEnd) do
begin