RemoveItems не работает!!

отредактировано 12:49 Раздел: FastScript
на 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... т.к. скорее всего ФС обращается к уже пустым описаниям разваленной формы.


Что делать?

Комментарии

  • отредактировано 12:49
    Надо так:

    fsGlobalUnits.AddedBy := Self;
    fsGlobalUnit.AddForm(Self);
    fsGlobalUnits.AddedBy := nil;


    ...

    fsGlobalUnit.RemoveItems(Self);
  • отредактировано 12:49
    большое спасибо...
  • отредактировано 12:49
    да кстати.. в каком то случае это удобно(AddForm),
    но в другом не очень например я создал форму и к ней ФС, хочу откомпилировать а в ФС есть код который испоьзует Form2 например, и т.к. её нет даже проверить на nil её нельзя т.к. описание о этой форме не добавлено,
    получается что скрипт отрабатывает только тогда, когда Form2 создана(и соответсвенно описание к ней добавлено)


    решение : я уже писал когда то что в этом случае можно испоьзовать замечатьельный метод FindComponent. а именно если нет такой паблишед проперти, тогда смотри если описание, иначе пролбуй найти через FindComponent..

    поправте если я в чём нибудь ошибаюсь...
  • отредактировано 12:49
    и ещё ;)

    1.создал Form1 создал Форм2
    2.из Форм2 разрушил Форм1 с помощью ФС.
    3.Опять создал Форм1(пункт меню), (Форм2 висит в приложении)
    4. пытаюсь разрушить Форм1 из Форм2... нифига говорит access violation

    получается нужно перекомпилировать скрипт на Форм2,

    вывод нужно было сделать компиляцию находу, чтобы ФС бы полный интерпретатор.. хоть и работал бы медленее зато схожих проблем не было бы..


    или может это можно как - то обойти?

  • отредактировано 12:49
    Одно из преимуществ FS - как раз в том, что это не интерпретатор.
    Обойти можно, надо при создании Form1 прописывать fsScript1.Variables := Integer(Self). Тогда ссылка на форму будет всегда актуальна.
  • отредактировано July 2004
    Александр, ну не работает... может я что не так понял..

    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 формами..
    ;) ???
  • отредактировано 12:49
    В таком случае - демо-пример мне на tz at fast-report.com

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.