Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Именовать сабкомпоненту [D6]


--= Eagle =-- ©   (2006-11-24 13:40:00) 

Доброго времени суток ещё раз.
Столкнулся ещё с одной траблой - в компоненте есть сабкомпонента, которой обязательно нужно назначить имя, чтобы её уже сабкомпоненты сохранялись и загружались правильно. У этой сабкомпоненты owner'ом является форма (или фрейм), так же как и у основной компоненты. Вобщем, осталось подобрать удобный случай для именования, т.к. если именовать в конструкторе, то при загрузке формы выскочит ошибка - такой компонент уже существует. Получение уникального имени происходит таким образом:

function TMainComponent.GetUniqueName: String;
var
 I: Integer;

begin
 for I := 0 to Owner.ComponentCount do // not "count-1" because we need to return unique name
 begin
   Result := 'MySubComponentName' + IntToStr(I);
   if Owner.FindComponent(Result) = nil then Break;
 end;
end;


Вобщем, было бы неплохо именовать компоненту только тогда, когда она была реально положена на форму в дизайнере, при последующих загрузках и при создании в рантайме именовать компоненту не нужно. Естественно, что варианты csDesigning и csLoading in ComponentState в конструкторе уже рассматривались и не подошли...


--= Eagle =--   (2006-11-24 17:24:00) [1]

P.S. DimaBr, вообще-то я не  делал создание в дизайнтайме, я его там переименовывал :) Но за идею воспользоваться компонент-эдитором - спасибо.


--= Eagle =--   (2006-11-24 17:17:00) [2]

Спасибо, решил немного другим способом, но тем не менее спасибо за идею, имено она дала нужный толчёк :)


DimaBr   (2006-11-24 15:24:00) [3]

Уже язык отваливается !!!!
Не изобретайте велосипед. Пользуйтесь готовым кодом
http://www.delphimaster.ru/cgi-bin/forum.pl?n=12&id=1162824958&p=2


DimaBr   (2006-11-24 15:22:00) [4]

Создавайте панели в дизайнере

procedure TMyPanelEditors.ExecuteVerb(Index: integer);
var APanel: TMySubPanel;
begin
 case Index of
   0: with TMainPanel(Component) do begin
        APanel := Designer.CreateComponent(TMySubPanel,Component,0,0,100,100) as TMySubPanel;
   end;
 else inherited ExecuteVerb(Index);
 end;{case}
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо