Topic: Скрипты, рекурсия и SQLQuery()
Написал рекурсивный скрипт загрузки древовидных данных главного меню:
procedure LoadMenu(miParent: TMenuItem; idParent: integer);
var
Results: TDataSet;
miChild: TMenuItem;
sForm: string;
index: integer;
begin
if idParent = -1 then
SQLQuery('SELECT id, name, form FROM main_menu WHERE id_parent is null', Results)
else
SQLQuery('SELECT id, name, form FROM main_menu WHERE id_parent='+inttostr(idParent), Results);
while not Results.Eof do
begin
miChild := TMenuItem.Create (frmMain.MainMenu);
miChild.Caption := Results.FieldByName('name').AsString;
sForm := Results.FieldByName('form').AsString;
if sForm<>'' then
begin
miChild.OnClick := @MenuItemClick;
index := FormList.IndexOf(sForm);
if index>=0 then
miChild.Tag := index
else
begin
ShowMessage('Wrong form name: '+sForm)
end
end;
if idParent = -1 then
frmMain.MainMenu.Items.Insert(0, miChild)
else
miParent.Add(miChild);
// вызываем рекурсивно
index := Results.FieldByName('id').AsInteger;
LoadMenu( miChild, index );
Results.Next;
end;
end;
Но при работе выяснилось, что по возвращению из рекурсивного вызова локальная переменная Results уже не содержит набора данных и система (на строке Result.Next - ?) выдаёт ошибку:
В примерах с TTreeView загрузка идёт не сразу, а по частям, по мере раскрытия веток (http://myvisualdatabase.com/forum/viewtopic.php?id=3001)
Имеют ли место быть ограничения по рекурсиям в скриптах или по рекурсии в использовании SQLQuery() в частности?
P.S. Склоняюсь, что дело в FastScript и запрете на рекурсию, так как при изменении процедуры ошибки были самыми разными, от классического AV до весьма экзотических... Пока рекурсию победить не удалось, сделал загрузку главного меню двумя процедурами, для двух уровней.