Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.11.2008, 12:56
anton_ anton_ вне форума
Прохожий
 
Регистрация: 06.11.2008
Сообщения: 2
Репутация: 10
Восклицание Как обратится к переменной, имя которой содержится в значении другой переменной

Подскажите, пожалуйста, как в Delphi обратится к переменной, имя которой содержится в значении другой переменной. Возможно ли вообще такое?

Например, эта проблема в PHP решается очень просто:
$string_2 = "hello";
$string_1 = "string_2";

При записи $$ перед именем переменной:
$temp = $$string_1;
мы переменной temp присваиваем значение переменной $string_2, т.е. hello

Как в Delphi сделать тоже самое?
Ответить с цитированием
  #2  
Старый 06.11.2008, 13:34
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

В дельфи напрямую такое невозможно.
Зато можно использовать указатели.
Еще можно с помощью RTTI находить экземпляры классов и, соотв., обращаться к ним. Т.е. если у тебя в переменной написано имя экземпляра класса, то через RTTI ты можешьполучить ссылку на него, ну и далеее работать с соотв. переменной. Для этого надо класс скомпилить со специальной директивой (кажется $M+, но не уверен - смотри в доке. большинство классов VCL скомпилированны именно так).
Ответить с цитированием
  #3  
Старый 06.11.2008, 16:07
anton_ anton_ вне форума
Прохожий
 
Регистрация: 06.11.2008
Сообщения: 2
Репутация: 10
Сообщение

С помощью указателей можно обратиться к адресу переменной или ее значению, а к самой переменной - нет, особенно если переменная - массив.

пример:
Код:
// описание
const
  Name_Risk : array [0..4] of string = ('Fire', 'Disasters', 'Water', 'Malicious', 'Impact');
var
  Fire_Value_1, Fire_Value_2, ... :array of real;
  temp, temp_1: string;
  i, j: integer;
  p: ^string;

...
begin
  ...
  for i:= 0 to 4 do
  begin
    if Name_Risk[i]=temp then
    begin
       // допустим в переменной temp_1 содержится имя массива Fire_Value_1, как теперь взять какой либо элемент этого массива?
       temp_1:=Name_Risk[i]+'Value_'+j;
       // p:=@temp_1; в указатель записывается адрес переменной temp_1
       // p^ - данная операция возвращает значение переменной temp_1, а как обратиться к массиву?

    end;

  end;
  ...
end;

Все-равно, спасибо за ответ. Все-таки характерная особенность Object Pascal - четкая типизированность данных не всегда бывает удобной при работе.
Ответить с цитированием
  #4  
Старый 06.11.2008, 18:49
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да нет, нормально. Просто надо уметь работать с указателями и тогда четкая типизация тебе мешать не будет. Сам долго разбирался, но когда пришлось использовать WinAPI, тогда начал понимать как это все работает.
Ответить с цитированием
  #5  
Старый 11.02.2009, 13:28
oleg_at oleg_at вне форума
Прохожий
 
Регистрация: 30.10.2007
Сообщения: 2
Репутация: 10
По умолчанию Переменная в переменной

Цитата:
Да нет, нормально. Просто надо уметь работать с указателями и тогда четкая типизация тебе мешать не будет.
Поделись!
В PHP, VB "склейки" имен переменных делаются.
Получаем красивый программный продукт.
Delphi - не Си.
Вот на Delphi и "споткнулся"!
Как частный случай, для отладки:
Код:
procedure Form.edKeyPress(Sender: TObject; var Key: Char);
var
  str, str1: String;
  istr: ^String; // переменная-указатель
begin  // #13 -> Chr(VK_RETURN)
  str := 'Key'; // 'TEdit(Sender).' + 'Text';
  istr := @str; // инициализируем переменную istr
  str1 := istr^;
  ShowMessage(str + #13#10 + str1 + #13#10 + PChar(istr));
изночально ясно что str === str1 = 'Key', и PChar(istr) - бред,
а как получить значение Key, через str ?
P.S. Вообще нравиться интелектуальные ответы, типа:
"Спасибо, разобрался!"
Если разобрался, то зачем другим голову морочил до этого.
А если разобрался, то изложи решение!
В электронике - обратная связь!!!! Уважать других надо!
Ответить с цитированием
  #6  
Старый 11.02.2009, 16:28
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну бред ты получаешь совершенно закономерно, т.к. в конце PCHAR у тебя не нулевой символ, вот она небось и выводит кучу мусора. Кстати, более правильно писать так:

Код:
istr := PChar(str);

Хотя, честно говоря, не помню - копирует она при этом строку или нет.

А вообще, если очень хочется работать с перемеными по их именам, используй классы и RTTI.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:15.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025