Как ссылаться на модуль (во время выполнения), если у меня есть только его строковое имя в Delphi? - PullRequest
0 голосов
/ 21 мая 2011

У меня есть типы в различающихся единицах с тем же именем, и у меня есть имя единицы в строке. Мне нужно получить доступ к конкретному типу этого устройства. Как мне это сделать?

Пример:

unit Unit1

type
   TFooType = (
      bar1,
      bar2
   );

тогда у меня есть другой блок

unit Unit2

type
   TFooType = (
      foo1,
      foo2,
      foo3
   );      

И где-то в моем коде у меня есть строковая переменная «UnitName» со значением «Unit1» внутри, и я хочу получить доступ к типу «TFooType» Unit1 по переменной.

Я использую Delphi 2007

Извините за мой плохой английский.

Заранее спасибо.

Ответы [ 3 ]

11 голосов
/ 21 мая 2011

Вы не можете выбрать, какие единицы включить во время выполнения. Единицы - это концепция времени компиляции.

Кроме того, ваши два типа, несмотря на одно и то же базовое имя, являются совершенно разными типами. В другом месте вашего кода вы не можете иметь переменную типа TFooType и произвольно решать, следует ли ей присваивать значения из обеих этих единиц. Переменная может содержать только значения типа one .

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

1 голос
/ 21 мая 2011

@ Хрукай, Как и в случае с lego, вы можете многое сделать, но кое-что просто не было предназначено для такого использования.

Похоже, ваша конечная цель - получить доступ к типу,и ваша отправная точка - это имя переменной.Если бы вы реализовали ваши переменные как классы (ООП), вы могли бы просто сделать Obj.ClassName, чтобы найти его тип ... но также, если бы вы выбрали классы для своей реализации, я предсказываю, что эта потребность (для доступа к типу из переменной)никогда не возникало.

Не поддавайтесь желанию создать новый шаблон, и вместо этого используйте силу классов.http://www.delphibasics.co.uk/Article.asp?Name=OOExample

0 голосов
/ 21 мая 2011

Лучшее, что вы могли бы сделать, это что-то вроде if name='Unit1' then T := Unit1.TFoo и т. Д. Но что вы можете сделать с T в любом случае?Поскольку перечисленные типы из разных единиц отличаются, трудно представить, что можно что-либо сделать с T.На самом деле, как бы вы определили T?Единственное, что я мог себе представить, - это вернуть информацию о типе, но я позволяю своему воображению иссякнуть сейчас!

...