Рассылка закрыта
При закрытии подписчики были переданы в рассылку "BloggLand и Я | Блоггландия" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
← Декабрь 2004 → | ||||||
1
|
2
|
3
|
4
|
5
|
||
---|---|---|---|---|---|---|
7
|
8
|
9
|
10
|
11
|
12
|
|
13
|
15
|
16
|
17
|
18
|
19
|
|
20
|
22
|
23
|
24
|
25
|
26
|
|
27
|
29
|
30
|
31
|
Статистика
0 за неделю
В тридцатом выпуске рассылки '.Net Собеседник' вы можете прочесть обзор новых компонент и продуктов, разработанных с использованием платформы .Net, узнать о способах передачи параметров в методы классов, об использовании псевдонимов,
Информационный Канал Subscribe.Ru |
.Net Собеседник #30
Содержание- От автора
- Обзор новостей
- Отслеживаем активность в буфере обмена на C#
- Время кода - Способы передачи параметров в языке C#
- Форумы .Net на www.sql.ru
От автора
Здравствуйте, коллеги!
Вот и подходит к концу 2004 год. Он был, несомненно, сложным, но очень интересным. Отдельным пунктом можно поставить обещания от компании Microsoft, реализацию которых должен принести нам уже следующий, 2005 год. Это и Visual Studio 2005 c .Net Framework 2.0, и SQL Server 2005 и, наверняка, новыe беты Longhorn. Так что в следующем году нам всем, безусловно, будет чем заняться.
А теперь разрешите поздравить вас всех с наступающим 2005 годом и пожелать вам удачи и здоровья!
Ну и на закуску -
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(""); // и т.д... }}} |
Следующий выпуск рассылки планируется во второй половине января. На этом всё - желаю интересного чтения.
Обзор новостей
-
Вышла APNSoft Menu 1.3
- APNSoft Menu – компонент ASP.NET. Генерирует DHTML-меню для веб-сайтов. В новой версии каждый пункт меню, разделитель и подменю могут быть настроены в отдельности.
-
Вышел RADvolution
Designer 2005 в профессиональной редакции!
- DevelopGuidance выпустил RADvolution Designer 2005 PE – инструмент для быстрого создания приложений без кодирования и с высоким уровнем надёжности и настраиваемости. Сгодится для профессиональной разработки, интерактивных сессий и прототипирования.
-
Вышел APNSoft ComboBox
1.0 для ASP.NET
- Поддерживает использование иконок, разделителей, различные виды ползунков, фон и т.п. Является полностью управляемым серверным компонентом .NET, генерирует DHTML на выходе.
-
Стройте
приложения геоинформационных систем с помощью Map Suite для .NET
- Стройте ГИС с помощью Map Suite для .NET. Map Suite, включающий редакции для Winforms, Webforms и Map Engine, создан для всех разработчиков под .NET для быстрого и эффективного добавления функциональности ГИС в свои приложения.
-
Конвертируйте
проекты VB.Net на C# с помощью C-Sharpener For VB 1.3
- C-Sharpener For VB автоматически конвертирует проекты VB.Net в проекты C# посредством плагина Visual Studio. Обычно конвертирует 99%+ кода VB.Net, доступная бесплатная пробная версия.
-
Вышел
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; |
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 - жду ваши предложения и замечания.
http://subscribe.ru/
http://subscribe.ru/feedback/ |
Подписан адрес: Код этой рассылки: comp.soft.prog.dotnetgrains |
Отписаться |
В избранное | ||