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

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


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

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

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

От автора

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

Вот и подходит к концу 2004 год. Он был, несомненно, сложным, но очень интересным. Отдельным пунктом можно поставить обещания от компании Microsoft, реализацию которых должен принести нам уже следующий, 2005 год. Это и Visual Studio 2005 c .Net Framework 2.0, и SQL Server 2005 и, наверняка, новыe беты Longhorn. Так что в следующем году нам всем, безусловно, будет чем заняться.



А теперь разрешите поздравить вас всех с наступающим 2005 годом и пожелать вам удачи и здоровья!


Ну и на закуску -

Как известно, в C# существует понятие псевдонимов. Использовать эту фичу можно создавая короткие псевдонимы для понятных, но надоедливо длинных имён классов, предназначенных для работы с SQL Server’ом. Один из подходов показан ниже.

using System;
using System.Data.SqlClient;

using scon = System.Data.SqlClient.SqlConnection;
using scom = System.Data.SqlClient.SqlCommand;
using sda = System.Data.SqlClient.SqlDataAdapter;
using sdr = System.Data.SqlClient.SqlDataReader;

namespace hDrummer.Aliases
{

class AliasForSQL
{
[STAThread]
static void Main(string[] args)
{
scon con;
con = new SqlConnection("");
// и т.д...
}}}


Следующий выпуск рассылки планируется во второй половине января. На этом всё - желаю интересного чтения.

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

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

  1. Вышла APNSoft Menu 1.3
    APNSoft Menu – компонент ASP.NET. Генерирует DHTML-меню для веб-сайтов. В новой версии каждый пункт меню, разделитель и подменю могут быть настроены в отдельности.
  2. Вышел RADvolution Designer 2005 в профессиональной редакции!
    DevelopGuidance выпустил RADvolution Designer 2005 PE – инструмент для быстрого создания приложений без кодирования и с высоким уровнем надёжности и настраиваемости. Сгодится для профессиональной разработки, интерактивных сессий и прототипирования.
  3. Вышел APNSoft ComboBox 1.0 для ASP.NET
    Поддерживает использование иконок, разделителей, различные виды ползунков, фон и т.п. Является полностью управляемым серверным компонентом .NET, генерирует DHTML на выходе.
  4. Стройте приложения геоинформационных систем с помощью Map Suite для .NET
    Стройте ГИС с помощью Map Suite для .NET. Map Suite, включающий редакции для Winforms, Webforms и Map Engine, создан для всех разработчиков под .NET для быстрого и эффективного добавления функциональности ГИС в свои приложения.
  5. Конвертируйте проекты VB.Net на C# с помощью C-Sharpener For VB 1.3
    C-Sharpener For VB автоматически конвертирует проекты VB.Net в проекты C# посредством плагина Visual Studio. Обычно конвертирует 99%+ кода VB.Net, доступная бесплатная пробная версия.
  6. Вышел Aspose.Excel 2.7
    Думаю, что уже все знают что это такое. Единственная существенная добавка – конвертация из Xls в Pdf.

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

Отслеживаем активность в буфере обмена на C#

Отслеживаем активность в буфере обмена на C#

ЯЗЫК:
Автор статьи: Tom Archer

ПЕРЕВОД: Чужа В.Ф. ака hDrummer
КОД К СТАТЬЕ: ClipboardMonitor.zip

Моя книга Visual C++ .NET Bible содержит главу, в которой описаны способы работы с буфером обмена Windows c помощью Visual C++. Многие читатели спрашивали, как такую же функциональность реализовать на C#. Одной из подобных задач – решение которой сделало таким популярным "Clipboard ring" в Microsoft Office — уведомление приложения о том, что в буфере обмена произошли изменения. Здесь мы рассмотрим работу с буфером обмена как обзорно, так и приведём пошаговые инструкции.

Обзор

void DisplayClipboardData() {
try{
IDataObject iData = new DataObject();
iData = Clipboard.GetDataObject();

if (iData.GetDataPresent(DataFormats.Rtf))
richTextBox1.Rtf = (string)iData.GetData(DataFormats.Rtf)
else if (iData.GetDataPresent(DataFormats.Text))
richTextBox1.Rtf = (string)iData.GetData(DataFormats.Text)
else richTextBox1.Rtf = “[Данные не являются ни RTF ни ASCII]”
}
catch (Exception ex){
MessageBox.Show(e.ToString()); } }

Пример 1. Пример проверки буфера обмена на наличие ASCII текста или RTF

Windows поддерживает список (или цепочку) окон, которые должны быть уведомлены при изменении данных в буфере обмена. Каждый раз, как только происходит такое изменение, первое окно в этой цепи получает сообщение WM_DRAWCLIPBOARD. После этого окно может опросить буфер обмена насчёт типа данных, которые содержатся в нём (например RTF, текст ASCII и т.д.), а также получить эти данные. Поскольку средствами .NET добавить окно в эту цепь невозможно, нужно использовать функцию Win32 SetClipboardViewer. И хотя это достаточно простой процесс, при использовании этой функции необходимо помнить о некоторых важных моментах:

  • При вызове функции SetClipboardViewer необходимо передать хэндл окна, которое будет получать сообщение WM_DRAWCLIPBOARD. Функция SetClipboardViewer возвращает хэндл первого окна в цепи. Ваше приложение должно сохранить это значение – например, в члене класса, - поскольку каждое окно, которое получает сообщение WM_DRAWCLIPBOARD должно отослать отослать тоже сообщение следующему окну в цепи с помощью функции SendMessage.
  • Обрабатывайте сообщение WM_DRAWCLIPBOARD. Это можно сделать, оснастив класс Form перегруженным методом WndProc. Пример такого метода будет приведен ниже.
  • Обрабатывайте сообщение WM_CHANGECBCHAIN. Поскольку каждое окно, которое обрабатывает сообщение WM_DRAWCLIPBOARD ответственно за отсылкуэтого сообщения следующему окну в цепочке, оно также должно знать об изменениях, происходящих в этой цепочке. Буфер обмена отсылаает сообщение WM_CHANGECBCHAIN, когда окно убирает себя из очереди окон, подписанных на изменения буфера.
  • Когда приложение завершается, необходимо убрать его из цепочки, что делается с помощью функции Win32 ChangeClipboardChain.

Пошаговая инструкция

1. Как говорилось в обзоре, мы будем использовать в вашем приложении несколько функций Win32 —SetClipboardViewer, ChangeClipboardChain и SendMessage. Для того, чтобы использовать их в приложении .NET, сначала необходимо их импортировать с помощью атрибута DllImport (который располагается в пространстве имён System.Runtime.InteropServices). Например:

using System.Runtime.InteropServices;
...
public class Form1 : System.Windows.Forms.Form
{
[DllImport("User32.dll")]
protected static extern int SetClipboardViewer(int hWndNewViewer);

[DllImport("User32.dll", CharSet=CharSet.Auto)]< /FONT>
public static extern bool
ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);
[DllImport("user32.dll", CharSet=CharSet.Auto)]< /FONT>
public static extern int SendMessage(IntPtr hwnd, int wMsg,
IntPtr wParam,
IntPtr lParam);
...

2. Определим член класса для хранения первого окна в цепи уведомлений об изменении буфера обмена:

public class Form1 : System.Windows.Forms.Form
{
...
IntPtr nextClipboardViewer;

Вызовем функцию SetClipboardViewer. В демонстрационном проекте я вызываю её в конструкторе формы:

public Form1()
{
InitializeComponent();
nextClipboardViewer = (IntPtr)SetClipboardViewer((int)
this.Handle);
..

3. В классе Form перегрузим метод WndProc. Как видно в коде, я обрабатываю только два сообщения: WM_DRAWCLIPBOARD и WM_CHANGECBCHAIN. Заметьте, что для этого сообщения я определил две константы (оба значения можно найти в SDK платформы, в файле winuser.h) В коде-обработчике сообщения WM_CHANGECBCHAIN, я проверяю, является ли окно, удаляющееся из цепи (переданное в члене Message.WParam), следующим окном в цепи. Если да, то я ставлю переменную следующего окна (nextClipboardViewer) вместо него (передаваемое членом Message.LParam):

protected override void WndProc(ref System.Windows.Forms.Message m)
{
// defined in winuser.h
const int WM_DRAWCLIPBOARD = 0x308;
const int WM_CHANGECBCHAIN = 0x030D;

switch(m.Msg)
{
case WM_DRAWCLIPBOARD:
DisplayClipboardData();
SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
break;

case WM_CHANGECBCHAIN:
if (m.WParam == nextClipboardViewer)
nextClipboardViewer = m.LParam;
else
SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
break;

default:
base.WndProc(ref m);
break;
} }

4. В итоге я убираю окно из цепи буфера обменав методе класса Dispose:

protected override void Dispose( bool disposing )
{
ChangeClipboardChain(this.Handle, nextClipboardViewer);
...

Цепь сильна настолько…

После выполнения этих шагов, ваше приложение будет получать уведомления об изменениях, происходящих в буфере обмена.

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

Время кода

Способы передачи параметров в языке C#

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

Перед вами небольшой кусочек кода, в котором приведены три способа передачи параметров в языке C#. Первый способ - наиболее привычный - по значению. Второй способ - передача параметра с ключевым словом out, третий способ, также являющийся классическим, - по ссылке. И четвёртый - передача массива значений. Кстати, проектировщики языка собирались и для обычных параметров, которые передаются по значению, сделать служебное слово in, но затем почему-то передумали :)

using System;

namespace hDrummer.MethodParameters
{
class MethodParameters
{
[STAThread]
static void Main(string[] args)
{
int x, y;
y = 100;
ParamsFun pf = new ParamsFun();

pf.ParamsOut(out x);
Console.WriteLine("После выполнения метода x = {0}",x);

Console.WriteLine("Перед изменением y = {0}",y);
pf.ParamsRef(ref y);
Console.WriteLine("После выполнения метода y = {0}",y);
string[] l = new string[3] {"Первый","Второй","Третий"};
pf.Params(l);

} }
class ParamsFun
{
/// <summary>
/// Метод с входящим параметром
/// </summary>
/// <param name="x"></param>< /FONT>
public void ParamsIn (int x)
{
x = 100;
}

/// <summary>
/// Метод с входящим параметром, изменяемым по исполнению метода,
/// можно не инициализировать в вызывающем методе, но надо объявить.
/// </summary>
/// <param name="x"></param>< /FONT>
public void ParamsOut(out int x)
{
x = 100;
}

/// <summary>
/// Метод с параметром, передаюшимся по ссылке
/// </summary>
/// <param name="y"></param>< /FONT>
public void ParamsRef(ref int y)
{
y = 200;
}

/// <summary>
///Метод, принимающий массив значений, как параметр
/// </summary>
/// <param name="list"></param>< /FONT>
public void Params(params string[] list)
{
foreach(string s in list)
{
Console.WriteLine(s);
}
} } }

На этом всё, до встречи в следующем году!.


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

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

сокеты и прокси Как работать с TempFileCollection?
Проблема с install/uninstall в .NET Compact Framework
UserControl, DataBindings в дизайнере.
Exchange Server -вопрос
OleDBConnection & ASP.NET
Склейка нескольких таблиц
как в Whidbey теперь делать сборки с strong name?
Show Report - CrestalReport ?


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



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


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

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

В избранное