Форум: "Основная";
Текущий архив: 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.007 c