Я решил, что попробую создать простой язык программирования. Пока все работает, кроме одного - выполнения кода, нажав на элемент 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;
Если информации по-прежнему недостаточно, сообщите мне.