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

Вопросы программирования и использования MSEide + MSEgui.

Модератор: Модераторы

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

Сообщение the_beginer » 14.02.2009 18:55:42

Доброго времени суток!

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

вопрос вот в чем:
нам необходимо создать в рантайме несколько компонентов одного типа,
Код: Выделить всё
   
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 как-то эти компоненты различает.
Как?
the_beginer
новенький
 
Сообщения: 30
Зарегистрирован: 29.05.2008 16:51:51

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

Сообщение Attid » 15.02.2009 11:36:55

сейчас мсе нет под рукой. но думаю что так же как и в лазаре там есть conponetcount componentindex components[i] так и различает.

а вообще исходники открыты зайти в модуль где чекбокс хранится и глянь на конструктор.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

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

Сообщение Sergei I. Gorelkin » 15.02.2009 14:47:48

Естественно, если имя не присвоено, то findcomponent() вернет nil, и обращение к любому свойству результата вызовет ошибку.
Имя компонента не является обязательным и нужно по сути только для сохранения/восстановления из .mfm файлов.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград


Вернуться в MSEide + MSEgui

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru