Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.24;
Скачать: CL | DM;

Вниз

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

 
NewChainik   (2002-10-14 13:35) [0]

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


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

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


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

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


 
ЮЮ ©   (2002-10-14 13:40) [3]

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


 
Zemal ©   (2002-10-14 13:42) [4]

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


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

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


 
Digitman ©   (2002-10-14 13:46) [6]

>NewChainik

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


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

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

SortRecArray(MyRecArray,"FieldName")

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


 
Anatoly Podgoretsky ©   (2002-10-14 13:58) [8]

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

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


 
Zemal ©   (2002-10-14 14:02) [9]

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


 
Digitman ©   (2002-10-14 14:05) [10]

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


 
NewChainik   (2002-10-14 14:30) [11]

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


 
Digitman ©   (2002-10-14 15:14) [12]

>NewChainik

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

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

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


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

Уважаемые Мастера! Есть в 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:48) [14]

>PavelP

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

Returns the address of a published object field.

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




Страницы: 1 вся ветка

Текущий архив: 2002.10.24;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
3-78245
explorer
2002-10-02 12:24
2002.10.24
FastReport и Query


8-78533
Карлсон
2002-06-28 00:07
2002.10.24
Про радар.


1-78387
Ghost.
2002-10-14 16:54
2002.10.24
TreeView низший уровень


1-78337
NewChainik
2002-10-14 13:35
2002.10.24
Как обратиться к переменной, если ее имя задано текстовой строкой


1-78423
brestmarket
2002-10-15 16:20
2002.10.24
В WebBrowser использую относительные переходы по диску,