[Snippets] Обновленный макрос with
От: catbert  
Дата: 13.12.10 19:53
Оценка: 345 (16)
Народ (http://www.rsdn.ru/forum/nemerle/4067914.1.aspx
Автор: hardcase
Дата: 07.12.10
) хотел инициализаторы коллекций, так что я решил поделиться, и обновил реализацию with-макроса в сниппетах. Поддерживаются новые фичи.

1. Инициализация списков
  def l = List() with [ 2, 3, 4 ];
  def l2 = StringCollection() with [ "a", "b", "c" ]; // поддержка любых объектов с методом Add


2. Инициализация коллекций
  def coll = Dictionary() with [ "name" = "Jason", "surname" = "Vorhees" ];


3. Вложенная инициализация без создания объектов
def k = Diagnostics.Process() with
{
  EnableRaisingEvents = false;
  StartInfo with // никаких присваиваний!
  {
    FileName = <# calc.exe #>;
    UseShellExecute = true;
  }   
}


4. Поддержка событий
def btn = Button() with
          {
            MouseMove += handler;
            Click => form.Text = "Click!"; // упрощенная форма, как в компиляторе Mono C#
          },


5. Поддержка метода AddRange
 def controls = array[myButton, myListBox];
 def panel = Panel() with { Controls ::= controls };


Наконец-то можно создавать формы одним выражением:
  Скрытый текст
def f = Form() with
{
  Font = Drawing.Font("Segoe UI", 9);
  Text = "hello";
  Width += 100;
  Height -= 100;
  Controls with
  [
    Panel() with
    {
      Controls with 
      [
        ListBox() with
        {
          IntegralHeight = false;
          Dock = DockStyle.Fill;
          Name = "second";
        },
        ListBox() with
        {
          Dock = DockStyle.Left;
          Name = "first";
          Items with [3, 4, 5];
          Items ::= otherItems;
          IntegralHeight = false;
          SelectedIndexChanged += 
            (s, _) => 
            {
              def first = (s :> ListBox);
              def second = first.Parent.Controls["second"] :> ListBox;
              second.DataSource = first.SelectedItem.ToString().ToArray();
            }
        }            
      ];
      
      Dock = DockStyle.Fill;
    },
    Button() with
    {
      Text = "push me";
      Dock = DockStyle.Top;
      Click => _ = k.Start();
    },
    TextBox() with
    {
      Text = "type in me";
      Dock = DockStyle.Bottom;
    }
  ];
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.