2010-11-29 7 views
6

Что такого особенного с фреймами, что при создании их во время выполнения ему автоматически присваивается имя? Это вызывает проблемы, когда вы используете их в цикле, т.е.:Назначение имен фреймов

for i := 0 to 3 do 
    TMyFrame.Create(self); //Error on 2nd pass 

На первом проходе, кадр explicityl с именем 'MyFrame. На втором проходе он попробует называть его снова «MyFrame», который может повлечь за собой исключение, так как есть уже такой компонент .

Другие компоненты или формы с удовольствием создаются без , присваивая им имя. Что дает ?

Это на Delphi 2006 г. кстати.

Приветствия

ответ

1

вы пытаетесь создать тот же кадр в 4 раза, каждый раз, когда вы создаете кадр будет иметь такое же имя, один из способов избежать является

... 
var 
    i: Integer; 
    lFrame: TFrame; 
begin 
    for i := 0 to 3 do begin 
    lFrame := TFrame.Create(Self); 
    // assign a unique name to the frame 
    lFrame.Name := Format('MyFrame%d', [i]); 
    // set the parent, align, etc... 
    end; 
end; 
+2

Я считаю, что его вопрос _why_ он должен сделать это с кадрами, когда ему не нужно делать это с другими компонентами. – 2010-11-29 12:45:20

+0

Я получаю это Дорин. Я уверен, что вокруг есть способы. Но вопрос в том, почему? Delphi в порядке: для i: = 0 to 5 do TButton.Create (self); – Rick 2010-11-29 12:50:27

3

Если вы используете TFrame для создания вашего фрейма, тогда он не будет поднимать эту ошибку.

т.е., если ваш код выглядит следующим образом, вы не будете иметь никаких проблем

for i := 0 to 3 do 
    Frame1 := TFrame.Create(self); 

, потому что здесь свойство Name не назначается. Если вы хотите, вы можете проверить, используя инструкцию ShowMessage(Frame1.Name);

Но если вы используете TMyFrame i.e, то кадр, который вы получили из TFrame, тогда он даст проблему.

Я думаю, причина в том, что Delphi явным образом назначал одно и то же имя каждый раз, когда вы создаете имя TMyName.

0

Совместно, я просто наткнулся на это сам (снова).

Если взять имя из вашего кадра компонента и Delphi стонет, что «Root компонент должен иметь имя» - я думаю, это потому, что где-то Delphi звонит RegisterClass(RootComponentName), а затем создать его (или потомок) он звонит Findclass(RootComponentName) или аналогичный. Поскольку вы можете сделать это самостоятельно, чтобы создавать компоненты, которые вы на самом деле не знаете имя класса времени разработки, почему Delphi не сделает то же самое?

Принимая во внимание, что TButton и т. Д., Он уже является зарегистрированным классом.

Смежные вопросы