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

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

Как обратиться к переменной, если ее имя задано текстовой строкой


NewChainik ©   (2002-10-14 13:35:00) 

Наверное глупый вопрос, но все-таки. Есть ли возможность получить значение переменной, если ее имя я получаю в RunTime как текстовую строчку. То есть, у меня будет строка "VarName" и я хочу получить значение переменной VarName. Как мне обратиться к этой переменной, используя строку "VarName"?


Digitman   (2002-10-14 15:48:00) [1]

>PavelP

Хэлп к методу TObject.FieldAddress :

Returns the address of a publishedobject field.

Кажется, здесь все четко и понятно.


PavelP   (2002-10-14 15:28:00) [2]

Уважаемые Мастера! Есть в TObject метод
function FieldAddress(const Name: ShortString): Pointer;
Я уже давно на него поглядываю, но не использовал. Может быть применително к данному вопросу (код навскидку, без какой-либо проверки)
TObj=Class //вместо записи
s1,s2:string;
end;

Функция, возвращающая значение по имени поля класса:
Function Get(Obj:TObj;Name:string):string;
var s:^string;
begin
s:=Obj.FieldAddress(Name);
Result:=s^;
end;

Прошу прощения,если я написал фигню. Просто эта тема имеет значение и для меня.


Digitman   (2002-10-14 15:14:00) [3]

>NewChainik

Индексированный доступ к чему бы то ни было всегда значительно эффективней и высокопроизводительней любого другого (и в 1-ю очередь - доступа по симв.имени)

Так что - выбирай :

- либо неудобный, но высокопроизводительный доступ по индексу;
- либо "if .. then .." (что вообще искл-но "коряво", imho);
- либо доступ по предварительно расчитанному хэш-коду (менее "коряво", нежели "if .. then ..", но более производительно, хотя по прежнему неудобно)
- либо отказ от record, перенос полей в соотв.регистрируемый класс с соотв.published-полями (так же не слишком эфестивно, зато - надежно, изящно и относительно удобно)


NewChainik   (2002-10-14 14:30:00) [4]

Спасибо всем. Тоже думаю, что никак. Через if ... else не хочется, так как это будет замедлять сортировку. Заменил record массивом и обращаюсь через индекс. Немного не то, что хотелось, но что делать.


Digitman   (2002-10-14 14:05:00) [5]

Никак. В исполняемом файле, полученном в результате компиляции/сборки (без отлад.сведений), не предусмотрено хранение инф-ции об символьных именах переменных (в том виде, как они выглядят в исх.тексте), за исключением имен полей, декларированных в published-секции в объявлениях классов. Последние run-time фигурируют в RTTI (Run-Time Types Information table) и доступ к ним м.б. осуществлен средствами, предоставляемыми в модуле typinfo.pas


Zemal   (2002-10-14 14:02:00) [6]

Можно в функцию передавать ссылку на поле и обращаться к этому полю через ссылку.


Anatoly Podgoretsky   (2002-10-14 13:58:00) [7]

В этом случае просто
if ... then
else if ... then
else ...

а если имя можно заменить индексом подя то и case пойдет


NewChainik   (2002-10-14 13:47:00) [8]

Не знаю, я думал, что можно. Но не знаю как. В принципе задача такая. У меня есть массив типа Record. Мне надо его сортировать по разным полям. Я хочу сделать процедуру сортировки и передавать ей имя поля для сортировки, то есть что-то типа

SortRecArray(MyRecArray,"FieldName")

Для этого мне нужно обратиться как-то к полю через его имя. А как, не знаю.


Digitman   (2002-10-14 13:46:00) [9]

>NewChainik

Это возможно лишь в случае, когда переменная является published-членом класса и обращение к ней происходит для существующего объекта - экз-ра этого класса.


Zemal   (2002-10-14 13:44:00) [10]

Есть такой класс как TStringList в который можно заносить имя переменной и её значение (свойства String и Value). Может это тебе поможет?


Zemal   (2002-10-14 13:42:00) [11]

Получить значение куда? Если ты полычаешь значение, то ты его должен получить в переменную этого же типа... если можно, то поподробнее вопрос.


ЮЮ   (2002-10-14 13:40:00) [12]

Используй что-нибудь другое, а не переменные. Иначе придётся
if VarName="..." then ... else ...


exchoper   (2002-10-14 13:39:00) [13]

Ну, как вариант могу предложить, описать свой класс, в Published свойствах которого будут сидеть твои переменные, тогда к их значениям ты сможешь так доступаться...


Zemal   (2002-10-14 13:39:00) [14]

А такое возможно?


Наверх

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