Страница 1 из 1

Как MSE различает компоненты?

СообщениеДобавлено: 14.02.2009 18:55:42
the_beginer
Доброго времени суток!

У меня теоритический вопрос.

вопрос вот в чем:
нам необходимо создать в рантайме несколько компонентов одного типа,
Код: Выделить всё
   
for i := 1 to 10 do
begin
   ch := tbooleanedit.create(mainfo);
   with ch as tbooleanedit do
     begin
       parentwidget := mainfo.tscrollbox1;
       bounds_x := 10;
       bounds_y := i * 10;
       name := 'tbooleanedit'+inttostr(i);
     end;
end; // for i := ...

а затем обратиться к одному из них, например так:
Код: Выделить всё
if (findcomponent('tbooleanedit1' as tbooleanedit).value = true
     then showmessage('!!!');


Этот код рабочий, НО!
Вначале, при создании tbooleanedit я как-то забыл присваивать значение
Код: Выделить всё
name := 'tbooleanedit'+inttostr(i);

что вызывало при обращении к компоненту ошибку сегментации
ХОТЯ сами компоненты создавались и отображались

Тут собственно и вопрос, MSE их создал и отобразил, значит значение name по дефолту все-таки было присвоено. Но вот какое? Самое банальное, что я придумал:
Код: Выделить всё
procedure tmainfo.createtbooleanedits(const sender: TObject);
var ch : tbooleanedit;
begin
   ch := tbooleanedit.create(mainfo); //первый
   with ch as tbooleanedit do
     begin
       parentwidget := mainfo;
       color := cl_white;
       bounds_x := 10;
       bounds_y := 10;
//       name := 'tbooleanedit1';
       onsetvalue := @ getsvalue;
     end;

   ch := tbooleanedit.create(mainfo);//второй
   with ch as tbooleanedit do
     begin
       parentwidget := mainfo;
       color := cl_white;
       bounds_x := 10;
       bounds_y := 30;
//       name := 'tbooleanedit2';
       onsetvalue := @ getsvalue;
     end;
end;

procedure tmainfo.getsvalue(const sender: TObject; var avalue: Boolean;
               var accept: Boolean);
begin
showmessage(':'+(sender as tbooleanedit).name+':');
end;


и принажатии на оба tbooleanedit в showmessage получил пустую строку.
Но ведь MSE как-то эти компоненты различает.
Как?

Re: Как MSE различает компоненты?

СообщениеДобавлено: 15.02.2009 11:36:55
Attid
сейчас мсе нет под рукой. но думаю что так же как и в лазаре там есть conponetcount componentindex components[i] так и различает.

а вообще исходники открыты зайти в модуль где чекбокс хранится и глянь на конструктор.

Re: Как MSE различает компоненты?

СообщениеДобавлено: 15.02.2009 14:47:48
Sergei I. Gorelkin
Естественно, если имя не присвоено, то findcomponent() вернет nil, и обращение к любому свойству результата вызовет ошибку.
Имя компонента не является обязательным и нужно по сути только для сохранения/восстановления из .mfm файлов.