Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

В тридцать третьем выпуске рассылки '.Net Собеседник' вы можете узнать о том,


Информационный Канал Subscribe.Ru

.Net Собеседник #33

Содержание
  1. От автора
  2. Обзор новостей
  3. Code Colorer
  4. Время кода - Групповые и одиночные делегаты
  5. Форумы .Net на www.sql.ru

От автора

Здравствуйте, коллеги!

Как можно выполнить вычисления на javascirpt на клиенте в приложении ASP.Net?

На самом деле всё просто. Если у нас есть два текстбокса с некими числами и мы хотим вывести их произведение в третьем, то делаем так - добавляем HTML-кнопку на форму, пишем:

<input type=”button” value=”произведение” onclick=”func();” ID="”button”1" NAME="”button”1">

И добавляем такую функцию на javascript'e:

<script language=”javascript”>
function func() {
var tb1, tb2, res;
tb1 = document.Form1.tb1.value;
tb2 = document.Form1.tb2.value;
res = tb1*tb2;
document.Form1.tbRes.value = res.toFixed(2);
}
</script>

При присвоении значения для вывода пользователю выполняется также округление до 2-х знаков после запятой (javascript v1.5, актуально при округлении денежных значений); tb1, tb2, tbRes – серверные комопоненты TextBox ASP.Net.

На этом всё - желаю интересного чтения.

{К содержанию}

Обзор новостей

  1. Live Journal блог от hDrummer'a
    Поменял цветовую схему в рассылке, как вам понравилось? Напишите пожалуйста.
  2. SQL Database Tool для IDE редактирования БД
    Apex SQL Tools запустила блог для комментирования процесса разработки Apex SQL Edit, инструмента для редактирвания БД. Apex SQL Edit – это IDE для SQL Server, включающее мощные средства разработки БД, обновлённый GUI, командную строку, Подсказчик, интеграцию с Visual Source safe, форматирование SQL и т.п.
  3. Вышел Thesaurus Desktop .NET v1
    Keyoti выпустил Thesaurus Desktop .NET 1.0, новый компонент-словарь для .NET приложений под Windows.
  4. Вышел .netCHARTING для WinForms
    .netCHARTING для WinForms может быть бесплатно использован для desktop-приложений. Эта версия включает функциональность .netCHARTING 3.0 для несетевой среды.
  5. Обновился Apex SQL Log для чтения транзакционного лога
    Apex SQL Log – инструмент, анализирующий транзакционный лог SQL, отображающий информацию и структурные изменения. Имеет аудит DDL, отображает пользовательское имя NT, усовершенствованный GUI, UNDO, командную строку и т.д.
  6. RichSuite v1.1 от Richer Components
    В новом релизе обновлённые версии RichTextBox, RichDatePicker и RichSlider, а также компонент RichHelpTip, который показывает всплывающую помощь справа от элементов формы. Есть бесплатная версия, ограниченная по времени использования.
  7. Вышел RichDatePicker v1.6
    Новый релиз поддерживает выборку недель, серьёзную кросс-браузерную поддержку, использование файлов внешних скриптов, внутристраничный рендеринг, а также уже стандартные возможности выбора кварталов, времени, множественного выбора и удобный интерфейс.
  8. Выложены исходники искусственной нейросети на C#
    Knowledge Discovery Keys выложила исходники искусственной нейросети на C# открытой лицензией. Можно применить в приложениях .NET для добычи данных и программирования искусственного интеллекта в играх.

{К содержанию}

Статья номера

Code Colorer

ЯЗЫК: C#
Автор статьи: Чужа В.Ф.



Как-то, выпустив очередной выпуск рассылки, я получил письмо от её подписчика, в котором рассылка оценивалась в целом положительно, однако автор письма высказал пожелание раскрасить код в рассылке. Ну что ж, приступим к раскрашиванию кода.

Когда-то давным-давно я читал интервью Андерса Хейльсберга, в котором он рассказывал о том, как появился язык Object Pascal, или Delphi. Кто-то написал “Button1.Caption:=’Ok’;”, эта идея всем понравилась и она послужила толчком для создания всем известного языка.

Примерно также думал и я. Всё, что мне надо было – окно в которое я мог бы вставить код из буфера обмена; кнопка, нажав на которую выполнялась бы трансформация кода и второе окно, в котором можно было бы увидеть результат. Кроме того, трансформированный код должен был сразу попадать и в буфер обмена. Код, выполняемый по нажатию кнопки хотелось бы видеть как можно более простым. Я исходил из того, что код будет анализироваться построчно (хотя можно было использовать и другой подход), а значит логично было бы перебирать строки в цикле foreach. Затем было бы неплохо передавать строку в метод некоего класса, конвертировать её в этом методе и добавлять во второе окно. Затем, после заполнения второго окна, всё содержимое скопировать в буфер обмена.

private void btnConvert_Click(object sender, EventArgs e)
{
tbD.Text = "";
// перебор строк, находящихся в окне-источнике TextBox tbS
foreach (string s in tbS.Lines)
{
// конвертация
CodeConvertor cc = new CodeConvertor(s);
// добавления переконвертированной строки в окно-приёмник
tbD.Text += cc.CodeConvert();
}
// копирование текста из окна-приёмника в буфер обмена
// для последующей вставки в рассылку
Clipboard.SetDataObject(tbD.Text, false);
}

Вот так вот всё достаточно просто и красиво. Осталось разобрать класс CodeConvertor, в котором собственно и содержится реализация конвертации (конечно же достаточно сложная и не совсем красивая :)

using System.Collections;

namespace hDrummer.waMailListCC
{
public class CodeConvertor
{
private string code;
private string temp;
private string keyword_fontcolor;
private string string_fontcolor;
private string comment_fontcolor;
private static bool first = true;
private char prev_char;

private CodeConvertor()
{
}

public CodeConvertor(string scode)
{
code = scode;
keyword_fontcolor = "blue";
string_fontcolor = "green";
comment_fontcolor = "gray";
}

public string CodeConvert()
{
// если это комментарий, то ничего не раскрашиваем
if (code.Trim().StartsWith("//"))
{
return "<font color=" + comment_fontcolor + ">" + code + "</font><br>";
}
// если нет – раскрашиваем по полной
SubCodeConvertor scc = new SubCodeConvertor();
foreach (string kw in scc)
{
temp = code.Replace(kw, "<font color='" + keyword_fontcolor + "'>" + kw + "</font>");
code = temp;
}
// и добавляем перевод строки
code += "<br>";
return StringConvert(code);
}

public string StringConvert(string s)
{
string myresult = "";
foreach (char c in s)
{
if ((c.ToString() == "\""))
{
if (first != true)
{
// анализируем на наличие escape-последовательности
if (prev_char.ToString() !="\\" )
{
myresult += c + "</font>";
first = true;
}
else
{
myresult += c;
}

}
else
{
myresult += "<font color='" + string_fontcolor + "'>" + c;
first = false;
}
}

if (c.ToString() != "\"")
{
myresult += c;
}
prev_char = c;


}
return myresult;
}

#region CodeConvertor – только для внутренних нужд класса CodeConvertor

private class SubCodeConvertor : IEnumerator, IEnumerable
{
private string[] keywords = {
"public", "private", "internal", "protected", "static", "abstract",
"string", " int ", " bool ", "void", "decimal", " byte ", "char",
"string[]", "int[]", "bool[]", "decimal[]", "byte[]",
" in ", "ref ",
"try", "catch", "finally", "throw",
" if", "return", "while", " do", "foreach", "else",
"true", "false",
"object", "class", "this", "base", "const",
"delegate", "event",
"namespace", "new", "null", "using", "#region", "#endregion"
};

private int counter;

public SubCodeConvertor()
{
counter = -1;
}

public bool MoveNext()
{
if (counter < keywords.Length - 1)
{
counter++;
return true;
}
else return false;
}

public void Reset()
{
counter = -1;
}

public object Current
{
get { return keywords[counter]; }
}

#region IEnumerable Members

public IEnumerator GetEnumerator()
{
return (IEnumerator) this;
}

#endregion
}

#endregion
}
}

Смысл наличия этого класса вот в чём. Получив строку в конструкторе, класс использует метод CodeConvert для поиска в строке ключевых слов, которые заданы в классе SubCodeConvertor. Этот класс реализует интерфейсы IEnumerable и IEnumerator, т.е. ведётся перебор ключевых слов и поиск их в строке. Правда сначала предварительно анализируется не комментарием ли на самом деле является переданная строка. Если да – то она заключается в тэги, отображающие комментарий и возвращается наружу, если нет – то и просходит собственно анализ. Затем добавляется тэг перевода строки, а итоговая строка передаётся в метод StringConvert, который ищет в переданной строке строки, ограниченные символами “” и раскрашивает в заданный цвет.

Фактически это бета-версия (в которой есть несколько недочётов, в частности ключевые слова и цвета можно было брать из XML-файла, сложный код не всегда корректно раскрашивается, всё это интереснее было бы реализовать через события), но я думаю вам будет интересно познакомиться с одним из подходов в решении такого рода задач, он не универсален и может и должен быть усовершенствован, но со своей задачей вполне справляется. По-крайней мере весь код в этом выпуске рассылки (а я думаю, что и во всех следующих) был и будет раскрашен именно с помощью этой программы.

{К содержанию}

Время кода

Групповые и одиночные делегаты

ЯЗЫК: C#
АВТОР: Чужа В.Ф.,
dotnetgrains.sql.ru

Как вы знаете, в языке c# существуют как одиночные, так и групповые делегаты (или указатели на функции, что может быть проще для понимания). Так вот, одиночные делегаты (или просто делегаты) предназначены для того, чтобы указывать на один метод и могут применяться для вызова одного метода. В свою очередь групповые делегаты могут использоваться для вызова нескольких методов одной строкой, а добавляться делегаты в групповой делегат могут с помощью оператора +=. Удалить делегаты из группового делегата можно с помощью операции -=. На групповой делегат накладываются дополнительные ограничения – он должен указывать на функцию, возвращающую void, а также она не должна иметь параметров out. Пример применения одиночного и группового делегата приведен ниже.

using System;

namespace hDrummer
{
class clMain
{
[STAThread]
static void Main(string[] args)
{
// создание и вызов делегата
MyOps ops = new MyOps();
HelloDel hd = new HelloDel(ops.Hello);
// так можем сделать, но
//hd += new HelloDel(ops.Hello);
// вызываться метод будет всё равно только 1 раз
Console.WriteLine(hd("Vitali"));

//создание и вызов группового делегата
HelloGroup hg = new HelloGroup(ops.SergeHello);
hg += new HelloGroup(ops.StelaHello);
hg += new HelloGroup(ops.NNNHello);
hg("Виталя");
// теперь удалим несколько делегатов из группового
hg -= new HelloGroup(ops.StelaHello);
hg -= new HelloGroup(ops.NNNHello);
hg("Виталя");
}
}
//Вывод на экран -
// Hello, Vitali
// Здаров, Виталя!
// Рада тебя видеть, Виталя!
// Сколько лет, сколько зим, Виталя!
// Здаров, Виталя!

delegate string HelloDel (string name);
delegate void HelloGroup(string name);


/// <summary>
/// Класс с методами, вызываемыми с помощью делегатов
///
class MyOps
{
/// <summary>
/// Метод для вызова с помощью одиночного делегата
///
/// <param name="name">
/// <returns>
public string Hello(string name)
{
return "Hello, "+name;
}
/// <summary>
/// Метод для вызова с помощью группового делегата
///
/// <param name="name">
public void SergeHello(string name)
{
Console.WriteLine("Здаров, {0}!", name);
}
public void StelaHello(string name)
{
Console.WriteLine("Рада тебя видеть, {0}!", name);
}
public void NNNHello(string name)
{
Console.WriteLine("Сколько лет, сколько зим, {0}!", name);
}
}}

На этом всё.


{К содержанию}

Форумы .Net - вопросы оставшиеся без ответа

OleDbTransaction InTransaction (Active)
как узнать кол-во open session in webApplication
Запуск CGI приложения и обработка его результата

На этом тридцать третий выпуск .Net Собеседника закончен.
До следующего номера.



Чужа Виталий Ф. aka hDrummer,
hdrummer@sql.ru - жду ваши предложения и замечания.


Рассылки Subscribe.Ru
.Net Собеседник - Новости мира Net, C#, ASP.Net

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.dotnetgrains
Отписаться

В избранное