Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.10.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.008 c
1-78390
my
2002-10-15 11:25
2002.10.24
как откомпилировать скрипт под linux ?


1-78400
BJValentine
2002-10-15 13:06
2002.10.24
Дата+время


3-78217
MsGuns
2002-10-03 20:42
2002.10.24
Paradox 3 вылетает, когда запускается из-под Win


14-78655
sancho
2002-10-04 21:38
2002.10.24
Help для RxLib


1-78499
msdn1
2002-10-13 18:03
2002.10.24
Richedit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский