RemoveItems не работает!!
на Create формы пишу
procedure TForm1.FormCreate(Sender: TObject);
begin
fsGlobalUnit.AddForm(Self);
end;
на CloseQuery пишу
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
fsGlobalUnit.RemoveItems(Sender);
fsGlobalUnit.Remove(Sender);
end;
и ФС не удаляет описание этой формы,
и следовательно при вторичном вызове этой формы, когда к ней обращаешься через ФС с другой формы валят Access violation... т.к. скорее всего ФС обращается к уже пустым описаниям разваленной формы.
Что делать?
procedure TForm1.FormCreate(Sender: TObject);
begin
fsGlobalUnit.AddForm(Self);
end;
на CloseQuery пишу
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
fsGlobalUnit.RemoveItems(Sender);
fsGlobalUnit.Remove(Sender);
end;
и ФС не удаляет описание этой формы,
и следовательно при вторичном вызове этой формы, когда к ней обращаешься через ФС с другой формы валят Access violation... т.к. скорее всего ФС обращается к уже пустым описаниям разваленной формы.
Что делать?
Комментарии
fsGlobalUnits.AddedBy := Self;
fsGlobalUnit.AddForm(Self);
fsGlobalUnits.AddedBy := nil;
...
fsGlobalUnit.RemoveItems(Self);
но в другом не очень например я создал форму и к ней ФС, хочу откомпилировать а в ФС есть код который испоьзует Form2 например, и т.к. её нет даже проверить на nil её нельзя т.к. описание о этой форме не добавлено,
получается что скрипт отрабатывает только тогда, когда Form2 создана(и соответсвенно описание к ней добавлено)
решение : я уже писал когда то что в этом случае можно испоьзовать замечатьельный метод FindComponent. а именно если нет такой паблишед проперти, тогда смотри если описание, иначе пролбуй найти через FindComponent..
поправте если я в чём нибудь ошибаюсь...
1.создал Form1 создал Форм2
2.из Форм2 разрушил Форм1 с помощью ФС.
3.Опять создал Форм1(пункт меню), (Форм2 висит в приложении)
4. пытаюсь разрушить Форм1 из Форм2... нифига говорит access violation
получается нужно перекомпилировать скрипт на Форм2,
вывод нужно было сделать компиляцию находу, чтобы ФС бы полный интерпретатор.. хоть и работал бы медленее зато схожих проблем не было бы..
или может это можно как - то обойти?
Обойти можно, надо при создании Form1 прописывать fsScript1.Variables := Integer(Self). Тогда ссылка на форму будет всегда актуальна.
procedure TForm1(2).FormCreate(Sender: TObject);
begin
fsGlobalUnit.AddedBy := Self;
fsGlobalUnit.AddForm(Self);
fsGlobalUnit.Variables[Self.Name] := Integer(Self);
fsGlobalUnit.AddedBy := nil;
end;
на CloseQuery пишу
procedure TForm1(2).FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
fsGlobalUnit.RemoveItems(Sender);
fsGlobalUnit.Remove(Sender);
end;
и следовательно выше описанная ситуация с 2 формами..
???