Skip to main content

C# код


Описание.

С помощью этого экшена можно вставлять в проект куски кода, которые написаны на языке программирования C#. Тем самым функционал ZennoDroid заметно расширяется, как и область его использования.

Хоть C# — это и объектно-ориентированный язык, но в данном экшене не используются некоторые преимущества такого подхода. Например, классы и наследования. Код будет исполняться последовательно за исключением использования классов и публичных переменных из Директив Using и общего кода.

Где можно применить:

  • Практически любые действия кубиков можно заменить через C#. При этом ускоряется разработка и эффективность с помощью выполнения кода.
  • Использование любых разработок на C# в своём проекте.
  • Интеграция сторонних библиотек и применение их в коде.

Как добавить в проект?

Через контекстное меню: Добавить действие → Свой код → C# код.

Как добавить в проект?


Как работать с экшеном?

Кубик C# код представляет собой обычный текстовый редактор с базовой подсветкой кода.

В него можно передавать любые переменные проекта, а результат сохранять в текстовом файле, таблице, базе данных или также в переменной.

Для использования методов и свойств проекта используется сущность project. Например, если вы хотите вставить переменную проекта в код, то вызывать ее нужно так: project.Variables["counter"].Value, где counter — имя переменной.


Контекстное меню.

Нажав ПКМ по полю ввода в свойствах действия, вы откроете контекстное меню.

Контекстное меню


Отменить/Повторить.

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

Данные действия работают только в коде окна C# и не вызывают изменений в других кубиках. Для аналогичной функции с другими кубиками нужно зайти в раздел Редактирование на верхней панели ProjectMaker.


Вырезать\Копировать\Вставить\Удалить.

Стандартные действия по работе с кодом как с текстом.


Закомментировать\Отменить комментирование.

Добавляет к выделенному коду символы //, превращая его в комментарий. То есть эти строки будут отключены из общего выполнения.

Это особенно полезно при работе над большими проектами или для отладки кода. В комментариях также можно разместить информацию об изменениях, связях или функционале.


Нумерация строк.

Нумерация строк

Включает/отключает числовое обозначение строк. Помогает в быстрой навигации по коду, а также для нахождения ошибок по информации из лога.

На небольших проектах нумерацию можно отключить, чтобы расширить рабочее пространство.

В настройках ProjectMaker можно задать поведение по умолчанию.

Нумерация строк


Перенос строк.

Включает автоматический перенос строк, если в текущем окне не хватает места.

Настройка выключенаНастройка включена
Настройка выключенаНастройка включена
В настройках ProjectMaker можно задать поведение по умолчанию.

Перенос строк


Перейти к строке.

Позволяет быстро показать необходимую строку, введя номера линии и столбца в открывшемся диалоговом окне.

Перейти к строке

Используется для поиска ошибочного участка кода по информации из лога.


Поиск.

Открывает окно поиска по коду этого экшена. Искать можно с учетом параметров:

  • С учетом регистра;
  • Слово целиком;
  • Искать назад;
  • Использовать: Регулярные выражения или Знаки подстановки;

Поиск

После нажатия на кнопку Найти далее курсор переходит на первое найденное значение. Повторное нажатие переводит курсор на следующее найденное значение и т. д.


Замена.

Похоже на Поиск, но сразу после нахождения искомого значения производится его замена на введенное значение.

Замена

Работать может в пошаговом режиме, либо сразу Заменить все найденные вхождения.


Вставить C# сниппет.

В место, где сейчас находится курсор, будет вставлено всё содержимое выбранного файла.

Вставить C# сниппет

Изначально этот пункт меню не отображается. Чтобы он появился, надо в Директорию C# сниппетов добавить хотя бы один файл.

Директорию C# сниппетов

Сохранить фрагмент кода в файл, например, можно с помощью функции Сохранить в C# сниппет (описано ниже).
Файлы в директории можно помещать в папки и таким образом удобно их группировать.


Сохранить в C# сниппет.

Позволяет сохранять выделенный фрагмент кода в TXT-файл. Этот сниппет можно быстро использовать в дальнейшем и вставлять в другие проекты.


Установить значение из переменной.

При наведении курсора на этот пункт открывается список всех Своих и Авто-сгенерированных переменных проекта.

Установить значение из переменной

Выбрав нужную переменную в редакторе появляется конструкция вида project.Variables["myVar"].Value. Это значение всегда имеет строковый тип (string), и для его использовании в качестве других типов необходима конвертация.


Не возвращать значение.

После отключения этого чекбокса результат выполнения кода будет передан с помощью оператора return.


Положить результат в переменную.

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

Каждая строка C# обязательно должна заканчиваться символом ; .

Это помогает компилятору определить, где заканчивается строка. Без этого символа проект просто выдаст ошибку на этапе запуска.


Настройки по умолчанию.

В настройках программы есть блок настроек специально для кубика C#. Выше мы уже упоминали некоторые из них.

Настройки по умолчанию


Конвертация экшенов в код.

В ZennoDroid есть функция, которая позволяет новичкам быстро освоиться с C#. Некоторые из экшенов можно конвертировать в код и дальше работать с ним, как если бы это был кубик.

Вам нужно нажать на необходимый кубик ПКМ → Конвертировать в C# → вставить скопированный код в поле кубика C#.

Конвертация экшенов в код


Отладка C#.

В сложных и больших фрагментах C# иногда бывает сложно быстро найти ошибку. Поэтому необходима отладка (debug) C# кода с пошаговым мониторингом изменения переменных и данных в списках, таблицах и базах данных. Каждый экшен C# можно отладить в Project Maker с помощью установки одной или нескольких точек останова.

Отладка C#

Для добавления точки останова нужно кликнуть в поле слева от редактора кода напротив нужной строки. Нажатием Далее запускаем исполнение кубика. Можно проверять работу кода по шагам или до следующей точки останова с помощью кнопок над редактором. Смотрим изменения в Окне переменных и эффективно исправляем ошибки.


Примеры использования.

Обучение программированию на C# выходит за рамки данной документации. Однако мы можем дать несколько советов и показать практические примеры, которые часто используют пользователи ZennoDroid при работе с C#.


Арифметические действия с целыми числами.

int value1 = Convert.ToInt32(project.Variables["value1"].Value);
int value2 = Convert.ToInt32(project.Variables["value2"].Value);
int value3 = value1 + value2; //или value1 - value2 или value1 * value2 и т. д.
return value3.ToString(); //сумма двух чисел

Округление результата деления.

float value1 = Convert.ToSingle(project.Variables["value1"].Value);
float value2 = Convert.ToSingle(project.Variables["value2"].Value);
return Math.Ceiling(value1/value2); // округление в большую сторону
//или
return Math.Ground(value1/value2); // округление в меньшую сторону

Создание списка со случайными числами от 1 до 10.

В этом примере ключевое слово var ссылается на тип неявным способом.

Это любой псевдоним, а реальный тип определит компилятор C#.

var list = project.Lists["numbers"];//обращаемся к списку списков проекта для получения сущности одного из них.
list.Clear();//очищаем список перед заполнением
int value;//объясляем цельночисленную переменную
List <string> tempList = new List<string> ();//создаём новый список из строк, но этот список существует только в рамках этого экшена и будет уничтожен после выполнения экшена
for (int i = 0; i < 10; i++) {//цикл из 10 иттераций
value = i;//присваиваем значение счетчика цикла чтобы не имзменять его
value++;//увеличиваем на 1 значение переменной
tempList.Add(value.ToString());//добавляем во временный список строковое значение числа
}//повторяем так 10 раз
tempList.Shuffle();//перемешиваем список
list.AddRange(tempList);//добавляем в результирующий список перемешанный список чисел от 1 до 10
Обратите внимание, в этом примере экшен C# ничего не возвращает, в отличии от двух примеров выше.

Здесь результат работы сохраняется в списке, а не с помощью оператора возврата return попадает в указанную кубиком переменную.


Получение случайной строки из файла с доступами к аккаунтам и разделение её на логин и пароль.

Ключевое слово null является литералом, представляющим пустую ссылку, которая не ссылается на объект. А оператор return можно использовать для возврата null. При этом экшен C# выйдет по красной линии и это бывает удобно при создании взаимосвязей с другими кубиками.

IZennoList list = project.Lists["accounts"];//получаем список с привязанным TXT-файлом в котором построчно хранятся доступы в формате логин:пароль
if (list.Count== 0) return null;//Если список пустой, то выходим из кубика по красной линии
Random rnd = new Random();//создаем генератор случайных чискел
string str = list[rnd.Next(0, list.Count)];//вычисляем случайное чисто от 0 до количества элементов списка (не включительно) и назначаем значение найденного индекса строковой переменной
string [] arr = str.Split(':');//формируем массив строк разделяя переменную с помощью делимера :
project.Variables["login"].Value = arr[0];//берем первый элемент массива, который является логином (индесы массивов, списков всегда начинаются с 0) и присваиваем это значение переменной login
project.Variables["password"].Value = arr[1];//второй элемент массива будет паролем

В этом примере мы выводим предупреждение при пустом списке аккаунтов и заполняем пустой список из TXT новыми доступами.
Тоже самое можно выполнить с помощью метода project.SendInfoToLog("Пустой список", true);.


Работа с файлами: получение разрешения (ширина x высота) изображения.

Image img = Image.FromFile(project.Directory + @"/temp.jpg");//получаем изображение из файла
int width = img.Width;//получаем ширину картинки
int height = img.Height;//и высоту
return width.ToString() + "х"+ height.ToString();//формируем строку с данными
Символ @ означает, что компилятор будет использовать строку за ним буквально, а не как escape-последовательность.

Если убрать этот символ, то для корректной работы кода в пути пришлось бы ставить двойной слэш вместо одинарного.


Работа с OwnCode и с изображениями: наложение полупрозрачного “водяного знака” по центру.

На практике часто требуется вывести некоторые функции на C# в отдельное место и обращаться к ним из разных экшенов. С этим поможет OwnCode (свой код). В этот класс можно вставить функцию, которая будет доступна из кубиков. Она может принимать параметры (аргументы) и возвращать результаты вычислений.

Image original = Image.FromFile(project.Directory + @"/image.jpg");//исходная картинка на которую нужно наложить водяной знак

int w = original.Width;//азмеры исходной картинки
int h = original.Height;

int w_wm = (int) w/10;//ширина водяного знака, в данном случае эта ширина составляет 10 исходной картинки

Image wm = OwnCode.CommonCode.SetImageOpacity(Image.FromFile(project.Directory + @"/wm.png"), .5F);//в одной строке получаем изображение из файла и обрабатываем его (накладываем эффект полупрозрачности) с помощью функции SetImageOpacity, которая находится в классе общего кода
float scale = (float)wm.Height / wm.Width; //пропорции водяного знака
int h_wm = (int) (w_wm * scale);//вычисляем новую высоту водяного знака в зависимости от новой ширины и пропорций
int x = (int) (w/2 - w_wm/2);//позиция x водяного знака (середина основной картинки минус середина новой ширины водяного знака)
int y = (int) (h/2 - h_wm/2);//позиция y водяного знака

Graphics gr = Graphics.FromImage(original);//создаём графический объект из исходкого изображения
gr.DrawImage(wm, x, y, w_wm, h_wm);//рисуем поверх исходной картинки водяной знак с вычисленными ранее координатами и новыми размерами

original.Save(project.Directory + @"/image_result.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);//сохраняем картинку в формате JPEG по указанному пути
original.Dispose();//уничтожаем объекты, которые уже не нужны, чтобы они не занимали память
wm.Dispose();
gr.Dispose();

В данном примере создаётся функция SetImageOpacity. На входе она принимает изображение вместе со значением для изменения прозрачности, а на выходе отправляет измененное изображение. Эта функция требует using System.Drawing.Imaging;

А дальше используем функцию SetImageOpacity, которую нужно вставить в классе OwnCode.CommonCode.

using System.Drawing.Imaging;
public static Image SetImageOpacity(Image image, float opacity)
{
try {
Bitmap bmp = new Bitmap(image.Width, image.Height);
//создание графики из картинки
using (Graphics gfx = Graphics.FromImage(bmp)) {
//создание объекта color matrix
ColorMatrix matrix = new ColorMatrix();
//установка прозрачности
matrix.Matrix33 = opacity;
//создание новых атрибутов
ImageAttributes attributes = new ImageAttributes();
//установка цвета прозрачности картинки
attributes.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
//отрисовываем картинку
gfx.DrawImage(image, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, attributes);
}
return bmp;
}
catch (Exception ex)
{
return null;
}
}

Работа с Regex.

С помощью регулярных выражений в C# можно:

  • парсить данные;
  • находить нужные значения;
  • обрабатывать и присваивать переменные;
  • очищать тексты от мусора.

В примере ниже мы очистим от всех тегов HTML-содержимое некоторого элемента.

string html = project.Variables["value1"].Value;//присваиваем значение переменной где содержится исходный код элемента
return Regex.Replace(html, @"<.*?>", String.Empty);//заменяем HTML-теги на пустоту и возвращаем результат

Работа с макросами.

С помощью объекта Macros можно получить доступ ко множеству функций для работы с файловой системой или для обработки текстов. Например, можно в C# организовать обработку Spintax, аналогичную соответствующему кубику.

return Macros.TextProcessing.Spintax("{0|1|2}");//случайно выведет одно из трёх значений