![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Подскажите, пожалуйста, как в Delphi обратится к переменной, имя которой содержится в значении другой переменной. Возможно ли вообще такое?
Например, эта проблема в PHP решается очень просто: $string_2 = "hello"; $string_1 = "string_2"; При записи $$ перед именем переменной: $temp = $$string_1; мы переменной temp присваиваем значение переменной $string_2, т.е. hello Как в Delphi сделать тоже самое? |
#2
|
|||
|
|||
![]() В дельфи напрямую такое невозможно.
Зато можно использовать указатели. Еще можно с помощью RTTI находить экземпляры классов и, соотв., обращаться к ним. Т.е. если у тебя в переменной написано имя экземпляра класса, то через RTTI ты можешьполучить ссылку на него, ну и далеее работать с соотв. переменной. Для этого надо класс скомпилить со специальной директивой (кажется $M+, но не уверен - смотри в доке. большинство классов VCL скомпилированны именно так). |
#3
|
|||
|
|||
![]() С помощью указателей можно обратиться к адресу переменной или ее значению, а к самой переменной - нет, особенно если переменная - массив.
пример: Код:
// описание 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
|
|||
|
|||
![]() Да нет, нормально. Просто надо уметь работать с указателями и тогда четкая типизация тебе мешать не будет. Сам долго разбирался, но когда пришлось использовать WinAPI, тогда начал понимать как это все работает.
|
#5
|
|||
|
|||
![]() Цитата:
В 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)); а как получить значение Key, через str ? P.S. Вообще нравиться интелектуальные ответы, типа: "Спасибо, разобрался!" Если разобрался, то зачем другим голову морочил до этого. А если разобрался, то изложи решение! В электронике - обратная связь!!!! Уважать других надо! |
#6
|
|||
|
|||
![]() Ну бред ты получаешь совершенно закономерно, т.к. в конце PCHAR у тебя не нулевой символ, вот она небось и выводит кучу мусора. Кстати, более правильно писать так:
Код:
istr := PChar(str); Хотя, честно говоря, не помню - копирует она при этом строку или нет. А вообще, если очень хочется работать с перемеными по их именам, используй классы и RTTI. |