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

Как обратиться к объекту за его строковым именем?

СообщениеДобавлено: 09.09.2009 14:41:48
GAMER
Как обратиться к объекту за его строковым именем?
Например:
OName:='MenuItem12';
...
Что нужно сделать, чтобы получить эквивалент MenuItem12.Enabled:=False;

Кроме как использовать кучу if ничего не приходит в голову.

Добавлено спустя 1 час 24 минуты 30 секунд:
Сам же и нашел:

(FindComponent(OName) as TMenuItem).Enabled:=True;

Re: Как обратиться к объекту за его строковым именем?

СообщениеДобавлено: 28.01.2010 10:15:12
dunin
GAMER писал(а):...
(FindComponent(OName) as TMenuItem).Enabled:=True;

Опять на грабли наступил. Делюсь опытом...

FindComponent возвращает tComponent;
Application.FindComponent всегда возвращает nil - то ли работает не правильно, то ли так задумано - непонятно.

Re: Как обратиться к объекту за его строковым именем?

СообщениеДобавлено: 28.01.2010 11:27:47
Climber
dunin писал(а):
GAMER писал(а):...
(FindComponent(OName) as TMenuItem).Enabled:=True;

Опять на грабли наступил. Делюсь опытом...

FindComponent возвращает tComponent;
Application.FindComponent всегда возвращает nil - то ли работает не правильно, то ли так задумано - непонятно.

А в чем вопрос-то?
На счет Application.FindComponent точно не скажу, не пользовался, но есть подозрение, что Application.FindComponent вернет ссылку на объект - потомок TComponent, который был создан через TComponent.Create(Application), с вероятностью 99,99% это будeт только потомки от TForm. Все компоненты, расположенные на форме, надо искать через Form.FindComponent.

Re: Как обратиться к объекту за его строковым именем?

СообщениеДобавлено: 28.01.2010 13:19:53
dunin
Climber писал(а):А в чем вопрос-то?

Какой вопрос?
dunin писал(а):Делюсь опытом...

Или на форуме только вопросы пишут?
В Дельфи завсегда искал компоненты через Application. В Лазарусе такой номер не прошел. Убил время на поиск ошибки. Не сразу понял в чем дело, подумал даже, что баг. Дабы меньше людей мигрирующих с Дельфи на Лазарус тратили время впустую делюсь опытом.