Как побороть: "A component name already exist"?

отредактировано 04:17 Раздел: FastScript
Вот такой код успешно компилируется и запускается на выполнение:
#language PascalScript
var
  Form: TForm;

begin
  Form := TForm.Create(fmMain);
  Form.Name := 'fmTestForm';
  Form.Caption := 'Тестовая форма';
  Form.SetBounds(100, 100, 200, 200);

  Form.OnShow := @OnShow;

  Form.ShowModal;
  Form.Free;
end.

Но, естественно, вываливает сообщение при запуске <span style='color:red'>Event handler must be a procedure</span> на строчку Form.OnShow := @OnShow;.

заремливаю строчку:
 ...
  //Form.OnShow := @OnShow;
  ...

Перекомпилирую, ок! Запускаю -> Exception: <span style='color:red'>"A component name fmTestForm already exists"</span>.

И такое сообщение получаю при любой ошибке в RunTime.
Естественно, перед компиляцией у меня стоит очистка:
 ...
  fsScript1.Clear;
  fsScript1.Lines := Memo1.Lines;
  fsScript1.Parent := fsGlobalUnit;
  ...
Как с этим можно бороться? ;)

Комментарии

  • отредактировано 04:17
    Пробовал в FS1.4, такой ошибки нет.
  • отредактировано 04:17
    Хм, тогда напрашивается только один вывод как-то я неправильно работаю с загрузкой/выгрузкой откомпилированных скриптов. ;)
    Вот код:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ...
      StreamCode := TMemoryStream.Create;
      ...
    end;
    
    function TForm1.DoCompileScript: Boolean;
    
      procedure ShowError;
      begin
        ... <-- тут процедурка отображения ошибки
      end;
    
    begin
      Result := False;
    
      Screen.Cursor := crHourGlass;
      Try
        fsScript.Clear;
        fsScript.Lines := meScript.Lines;
        fsScript.Parent := fsGlobalUnit;
    
        StreamCode.Clear;
        StreamCode.Position := 0;
        If not fsScript.GetILCode(StreamCode) then begin
          ShowError;
          Exit;
        end;
    
        StreamCode.Position := 0;
        If not fsScript.SetILCode(StreamCode) then begin
          ShowError;
          Exit;
        end;
    
        Result := True;
      Finally
        Screen.Cursor := crDefault;
      End;
      ...
    end;
    
  • отредактировано 04:17
    Решение кроется в отличие создания формы из скрипта, а именно, при вот такой записи все работает:
    ...
    Form := TForm.Create(nil);
    ...
    
    а, вот, при такой:
    ...
    Form := TForm.Create(Form1);
    ...
    
    ошибка вываливается... ;)

    Напрашивается вопрос, это ошибка FS, или правильно все таки создавать объект TForm нужно с <span style='color:red'>nil</span> ..? ;)
  • отредактировано 04:17
    Да, действительно.
    Дело в том, что Event handler must be a procedure - это ошибка run-time, а не compile-time. Поэтому часть кода успевает отрабатывать и форма, ессно, создается, но не убивается. Должно помочь использование try/finally.

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

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