2013-06-28 5 views
1

Я создаю форму в Visual Studio 2012, и у меня есть контроллер (более конкретный ползунок), который называется trFinger1Ph1. Можно ли получить доступ к этому с помощью переменной?Использование строки для доступа к элементу формы

Это, как я обычно доступ к моему контроль (который работает)

int value = Form1::trFinger1Ph1-> Value; 

Но я надеюсь сделать это:

std::string test = "trFinger1Ph1" 
int value = Form1::test -> Value; 

Я использую это, потому что у меня есть большой список элементов управления , и доступ к ним таким образом поможет мне очистить большую часть моего кода. Очевидно, что программа ищет внутри trFinger1Ph1 для тестирования и не распознает его как тест переменной.

Любые идеи?

+0

Оператор * a :: b * запрашивает элемент b объекта a, поэтому вы запрашиваете элемент * test * из объекта * a *. Поскольку строковый тест является объектом вне * Form1 *, это приводит к ошибке. Если вы хотите выполнить литеральную замену в своем коде, тогда вам понадобится макрос, но это очень обескураживает. Если вы хотите назвать их для своего имени, вам нужно создать метод внутри объекта * Form1 *, чтобы связать каждую литеральную строку с функцией. – chubakueno

+0

Мне нужно задаться вопросом, почему вы использовали элементы 'static' для хранения ручек для элементов управления. Обычно каждый экземпляр одной формы имеет свой собственный экземпляр элемента управления. –

ответ

2

Нет, вы не можете этого сделать. Вы можете на PHP и некоторых других языках, но это невозможно в C или C++ (это также относится ко многим другим языкам)

Имя переменной будет «исчезать» при компиляции кода.

Возможно, вы сможете сделать что-то еще, что решает проблему (поскольку я подозреваю, что это вопрос XY, вы спрашиваете, как сделать Y, потому что у вас есть проблема X, и вы думаете, что Y - правильный путь решения Это). Например, вы можете иметь таблицу, содержащую имена в виде строк, и ссылку на соответствующий объект, к которой это относится, а затем использовать таблицу для поиска строки и использовать ссылку для получения значения. Я не эксперт в «Формах», однако ...

+0

При таком раскладе я собираюсь предоставить вам пару коробок Twinkies. –

+0

В WinForms элементы управления контейнерами уже поддерживают коллекцию каждого из своих дочерних элементов управления. Вы получаете доступ к нему через свойство 'Controls'. –

1

Вы не можете получить доступ к переменной таким образом на C++.

Если вы действительно хотите получить доступ к ним с помощью строкового литерала вы можете создать std::map и заполнить его с указателями или ссылками на различные переменные-члены.

std::map<std::string, ControlType&> controls; 
controls.insert(std::pair<std::string, ControlType&>("xyz", Form::trFinger1Ph1); 

controls["xyz"].Value = somevalue; 

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

ControlType& control1 = Form::trFinger1Ph1; 

control1.Value = somevalue; 
2

Маты Петерсон и капитан Обливительные верны в своих ответах, что вы не можете этого сделать. В C++ нет доступа к переменной или объекту с помощью строки, содержащей ее имя.

Однако : Способ использования WinForms для доступа к элементу управления в форме, если все, что у вас есть, - это строка, содержащая ее имя. Вы делаете это, используя Controls collection, поддерживаемый родительской формой.

Вы можете вручную перебирать эту коллекцию, используя for each петли, сравнивая значение Name имущества каждого элемента управления к объекту строки, пока вы не получите матч:

for each (Control ^ctl in this->Controls) 
{ 
    if (ctl->Name == "trFinger1Ph1") 
    { 
     // Found a match! 
     // ... 
    } 
} 

& hellip; или вы можете использовать Find method, чтобы позволить фреймворку искать вас и возвращать массив, содержащий все возможные совпадения.

var ctrls = this.Controls.Find("trFinger1Ph1", true); 

К сожалению, вы не можете сделать это, используя синтаксис, который предлагаете. То есть:

std::string test = "trFinger1Ph1" 
int value = Form1::test -> Value; // won't work! 

Очевидно, что вы должны убедиться, что все ваши управления имеют уникальное имя для того, чтобы это работало. И это своего рода design smell, что выглядит очень подозрительно и, вероятно, неверно. Я бы не советовал это как общий способ «очистить» ваш код, как вы предлагаете в вопросе.

+0

Пример «Controls.Find» написан на C#. Конечно, в C++/CLI можно сделать то же самое, но этот конкретный код не будет работать как есть. –