Перейти к содержанию
Fire Monkey от А до Я
  • 0

A component named ComponentName already exists.


Axbor

Вопрос

Опубликовано

При попытке заново создания фрейма выходит така ошибка "A component named MainMenuFrame already exists."

Удалял эту фрейма таким образом:

    MainMenu->Parent = 0;
    MainMenu->Free();
    MainMenu = 0;

Создаю таким образом:

        MainMenu = new TMainMenuFrame(this);
        MainMenu->Parent = this;

На компьютере работает нормально, но на андроиде вот такая проблема...

Рекомендуемые сообщения

  • 0
Опубликовано

вместо всего вышеперечисленного при удалении делать

MainMenu.Release;
MainMenu:=nil;

.Free на мобильных платформах не делает ничего.

  • 0
Опубликовано

Лениво сейчас открывать студию, но по-моему, Free в мобильных платформах заниливает ссылку. Т.е. после строчки "MainMenu->Free();" ссылка будет пустой.

  • 0
Опубликовано (изменено)

xenon54, согласен. Но сам объект от этого никуда не денется - как минимум, его будет держать Parent.

Кстати, только сейчас обратил внимание на "compiler translates.....". Весьма удивился, если честно. Я почему-то был уверен, что всё от TObject и выше (дженерики не в счет) реализовано именно кодом в .pas файлах :)

procedure TObject.Free;
begin
// under ARC, this method isn't actually called since the compiler translates
// the call to be a mere nil assignment to the instance variable, which then calls _InstClear
{$IFNDEF AUTOREFCOUNT}
  if Self <> nil then
    Destroy;
{$ENDIF}
end;
Изменено пользователем kami
  • 0
Опубликовано

вместо всего вышеперечисленного при удалении делать

MainMenu.Release;
MainMenu:=nil;

.Free на мобильных платформах не делает ничего.

Спасибо большое помогло...

  • 0
Опубликовано

 

xenon54, согласен. Но сам объект от этого никуда не денется - как минимум, его будет держать Parent.

Кстати, только сейчас обратил внимание на "compiler translates.....". Весьма удивился, если честно. Я почему-то был уверен, что всё от TObject и выше (дженерики не в счет) реализовано именно кодом в .pas файлах :)

procedure TObject.Free;
begin
// under ARC, this method isn't actually called since the compiler translates
// the call to be a mere nil assignment to the instance variable, which then calls _InstClear
{$IFNDEF AUTOREFCOUNT}
  if Self <> nil then
    Destroy;
{$ENDIF}
end;

Касательно этого примера, да, фри не сделает того чего от него ожидают :)

 

Но просто фраза "Free на мобильных платформах не делает ничего." звучит слишком однозначно и может ввести некоторых в заблуждение.

  • 0
Опубликовано (изменено)

Более того, она и меня ввела в заблуждение :)

Я посмотрел (когда начинал работать с FMX) код Free, увидел, что при ARC он будет пустой и успокоился на этом. А комментарии всякие читать... не барское это дело :D Вот и попался...

Изменено пользователем kami
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...