Search code examples
pascalscripthelpndoc

Does HelpNDoc Pascal Script support structures?


I am trying to create a structure:

MyTopic
    TopicID : String;
    HelpID : Integer;

I wanted to create an array of these structures so I could sort them.

I have tried using this type / record syntax but it is failing.

Update

I defined this type and procedure:

type
    TMyTopicRecord = record
        idTopic : String;
        idContextHelp : integer;
    End;

procedure GetSortedTopicIDs(aTopics : array of String; size : Integer);
var
    aMyTopicRecords : array of TMyTopicRecord;
    temp : TMyTopicRecord;
    iTopic, i, j : Integer;
begin
    // Init the array
    SetLength(aMyTopicRecords, size); 

    // Fill the array with the existing topid ids.
    // Get the context ids at the same time.
    for iTopic := 0 to size - 1 do
        aMyTopicRecords[iTopic].idTopic := aTopics[iTopic];
        aMyTopicRecords[iTopic].idContextHelp := HndTopics.GetTopicHelpContext(aTopics[iTopic]);

    // Sort the array on context id
    for i := size-1 DownTo 1 do
    for j := 2 to i do
        if (aMyTopicRecords[j-1].idContextHelp > aMyTopicRecords[j].idContextHelp) Then
        begin
            temp := aMyTopicRecords[j-1];
            aMyTopicRecords[j-1] := aMyTopicRecords[j];
            aMyTopicRecords[j] := temp;
        end;

    // Rebuild the original array of topic ids
    for iTopic := 0 to size - 1 do
        aTopics[iTopic] := aMyTopicRecords[iTopic].idTopic;
end;

The procedure gets called in a loop of the parent function (code snipped):

function GetKeywordsAsHtml(): string;
var
    aKeywordList: THndKeywordsInfoArray;
    aAssociatedTopics: array of string;
    nBlocLevel, nDif, nClose, nCurKeywordLevel, nCurKeywordChildrenCnt: Integer;
    nCurKeyword, nCurKeywordTopic: Integer;
    nCountAssociatedTopics: Integer;
    sCurrentKeyword, sKeywordLink, sKeywordRelated: string;
    sKeywordJsCaption: string;
begin
    Result := '<ul>';
    nBlocLevel := 0;
    try
        aKeywordList := HndKeywords.GetKeywordList(False);
        for nCurKeyword := 0 to length(aKeywordList) - 1 do
        begin
            sCurrentKeyword := aKeywordList[nCurKeyword].id;
            nCurKeywordLevel := HndKeywords.GetKeywordLevel(sCurrentKeyword);
            nCurKeywordChildrenCnt := HndKeywords.GetKeywordDirectChildrenCount(sCurrentKeyword);

            sKeywordLink := '#';
            sKeywordRelated := '[]';

            aAssociatedTopics := HndTopicsKeywords.GetTopicsAssociatedWithKeyword(sCurrentKeyword);
            nCountAssociatedTopics := Length(aAssociatedTopics);
            if nCountAssociatedTopics > 0 then
            begin
                GetSortedTopicIDs(aAssociatedTopics, nCountAssociatedTopics);
                // Code snipped
            end;
        end;
    finally
        Result := Result + '</ul>';
    end;
end;

The script compiled in the HelpNDoc internal editor with no issues. But when I go to actually build my HTML documentation I encounter a problem:

HelpNDoc Error

The HelpNDoc API is explained here.

Is there something wrong with my code?


Solution

  • I decided to go about it a different way and used a simpler technique:

    procedure GetSortedTopicIDs(var aTopics : array of String; iNumTopics : Integer);
    var
        iTopic : Integer;
        // List of output
        aList: TStringList;
    begin
        // Init list
        aList := TStringList.Create;
    
        // Build a new array of "nnn x"
        //  - nnn is the help context id
        //  - x is the topid id
    
        // Note: I know that the context ID values are within the range 0 - 200
        for iTopic := 0 to iNumTopics - 1 do
            // We pad the context id with 0. We could increase the padding width to
            // make the script mre useful
            aList.Add(Format('%0.3d %s', [
                HndTopics.GetTopicHelpContext(aTopics[iTopic]),
                aTopics[iTopic]
            ]));
    
        // Now we sort the new array (which basically sorts it by context id)
        aList.Sort; 
    
        // Update original array
        for iTopic := 0 to iNumTopics - 1 do
            // We ignore the "nnn " part of the string to get just the topic id
            aTopics[iTopic] := copy(aList[iTopic],5, length(aList[iTopic])-4);
    
        // Tidy up      
        aList.Free;
    end;
    

    This compiles and I get the sorted array of topic IDs at the end of it. So the pop-up help is now listed as I want.