component named ХХХ already exists
От: konstbel  
Дата: 17.05.10 08:55
Оценка:
Что-то я не понимаю.

Имеется примитивный код:
fmReserve:=TfmReserve.Create(self);

где fmReserve = class(TForm)
Как показывает практика, я могу много раз выполнять этот код, при этом будет создано несколько одинаковых форм и Delphi при создании каждой новой формы будет к ее имени приписывать порядковый номер: fmReserve_1, fmReserve_2, ...

НО!
Время от времени этот же код выдает мне ошибку
Сomponent named fmReserve already exists

Закономерность возникновения которой мне совершенно непонятна.

Может кто пояснить?
Почему я обычно могу создать несколько одинаковых форм, но иногда — нет ?
Re: component named ХХХ already exists
От: DarkMaster Украина http://www.bdslib.at.ua
Дата: 17.05.10 09:22
Оценка:
Здравствуйте, konstbel, Вы писали:

K>Время от времени этот же код выдает мне ошибку

K>
K>Сomponent named fmReserve already exists
K>

K>Закономерность возникновения которой мне совершенно непонятна.

В конструкторе пишем Name:='MyComponent' и всегда получаешь эту ошибку.

K>Может кто пояснить?

K>Почему я обычно могу создать несколько одинаковых форм, но иногда — нет ?

Name:=''; и ошибки не будет.
WBR, Dmitry Beloshistov AKA [-=BDS=-]
Re[2]: component named ХХХ already exists
От: konstbel  
Дата: 17.05.10 10:16
Оценка:
Здравствуйте, DarkMaster, Вы писали:

DM>Name:=''; и ошибки не будет.


Ну, это понятно, спасибо. У меня в конструкторе вообще нет присвоения Name, все делает Delphi при инициализации формы.
Мне непонятно: почему обычно оно работает, а иногда нет?
Что такого происходит, из-за чего дельфийский код обеспечения разных имен перестает работать?
Получается, что он при первой проверке не видит уже существущий компонент, а при второй — видит?
Из-за чего? Создаются подряд две формы?
Сколько не пытался воспроизвести — не получается.
Re: component named ХХХ already exists
От: Danchik Украина  
Дата: 17.05.10 11:10
Оценка:
Здравствуйте, konstbel, Вы писали:

K>Что-то я не понимаю.


K>Имеется примитивный код:

K>
K>fmReserve:=TfmReserve.Create(self);
K>


self — кто такой? Каким может быть?
Re[2]: component named ХХХ already exists
От: konstbel  
Дата: 17.05.10 11:56
Оценка:
Здравствуйте, Danchik, Вы писали:

D>self — кто такой? Каким может быть?


Форма, с которой идет вызов, естественно.
Re[3]: component named ХХХ already exists
От: Aniskin  
Дата: 17.05.10 13:27
Оценка:
Здравствуйте, konstbel, Вы писали:

K>Форма, с которой идет вызов, естественно.


А если заменить на Application?
Re[3]: component named ХХХ already exists
От: Leonid Troyanovsky  
Дата: 18.05.10 06:02
Оценка:
Здравствуйте, konstbel, Вы писали:

K>Сколько не пытался воспроизвести — не получается.


Чего-то ты не договариваешь.
--
С уважением, LVT
Re: component named ХХХ already exists
От: Mike09  
Дата: 18.05.10 07:06
Оценка: 1 (1)
Здравствуйте, konstbel, Вы писали:

K>Почему я обычно могу создать несколько одинаковых форм, но иногда — нет ?


а что, если исходники посмотреть?

TComponent.SetName вызывает TComponent.ValidateName, которая, в свою очередь, вызывает функцию FindComponent (поиск компонента по имени среди компонентов, для которых Self является владельцем (Owner)). И если компонент с таким же именем найден, то вызывается Exception с сообщением формата SDuplicateName. Теперь стоит посмотреть на свой код. Почему к моменту fmReserve:=TfmReserve.Create(self);
у self уже является владельцем компонента с таким же именем.
Re[3]: component named ХХХ already exists
От: Leonid Troyanovsky  
Дата: 18.05.10 10:10
Оценка:
Здравствуйте, konstbel, Вы писали:

K>Что такого происходит, из-за чего дельфийский код обеспечения разных имен перестает работать?

K>Получается, что он при первой проверке не видит уже существущий компонент, а при второй — видит?
K>Из-за чего? Создаются подряд две формы?
K>Сколько не пытался воспроизвести — не получается.

Ищи где в коде (деструктора?) создаваемой формы есть что-то вроде Icon.Free or Canvas.Free.
--
С уважением, LVT
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.