Как добавить значение переменной вместо переменной к событию щелчка мышью в C#? - PullRequest
0 голосов
/ 03 марта 2020

Я решил, что попробую создать простой язык программирования. Пока все работает, кроме одного - выполнения кода, нажав на элемент GUI. Это строка кода, отвечающая за добавление события к кнопке:

btn[x].MouseClick += (sender, e) => runAct(act_alloc, sender, e);

Проблема здесь в том, что runAct (); void требует идентификатор (act_allo c), чтобы знать, какой код запускать, но act_allo c изменяется каждый раз, когда создается новое действие для элемента GUI, но мне нужно, чтобы событие MouseClick было постоянным числом, для пример:

btn[0].MouseClick += (sender, e) => runAct(2, sender, e);

Мне нужно получить значение переменной act_alloc во время добавления события к элементу, но только значение, а не саму переменную - я не хочу Событие MouseClick для использования другого идентификатора (значение act_alloc во время щелчка элемента), я хочу, чтобы событие MouseClick каждый раз использовало один и тот же идентификатор (значение act_alloc во время события MouseClick элемента присваивается runAct(...).

Приложение просто построчно читает код из файла. Целое число act_alloc увеличивается на 1 каждый раз, когда событие MouseClick добавляется к элементу GUI.

runAct void требует int id, object sender, EventArgs e. Последние два есть только для того, чтобы его можно было использовать как MouseClick. Когда какой-либо код добавляется из файла кода в событие MouseClick элемента, он получает st в виде строки [1024,128] - [Код события, код (<= 127 строк)]. Это runAct void: </p>

public void runAct(int id, object sender, EventArgs e)
{
    for (int x = 1; x <= Convert.ToInt32(act[id, 0]); x++)
        runCode(act[id, x].Split(';'));
}

act - это строка [,], в которой хранится код. Первая строка - это всегда количество хранимых строк, которое преобразуется в целое число, чтобы не вызывать runCode снова и снова без запуска кода. runCode void выполняет то, что называется - запускает строку кода. Одним из них может быть act;(gui_element);, что означает, что весь следующий код сохраняется в строке действия [,]. Это останавливается на линии endact;. После сохранения кода в строке [,] (act[act_alloc, line]) act_alloc увеличивается на 1, так что приложение готово сохранить еще немного кода в строке [,].

Это код, который добавляет событие MouseClick к элементу GUI:

case "act": //add code to an element
    bool wa = true; //keep looping
    int ln = 1; //line number
    while (wa) //loop for adding more code
    {
        string actstr = vars(sr.ReadLine()); //read the next line
        if (actstr == "endact;") //was that all the code?
        {
            wa = false; //stop the loop
        }
        else
        {
            act[act_alloc, ln] = actstr; //store the line
            ln++; //next line
        }
    }
    ln--; //decrease ln by 1 to make sure runAct runs the correct amount of times
    act[act_alloc, 0] = ln.ToString(); //the amount of lines stored gets saved
    switch (cmd[2]) //what GUI element is this code for?
    {
        case "text": //a label
            for (int x = 0; x < label_alloc; x++) //cycle through all the labels
                if (labels[x].Name == cmd[3]) //does the label name match?
                    labels[x].MouseClick += (sender, e) => runAct(act_alloc, sender, e); //add the event
            break;
            case "btn": //a button
                for (int x = 0; x < btn_alloc; x++) //cycle through all the buttons
                    if (btn[x].Name == cmd[3]) //does the button name match?
                        btn[x].MouseClick += (sender, e) => runAct(act_alloc, sender, e); //add the event
            break;
    }
    act_alloc++; //get ready for storing more code
    break;

Если информации по-прежнему недостаточно, сообщите мне.

1 Ответ

0 голосов
/ 03 марта 2020

Как насчет копирования значения act_allo c непосредственно перед этой строкой, а затем использовать эту локальную переменную в runAct (localvariable, sender, e)? (Я не уверен, что ваша проблема на самом деле существует в первую очередь)

- lucidbrot

Это действительно решило мою проблему, спасибо! Я просто добавил новый int прямо перед добавлением события MouseClick к элементу:

act[act_alloc, 0] = ln.ToString();
int eid = act_alloc;
switch (cmd[2])
{
    case "text":
        for (int x = 0; x < label_alloc; x++)
            if (labels[x].Name == cmd[3])
                labels[x].MouseClick += (sender, e) => runAct(eid, sender, e);
        break;
    case "btn":
        for (int x = 0; x < btn_alloc; x++)
            if (btn[x].Name == cmd[3])
                btn[x].MouseClick += (sender, e) => runAct(eid, sender, e);
        break;
}
act_alloc++;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...