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

Изучаем MDI и балуемся Word'ом


1026
➲перейти к началу ➲перейти к концу
Практическая работа с Visual Studio.Net и Microsoft Office

Статистика
Номер выпуска рассылки 7
Дата выпуска рассылки 2006-04-28
Время выпуска рассылки 13:55:49
Возраст рассылки в днях 83
Количество подписчиков 1026
Динамика подписчиков за вчера 0
Динамика подписчиков за неделю 0

Оглавление

Практическая работа с Visual Studio.Net
Практическая работа с Microsoft Office
Web-технология
Создание реальных проектов
Вопросы и ответы

Ошибки в коде.

В прошлый выпуск рассылки вкрались странные ошибки, к примеру: ="FlatStyle.System". Откуда взялись кавычки, сам не представляю, у меня в коде их нет. Когда тестировал рассылку, тоже было всё в порядке, однако после выпуска всё-таки появилась эта дрянь, и не только она, весь код искажён. Раньше я пользовался преобразователем в HTML код, а тогда вот просто поставил тэг PRE, так как рассылка в этом случае занимала меньше места. Заранее предупреждаю о возможных искажениях в этом выпуске, хотя их и не должно быть, так как в ней будут использоваться предыдущие стили.

Если у вас есть предложения или конструктивные замечания по темам выпуска, пишете по внешнему адресу рассылки.

Практическая работа с Версия
Visual Studio.Net 2003

Многодокументный интерфейс.

Multiple-Document Interface (MDI) или многодокументный интерфейс позволяет вам отображать в одно и тоже время сразу несколько документов, причём каждый находится в своём собственном окне. Вы вероятно замечали, что приложения использующие такую технологию имеют в строке меню вкладку Window в английских версиях или Окно в русских. За примерами далеко ходить не надо, достаточно посмотреть на ваши Visual Studio.NET IDE (+Visual Macros IDE) или продукт Microsoft Office (такой как Word, Excel, Access и так далее). Между Single-Document Interface (SDI - однодокументный интерфейс) и MDI существуют некоторые отличия в поведении (см. behavior на вкладке свойств). Например, свойство Opacity - непрозрачность не повлияет на внешность дочерних форм MDI, плюс к этому метод Form.CenterToParent тоже не будет воздействовать на них, то есть, если создать главную форму (Form1), в ней вызвать показ другой формы (для VB.NET - frmSubform.ShowDialog()), а потом из неё применить этот метод, то frmSubform выровняется по центру Form1 (для расширения кругозора так же см. Form.CenterToScreen). Но расставить окна всё же можно, об этом будет рассказано ниже.

Создаём родительскую форму MDI.

Создать родительскую многодокументную форму очень просто. Чтобы это осуществить, нужно для начала:

  1. Создать приложение с помощью мастера Windows Application.
  2. В свойствах окна (Properties window) установите свойство IsMdiContainer в true, изначально оно всегда стоит в false. Обратите внимание на появившуюся подсветку и увеличенное вдавливание внутренних границ. Для границ лучше всего пока оставить системные цвета, часто это является более предпочтительным, особенно тогда, когда приложение рассчитано на работу с разными темами оформления Windows.
  3. Из вкладки Toolbox (у меня она слева) перетащите компонент MainMenu на форму. Благодаря этому действию в вашей главной форме на свойство Menu автоматически добавится ваша новая строка меню. Если захотите вставить в форму ещё один экземпляр, то тогда вам придётся переключить главную форму на него вручную. В верхнем уровне строки меню наберите &Файл для свойства Text. Можете сразу начинать печатать там, где написано Type Here, что в переводе с английского значит Печатай Здесь.

    ë

    Знак амперсанда служит для указания ключа доступа в надписи - свойство Text. Благодаря ему можно вызывать нужные вам элементы управления при помощи клавиатуры, задействовав сочетания клавиш Alt+(подчёркнутая буква). Подчёркивается всегда буква идущая после знака амперсанда. Если элемент управления не может получить фокус, к примеру - TabPage на TabControl, то ускоритель доступа с клавиатуры не сработает. Подобная ситуация, но по другой причине для TextBox, так как в данном случае свойство Text не просто подпись, а редактируемая пользователем строка. В тех же элементах управления, где амперсанд срабатывает, но он нужен как символ, ставится двойной знак && для получения одного символа. Кстати, подобный способ работает и для кавычек в строке при вводе их как литералов в коде. Для более подробной информации об амперсанде в свойстве Text смотрите Creating Access Keys for Windows Forms Controls.

    Внутри вкладки Файл поставьте элементы подменю &Новый и &Закрыть, плюс в верхнем уровне строки меню введите &Окно.
  4. Всё готово, теперь только осталось добавить на форму фон - свойство BackgroundImage (выберите мозаичную картинку) и можно запускать приложение (F5).

Создаём дочерние формы MDI.

Очень важным элементом приложений Multiple-Document Interface (MDI) являются дочерние формы MDI. Ладно, это фраза была вроде прикола, на самом деле это самые важные формы, иначе не зачем было бы использовать MDI. Сейчас мы создадим наследованные форму с элементом управления RichTextBox, на вроде редактора Word. В действительности можно использовать любые элементы управления и смешивать их как вздумается, механизму MDI это ни чуточку не повредит. Таким образом, перед вами откроются огромные возможности. Вообще, не бойтесь проводить разнообразные опыты, тогда программирование из нудного и трудного занятия превратится в конструктор, в некотором смысле ничуть не сложнее того же LEGO, где из кирпичиков собирается целое. Когда вы создаёте программу, то производите нечто подобное, только вот кирпичики у вас другие, но результат радует ничуть не меньше.

Для создания дочерних форм MDI:

  1. Добавьте новую форму, это можно осуществить множеством способов, но для начала воспользуемся вкладкой Project в строке меню Visual Studio.NET IDE, далее выбираем пункт Add Windows Form:, ничего не меняйте просто жмите Open. Благодаря вашим действиям создастся новая форма с именем Form2. На всякий случай предупреждаю, чтобы вы не пытались изменить свойство Opacity (непрозрачность) в ваших дочерних окнах, так как оно создано для окон верхнего уровня, в противном случае у вас могут начаться проблемы с правильным отображением.
  2. Перетащите RichTextBox с вкладки Toolbox на форму Form2.
  3. Убедитесь, что свойство формы Anchor (якорь) стоит в Top, Left. Параметр свойства Dock должен иметь значение Fill, короче нужно выбрать прямоугольник по центру. RichTextBox растянется на всю клиентскую область формы и полностью покроет её площадь. Более того, теперь не нужно думать об изменениях размеров, всё будет подгонятся автоматически.
  4. Замените имена (Name) элементов меню на mnitmНовый, mnitmЗакрыть, mnitmОкно соответственно их подписям (Text).
  5. Создайте обработчик для элемента меню Новый, для этого достаточно навести на него курсор и два раза щёлкнут левой кнопкой мыши. После этого вставьте туда следующий код.
    Visual Basic.NET
        Private Sub mnitmНовый_Click(ByVal&n bsp;sender As System.Object, ByVal e As System .EventArgs) Handles mnitmНовый.Click
            Dim NewMDIChild As  New Form2
            ' Устанавливаем ро дительскую форму для дочернего окна.
            NewMDIChild.MdiParent =  Me
            ' Отображаем новую  форму.
            NewMDIChild.Show()
        End Sub
    Visual С++.NET
        private: System::Void mnitmNew_Click (System::Object *  sender, System::EventArgs *  ; e)
                &nbs p;{
                &nbs p;    Form2 *newMDIChild = new Form2 ();
                &nbs p;    // Устанавливаем родительскую форму  для дочернего окна.
                &nbs p;    newMDIChild->MdiParent = this;
                &nbs p;    // Отображаем новую форму.
                &nbs p;    newMDIChild->Show();
                &nbs p;}

    В Visual С++.NET придётся добавить директиву #include в начало заголовочного файла (h) формы Form1. Я это сделал сразу после #pragma once.

    Visual С++.NET
    // Включаем код файла "Form2.h"
    #include "Form2.h"

    Так же обратите внимание на две важные вещи. Во-первых мною были использованы английские имена (Name): mnitmFile, mnitmNew, mnitmClose, mnitmWindow, так как Visual С++ никогда не был интерпретатором, то и работа с многоязыковой поддержкой ему не нужна. Конечно, этого можно добиться, всё предусмотрено, но зачем? Не тратьте зря время. Во-вторых, хотя соглашения об именах запрещают использование юникода в них, никто не помешает вам сделать это для комментариев. Смотрите пример директивы выше, в комментариях левая и правая кавычки юникода, а вот в строке директивы только символы стандартной кодировки.

    Visual С#.NET
            private void  ;mnitmНовый_Click(object sender, System.EventArgs e)
            {
                Form 2 newMDIChild = new Form2();
                //&n bsp;Устанавливаем родительскую форму для дочернего  окна.
                newM DIChild.MdiParent = this;
                //&n bsp;Отображаем новую форму.
                newM DIChild.Show();
            }
    Visual Java.NET
        private void mnitmНовый_Click ( Object sender, System.EventArgs e)
        {
            MDIJava.Form2 newMDIChi ld = new MDIJava.Form2();
            // Устанавливаем р одительскую форму для дочернего окна.
            newMDIChild.set_MdiParent(th is);
            // Отображаем нову ю форму.
            newMDIChild.Show();
        }
  6. И последнее, наведите фокус на элемент меню с надписью Окно, в свойствах (Properties window) установите true для MdiList и MergeItems для MergeType. Запустите приложение (F5).

Как видно в Visual Studio.NET любая операция проходит с минимальными усилиями со стороны программиста. Это главным образом потому, что в данном случае программист всего лишь пользователь системы программирования, которая и делает работу удобной и комфортной. Сейчас я говорю даже не о графических возможностях интерфейса Visual Studio.NET IDE, а просто о механизме классов. Функции COM библиотек Windows зашиты в стандартные библиотеки SDK так ловко, что большая часть кода выполняется вне нашей видимости. На практике реализован принцип объектно-ориентированного программирования, то есть убрать всё не приятное и большое подальше, а пользователю-программисту оставить удобный и не требовательный интерфейс (имеется ввиду, интерфейс доступа к классам, а не графический). Когда вы научитесь мыслить классами, любая ваша программная задумка будет выполняться в наикратчайшие сроки.

Определение активного дочернего окна MDI.

Для этих целей мы используем свойство формы Form. ActiveMdiChild. Почему же в таком случае оно отсутствует в окне Свойств (Properties window) в виде оформления ([Design]). Перейдите по ссылке на неё, и вы поймёте, что данное свойство существует только для чтения. Посмотрите как это выглядит:

  • [Visual Basic] Public ReadOnly Property ActiveMdiChild As Form
  • [C#] public Form ActiveMdiChild {get;}
  • [C++] public: __property Form* get_ActiveMdiChild();
  • [JScript] public function get ActiveMdiChild() : Form;

Описание разное, но суть одна. Так же в коде будет использовано свойство ActiveControl, для определения активного элемента управления в дочернем окне. Не находите, что хоть это свойство совершенно другого порядка, чем ActiveMdiChild, всё же можно уловить некую общность, и то и другое возвращают текущий активный элемент. К примеру, если бы у нас были записи, то очевидно, что одна из них была бы активна, в противном случае нам бы выдали нулевой указатель. Подобные сравнения крайне примечательны, так как, поняв принцип работы, вы существенно сэкономите ваше время, и в будущем будете более эффективно использовать свои знания. С языками программирования в Visual Studio.NET точно такая же ситуация, знаете хотя бы два из них, и будете знать все. Более того, в будущем программирование у вас пойдёт не конкретными инструкциями, а общими понятиями, что значительно улучшит ваш стиль, а так же надёжность и скорость ваших программ. То есть, не в грамматике дело, дело в том, что она выражает. Рекомендую вам почитать книгу <Язык программирования C++> третье издание, автор Бьерн Страуструп. Когда на других книгах написано <библия программиста> не верьте, потому что только это издание достойно такого названия, остальные являются лишь энциклопедическим материалом, сдобренным разнообразными примерами.

Чтобы скопировать в буфер выделенную строку в RichTextBox дочернего окна сделаем следующее:

  1. Создаём в верхнем уровне принадлежащего главной форме меню элемент с надписью &Правка ((Name) mnitmПравка, для C++ mnitmEdit). Перемещаем её в центр, между двумя другими вкладками. Внутри неё создаём элемент с надписью надписью &Копировать ((Name) mnitmКопировать, для C++ mnitmCopy).
  2. Теперь создаём обработчик, двойного щелчка будет достаточно, и вставляем следующий код:

    Visual Basic.NET
        Private Sub mnitmКопировать_Click(By Val sender As System.Object, ByVal e As S ystem.EventArgs) Handles mnitmКопировать.Click
            ' Определяем актив ное дочернее окно.
            Dim activeChild As  Form = Me.ActiveMdiChild
            ' Если на фор ме активно дочернее окно, находим активный эле мент управления,
            ' который в э том примере RichTextBox.
            If (Not activeChil d Is Nothing) Then
                Try< BR>             &nbs p;   Dim theBox As RichTextBox = CTy pe(activeChild.ActiveControl, RichTextBox)
                &nbs p;   If (Not theBox Is Nothing) Then
                &nbs p;       ' Копируем выделенный& nbsp;текст в Буфер Обмена.
                &nbs p;       Clipboard.SetDataObject(theBox.S electedText)
                &nbs p;   End If
                Catc h
                &nbs p;   MessageBox.Show("Ты должен выделить RichT extBox.")
                End& nbsp;Try
            End If
        End Sub
    Visual С++.NET
        private: System::Void mnitmCopy_Clic k(System::Object *  sender, System::EventArgs *&nbs p; e)
                &nbs p;{
                &nbs p;    // Определяем активное дочернее&nbs p;окно.
                &nbs p;    Form *activeChild = this->Active MdiChild;
                &nbs p;    // Если на  форме активно  дочернее окно, находим активный элемент управ ления,
                &nbs p;    // который в  этом пример е RichTextBox.
                &nbs p;    if (activeChild != NULL)
                &nbs p;    {   
                &nbs p;        try
                &nbs p;        {
                &nbs p;            Ri chTextBox *theBox = static_cast<RichTextBox*>(activeChi ld->ActiveControl);
                &nbs p;            if  (theBox != NULL)
                &nbs p;            {< BR>             &nbs p;            &n bsp;   // Копируем выделенный текст в&nbs p;Буфер Обмена.
                &nbs p;            &n bsp;   Clipboard::SetDataObject(theBox->SelectedText);
                &nbs p;            }< BR>             &nbs p;        }
                &nbs p;        catch(char *) {& nbsp;MessageBox::Show("Ты должен выделить RichTextBox.");&nbs p; }
                &nbs p;    }
                &nbs p;}
    Visual С#.NET
            private void  ;mnitmКопировать_Click(object sender, System.EventArgs e)
            {
                //&n bsp;Определяем активное дочернее окно.
                Form  activeChild = this.ActiveMdiChild;
                //&n bsp;Если на  форме активно дочернее окно,  ;находим активный элемент управления,
                //&n bsp;который в  этом примере RichTextBox.
                if&n bsp;(activeChild != null)
                {&nb sp;  
                &nbs p;   try
                &nbs p;   {
                &nbs p;       RichTextBox theBox =&n bsp;(RichTextBox)activeChild.ActiveControl;
                &nbs p;       if (theBox != nul l)
                &nbs p;       {
                &nbs p;           //  Копируем выделенный текст в Буфер Обмена.
                &nbs p;           Clipboar d.SetDataObject(theBox.SelectedText);
                &nbs p;       }
                &nbs p;   }
                &nbs p;   catch { MessageBox.Show("Ты должен в ыделить RichTextBox.");  }
                }
            }
    Visual Java.NET
        private void mnitmКопировать_Click&n bsp;(Object sender, System.EventArgs e)
        {
            // Определяем акти вное дочернее окно.
            Form activeChild =  this.get_ActiveMdiChild();
            // Если на &n bsp;форме активно дочернее окно, находим активный&n bsp;элемент управления,
            // который в   этом примере RichTextBox.
            if (activeChild !=  null)
            {
                try< BR>             {
                &nbs p;   RichTextBox theBox = (RichTextBox)activeC hild.get_ActiveControl();
                &nbs p;   if (theBox != null)
                &nbs p;   {
                &nbs p;       // Копируем выделенный  текст в Буфер Обмена.
                &nbs p;       Clipboard.SetDataObject(theBox.g et_SelectedText());
                &nbs p;   }
                }
                catc h (Exception err) { MessageBox.Show("Ты должен  ;выделить RichTextBox.");  }
            }
        }
  3. Всё, можете запускать ваше приложение (F5). Создайте внутри него дочерние окна, выделите в одном из окон текст и скопируйте его оттуда при помощи вашего нового приобретения.

Подобным образом можно создать не только элементы копирования, но так же возможности вырезания и вставки. Проделайте текущую работу сами, она будет вашим домашним заданием, к тому же очень простым. Думаю ни у кого подобное не вызовет трудностей. Для вставки воспользуйтесь противоположной функцией Clipboard, какой не скажу, программист должен приучаться самостоятельно добывать себе информацию, воспользуйтесь помощью MSDN. Конечно, я исхожу из принципа, что вы, читая данную рубрику, параллельно создаёте приложение. Если вы этого не делали, то значит или слишком ленивы, или просто не подумали об этом, или считаете, что знаете всё настолько хорошо, что лишняя тренировка вам не нужна. Дело, конечно, ваше, но я настоятельно рекомендую проделывать описываемые мною операции, иначе вы попусту потеряете время.

Интуитивное программирование.

Дочитав до этого раздела, задумайтесь над тем, какую пользу вы извлекли из предыдущего материала. Возможно, некоторые из вас скажут, что научились создавать приложения MDI. Другие подумают о грамматических конструкциях языка, или о конкретных методах и свойствах стандартных библиотек SDK. Но задайте себе вопрос, сможете ли вы с ходу повторить все описанные выше действия? Если нет, то может быть, вы ничему не научились, или научились, но далеко не всему, что было мною описано? Основная суть программирования состоит вовсе не в том, чтобы помнить мелкие детали конкретной реализации. Когда кузнец придаёт металлическим болванкам форму, думает ли он о том, что под каждым его ударом огромное количество атомов смещается? А ведь это только одна из сил воздействующих в данный момент на изделие. Способен ли человек кующий металл осознавать все последствия своей работы? С другой стороны нужно ли это вообще. Применительно к программированию данный вопрос не теряет своей актуальности. Программист создаёт некую модель действий, которая происходит в реальном времени, но от пользователей Visual Studio.NET не требуется знать, как работает операционная система, об этом заботится Framework SDK, нужно лишь понимать то, что хочешь получить. Так же стоит отметить существование Platform SDK, MFC и тому подобных библиотек, которые тоже являются некими заменителями, облегчающими жизнь, пусть даже и менее удобные, чем Framework. Кстати, Framework SDK и MFC обе вызывают функции библиотек Platform SDK.

Просмотрите следующий пример:

Visual Basic.NET
    Private Sub mnitmВставить_Click(ByVa l sender As System.Object, ByVal e As Sys tem.EventArgs) Handles mnitmВставить.Click
        ' Определяем актив ное дочернее окно.
        Dim activeChild As  Form = Me.ActiveMdiChild
        ' Если на фор ме активно дочернее окно, находим активный эле мент управления,
        ' который в э том примере RichTextBox.
        If (Not activeChil d Is Nothing) Then
            Try< BR>             &nbs p;   Dim theBox As RichTextBox = CTy pe(activeChild.ActiveControl, RichTextBox)
            &nbs p;   If (Not theBox Is Nothing) Then
            &nbs p;       ' Создаём новый о бразец интерфейса DataObject.
            &nbs p;       Dim data As IData Object = Clipboard.GetDataObject()
            &nbs p;       ' Если данные в&n bsp;Буфере Обмена являются текстом, тогда вставляем  их в RichTextBox.
            &nbs p;       If (data.GetDataPresent(Dat aFormats.Text)) Then
            &nbs p;           theBox.S electedText = data.GetData(DataFormats.Text).ToString()
            &nbs p;       End If
            &nbs p;   End If
            Catc h
            &nbs p;   MessageBox.Show("Ты должен выделить RichT extBox.")
            End& nbsp;Try
        End If
    End Sub

А теперь ответьте себе, для чего он нужен? Некоторые части совпадают с кодом изложенным выше, некоторые отличаются. Но главная суть заключается в том, что вам не нужно думать, над тем, как этот код работает, достаточно представлять лишь его предназначение для эффективного использования в своих программах. Или вот ещё:

Visual Basic.NET
    Private Sub mnitmКаскадом_Click(ByVa l sender As System.Object, ByVal e As Sys tem.EventArgs) Handles mnitmКаскадом.Click
        Me.LayoutMdi(System.Windows. Forms.MdiLayout.Cascade)
    End Sub

    Private Sub mnitmУпорядочитьЗначки_Click(B yVal sender As System.Object, ByVal e As  System.EventArgs) Handles mnitmУпорядочитьЗначки.Click
        Me.LayoutMdi(System.Windows. Forms.MdiLayout.ArrangeIcons)
    End Sub

    Private Sub mnitmГоризонтально_Click(ByVal  sender As System.Object, ByVal e As Syst em.EventArgs) Handles mnitmГоризонтально.Click
        Me.LayoutMdi(System.Windows. Forms.MdiLayout.TileHorizontal)
    End Sub

    Private Sub mnitmВертикально_Click(ByVal&n bsp;sender As System.Object, ByVal e As System .EventArgs) Handles mnitmВертикально.Click
        Me.LayoutMdi(System.Windows. Forms.MdiLayout.TileVertical)
    End Sub

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

перейти к оглавлению

Практическая работа с Версия
Microsoft Office 2003

Размышления о Word'е.

Пора немного отвлечься от Access и поговорить о других программных продуктах Microsoft Office. Безусловно, релятивные базы данных полезны, но суть в том, что наибольшей эффективности они достигают при взаимодействии с Visual Studio.NET, и не важно, является ли вторым связующим компонентом язык .NET, ASP или что-нибудь другое. Главное, что не каждому они вообще нужны. Вследствие этого у меня и возникла идея написать об автоматизировании Word.

Откройте Word 2003 или более младшую версию и запустите "Редактор Visual Basic" (Alt+F11). Далее создайте модуль Insert⇒Module и назовите его Speak в свойствах (Properties (Name)). Затем вставьте в него следующий код:

Visual Basic 6.3
Private myAgent

Sub SpeakText()
  ' Создаём объект агента речи
  Set myAgent = CreateObject("Agent.Control.2")
  ' В случае успешного создания присоедин яемся к нему
  If IsObject(myAgent) Then myAgent.Connected  = True
  ' Загружаем персонаж Мерлина, так как&n bsp;он встроен в XP
  myAgent.Characters.Load "merlin"
  Set merlin = myAgent.Characters("merlin")
  ' Далее просто говорим, что нам ну жно
  merlin.Show ' Показываем Мерлина
  merlin.Speak Application.Selection.Text  ' П роизносим выделенный текст
  merlin.MoveTo 200, 200 ' Сдвигаем Мерли на
  merlin.Play "Wave" ' Проигрываем звук М ерлина
  merlin.Speak "Вот и всё, что я хот ел сказать!"
  merlin.Hide ' Скрываем Мерлина
End Sub

Запустите окно Сервис⇒Настройка:. На вкладке Команды в списке Категории выберите Макросы. Далее перетащите на любую панель инструментов Speak.Speak.SpeakText. Наведите на появившуюся кнопку, правой кнопкой мыши задайте Только тест (в меню) и Выбрать значок для кнопки второй сверху и слева.

Теперь настало время испытаний. Выделите любой текст в вашем документе Word, и нажмите кнопку, которую вы создали. В ответ вы увидите появляющегося Мерлина произносящего слова. Следует отметить, что эта технология использует речевой движок, так что у вас он должен быть установлен. Удалите всё лишнее из кода макроса и можете использовать эту кнопку как профессиональный инструмент. На этом сегодняшняя рубрика подходит к концу.

перейти к оглавлению

HTML, ASP, VBScript Версия
Web-технология 5.0

Новые возможности ASP

В активные серверные страницы (ASP) были добавлены новые возможности, облегчающие работу создателям сценариев и разработчикам веб-приложений.

  • Новые средства управления работой программ. В объект Server ASP были добавлены два новых метода, предназначенных для управления ходом выполнения программ: Server.Transfer и Server.Execute. Теперь вместо неэффективной переадресации запросов, выполняющей двусторонний обмен данными с клиентом, можно использовать эти методы для направления запроса непосредственно asp-файлу, без передачи информации за пределы сервера. Дополнительные сведения см. в разделе Отправка содержимого в веб-обозреватель.
  • Обработка ошибок. Теперь ASP имеют новые средства обработки ошибок, позволяющие перехватывать ошибки с помощью asp-файла специальных сообщений об ошибках. Новый метод Server.GetLastError можно использовать для выдачи полезных сведений, например, описания ошибки или номера строки, в которой она возникла. Дополнительные сведения см. в разделе Объект ASPError.
  • ASP, не содержащие сценариев. Так как статическое содержимое обычно обрабатывается быстрее, чем содержимое на стороне сервера, ранее рекомендовалось давать расширение .asp только файлам, использующим функции ASP. Когда возникала необходимость в добавлении функций ASP в файлы статического .html, приходилось вручную изменять расширение файла на .asp и корректировать соответствующие гиперссылки. Теперь, в данной версии ASP, те .asp-файлы, которые не используют серверных функций, обрабатываются быстрее, чем раньше. Поэтому при разработке веб-приложения с возможностями развития, в файлы которого со временем может потребоваться добавить функции ASP, можно изначально дать этим файлам расширение .asp, независимо от типа их содержимого. Дополнительные сведения см. в разделе Создание ASP-страницы.
  • Улучшенная производительность объектов. Active Server Pages теперь предоставляют оптимизированные версии своих популярных устанавливаемых компонентов. Эти объекты надежно встраиваются во многие системы опубликования содержимого. Дополнительные сведения см. в разделе Устанавливаемые компоненты для ASP.
  • Интеграция XML. Язык XML (Extensible Markup Language) делает возможным семантическое описание сложных структур данных или документов, которые могут совместно использоваться различными приложениями, клиентами и серверами. С помощью нового инструмента MicrosoftR XML Parser, входящего в состав MicrosoftR Internet Explorer версии 4.0 или более поздней, можно создавать приложения на стороне сервера, позволяющие веб-серверу обмениваться данными в формате XML с обозревателем Microsoft Internet Explorer версии 4.0 или более поздней, либо с любыми серверами, поддерживающими XML. Дополнительные сведения см. на веб-узле Microsoft XML.
  • Windows Script Components. ASP поддерживают новую мощную технологию работы со сценариями, разработанную корпорацией Microsoft - Windows Script Components. Она позволяет поместить все сценарные процедуры, выполняющие функции вашей организации, в COM-компоненты, допускающие повторное использование, которые могут работать как в ваших веб-приложениях, так и в других программах, построенных по технологии COM. Дополнительные сведения см. в разделе Использование компонентов и объектов.
  • Новый способ определения возможностей обозревателя. ASP имеют новое средство для определения возможностей, поддерживаемых обозревателем. Когда обозреватель отправляет модуль настройки клиента (cookie) с описанием своих возможностей (такой модуль настройки клиента устанавливается с помощью простого сценария на стороне клиента), можно создать экземпляр компонента Browser Capabilities, который получает возвращаемые в этом модуле свойства обозревателя. Эту функцию используют для определения возможностей обозревателя и соответствующей настройки приложения. Дополнительные сведения см. в разделе Получение сведений о поддерживаемых обозревателем возможностях с помощью модуля настройки клиента (cookie).
  • Автонастройка ASP. ASP теперь умеют распознавать ситуации, когда выполняющиеся запросы блокируются внешними ресурсами. При этом автоматически создаются новые потоки для одновременного выполнения дополнительных запросов и продолжения нормальной обработки. Если процессор перегружен, ASP уменьшают число потоков. Это позволяет снизить количество постоянных переключений, возникающих при одновременном выполнении слишком большого числа неблокированных запросов. Дополнительные сведения см. в описании свойства метабазы AspThreadGateEnabled.
  • Включения на стороне сервера с помощью атрибута SRC. Теперь для включений на стороне сервера можно использовать атрибут SRC тега HTML <SCRIPT></SCRIPT>. Использование атрибута SRC для указания виртуального или относительного пути в сочетании с атрибутом RUNAT=SERVER, задающим выполнение сценариев на стороне сервера, позволяет получить результаты, аналогичные результатам применения директивы #Include. Дополнительные сведения см. в разделе Включение файлов.
  • Шифрование сценариев ASP. Ранее веб-разработчики не могли запретить просматривать тексты своих сценариев. Теперь ASP поддерживают новую служебную программу шифрования сценариев, поставляемую с Microsoft Visual Basic Scripting Edition (VBScript) и Microsoft JScript 5.0. Отныне веб-разработчики имеют возможность шифровать как клиентские, так и серверные сценарии, что не позволит кому-либо прочитать текст сценариев в виде ASCII-символов. Зашифрованные сценарии расшифровываются обработчиком сценариев во время их выполнения, поэтому нет необходимости в использовании отдельной программы расшифровки. Хотя эта возможность и не претендует на то, чтобы быть полностью безопасным решением, она не позволит большинству обычных пользователей скопировать или просмотреть сценарий. Дополнительные сведения см. на веб-узле Windows Script Technologies.
  • Международные средства разработки ASP. Были добавлены два новых свойства объекта Response: Response.CodePage и Response.LCID. Эти свойства позволяют на уровне страницы управлять кодовой страницей и национальными настройками для динамических строк, без необходимости включать сеансы. Свойства Session.CodePage и Session.LCID по-прежнему обеспечивают управление на уровне сеанса кодовой страницей и национальными настройками для динамических строк. Однако эти свойства более не переписываются необратимо директивами @CodePage и @LCID. Директивы @CodePage и @LCID по-прежнему влияют на статические строки на веб-страницах. Эти свойства по умолчанию неявно задаются стандартной кодовой страницей ANSI (CP_ACP) и системной национальной настройкой (LOCALE_SYSTEM_DEFAULT). Однако если свойства метабазы AspCodePage или AspLCID заданы для любого веб-узла или виртуального каталога, их значения становятся значениями по умолчанию. Свойства метабазы позволяют использовать файлы global.asa, которым требуются кодовые страницы, отличные от системной. Расширенные средства UTF-8 включают поддержку вспомогательных символов и поддержку символов национальных алфавитов во внутренних объектах, таких как данные формы и серверные переменные.

перейти к оглавлению

От начала и до конца Ставим
Создание реальных проектов опыты

Продолжаем рассуждать.

Возможно, некоторым из вас надоело, что я всё рассуждаю, рассуждаю, но привожу мало примеров. В оправдание могу лишь сказать, что думать вообще полезно. А чтобы уметь программировать, даже не всегда необходимо знать, как работает код. Для тех, кто не понял, это я продолжаю тему интуитивного программирования. Откройте документацию MSDN 2004, если она конечно у вас есть, из меню Программы⇒Microsoft Visual Studio .NET 2003⇒Microsoft Visual Studio .NET 2003 Documentation. После этого нам откроется документация, лично у меня она состоит из двух пунктов MSDN Library-July 2004 и DirectX SDK Update (Summer 2003). Здесь вы можете найти обширную информацию по интересующим вас вопросам, нужно лишь научиться грамотно, пользоваться данной системой помощи.

К примеру, мне захотелось узнать способы работы с базами данных или что-либо в этом роде. Нет ничего проще. Во-первых, документация часто разделена на описание классов и конкретных примеров использования. Это значит, если нам нужно использовать одно свойство, метод, событие, то нужно лезть в библиотеку классов, в противном случае лучше поискать готовые примеры. Во-вторых, в MSDN существует очень удобная система поиска, не нужно ходить по древовидному списку, запоминайте ключевые слова прочитанных вами статей, а потом возвращайтесь к ним по Index или Search, а затем синхронизируйтесь со списком оглавления. На эту тему можно много чего ещё сказать, но я лучше покажу, как говориться "Лучше один раз увидеть, чем сто раз услышать".

Visual С++.NET
public:
    void ReadMyData(String* myConnString)
    {
        String* mySelectQuery&n bsp;= S"SELECT OrderID, CustomerID FROM Orders";
        OdbcConnection* myConne ction = new OdbcConnection(myConnString);
        OdbcCommand* myCommand& nbsp;= new OdbcCommand(mySelectQuery, myConnection);
        myConnection->Open();
        OdbcDataReader* myReade r = myCommand->ExecuteReader();

        try
        {
            whil e (myReader->Read())
            {
            &nbs p;   Console::WriteLine("{0}, {1}", __box(myReader- >GetInt32(0)), myReader->GetString(1));
            }
        }
        catch(Exception* e)
        {
            Cons ole::WriteLine("An error occurred: '{0}'", e);
        }

        // always call&nbs p;Close when done with connection.
        myReader->Close();
        // always call&nbs p;Close when done with connection.
        myConnection->Close();

    };

Пример взятый выше был извлечён с главной страницы OdbcCommand Class. Чему же он учит, если не прикладывать к нему каких-либо комментариев? Если вы ответили ничему, то это очень плохо, и в первую очередь для вас. Даже несмотря на включённую мной ссылку на OdbcCommand Class имеет смысл провести цепь рассуждений. Она может включать в себя множество пунктов, но главное заключается даже не в этом, а в том, что осмысление вообще происходит. Очень часто люди говорят, что программирование развивает логическое мышление. В дословном переводе подобное значит развитие осмысляющего мышления.

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

  1. Некий заумный программист садится за компьютер и начинает усиленно думать, что-то писать. У него не всё получается, тогда вход идёт ещё большее упорство, и напряжение нарастает, нарастает, пока мозги, образно говоря, не взрываются. Так же это называется - сгорел на работе.
  2. Другой случай относится к разряду безалаберности граничащей с гениальностью. Лёгкое отношение к составлению программ (особо отмечу, что ключевое слово составление). Зачем мучаться, когда, не задумываясь можно писать гениальные вещи. Данную технологию условно окрещу Drag and Drop (DAD), то есть тащи и бросай, тащи и бросай, тащи и бросай.

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

  1. Сдираем чужой код.
  2. Преобразуем его в нужный нам формат.
  3. Сохраняем в удобном для извлечения виде.

Как видите всё просто, а просто то, что гениально. Следовательно, данный способ программирования можно отнести к разряду гениального. Впрочем, им не так то легко научиться пользоваться. Вполне возможно, что понадобятся вспомогательные средства. О них я поговорю в следующих выпусках.

перейти к оглавлению

comp.soft.prog.vsnetmsoffice-owner@subscribe.ru Отвечает
Вопросы и ответы автор

k

Как со мной связаться?

  • Прежде всего можно послать письмо на адрес рассылки, он дан в заголовке. Пишите свои замечания и предложения, но постарайтесь сделать письмо как можно меньше, то есть, 5Kb или 10Kb в текстовом варианте будет более чем достаточно. К тому же сервис subscribe.ru тоже накладывает некоторые ограничения на доставку писем.
  • Вы можете использовать мой лист обсуждений по текущей теме. Он нужен, прежде всего, для общения по почте, сразу многим участникам. В общем, экономный чат для тех, кому не терпится пообщаться. Его стоит использовать, только если вы действительно интересуетесь программированием. Подписаться на лист можно через таблицу подписки расположенную ниже. Там же находится и его всплывающее описание, которое появится, если задержать курсор на названии.

Я только что подписался!!! как мне получить предыдущие выпуски вашей рассылки, заказав их по почте?

Ó Для начала пошлите текстовое письмо по адресу subscribe@subscribe.ru. Ни в коем случае не пытайтесь отправить письмо в формате HTML, робот subscribe просто не станет его рассматривать. Заполните содержание следующей строкой ARCHIVE comp.soft.prog.vsnetmsoffice 2006. Тему можно игнорировать.

Ò Если вы всё сделали правильно, то через некоторое время вам придёт список предыдущих выпусков рассылки. Теперь повторите операцию с письмом, но используйте элементы из списка выпусков. Например, для получения первых трёх выпусков, можно использовать следующее содержание текстового письма:
ARCHIVE comp.soft.prog.vsnetmsoffice 2006/02/10-00:11:08.html
ARCHIVE comp.soft.prog.vsnetmsoffice 2006/02/15-01:06:13.html
ARCHIVE comp.soft.prog.vsnetmsoffice 2006/02/21-23:15:18.html
QUIT

Отправьте письмо и ждите ваш заказ. Не пытайтесь получить почту, пока не пройдёт хотя бы несколько минут. Это наименьшее время, которое уйдёт на обработку заказа. А, заказав выпуски в 12 ночи по Московскому времени, придётся ждать их очень долго.

Подобным методом вы можете получать не только мою рассылку, но и любую другую, подставив её код в письмо вместо моей.


Sergey R. Sergin

Чесслово, коллега, только такие слова и приходят на ум по прочтении последнего номера рассылки, что не далее как сегодня упал мне в ящик. Такую бесноватую реакцию у меня вызвала статья, в которой описываются потуги по использованию стилей Windows XP в приложениях, создаваемых в Visual Studio NET. Позволю себе предположить, что программист, пишущий в указанной среде с высокой степенью вероятности пользуется C# или C++ и пишет свои программы для исполнения в .NET (дот НЭТ).

Каждый сам выбирает себе язык, однако замечу, что языки .NET практически равноценны, то есть то, что можно написать на одном, так же легко кодируется и на всех остальных. Вот когда я пользовался Visual Studio 6.0 Enterprise Edition, тогда мне действительно больше нравился Visual C++ 6.0, так как он выполнен по стандарту ISO/IEC 14882 (Standart for the C++ Programming Language), впрочем Visual Basic 6.0 тоже заслуживал самого пристального внимания, хотя бы для общего развития. Сейчас же разницы почти никакой, только записывается разными грамматическими конструкциями, то есть, часть перекочевала от VB 6.0, а часть от VC++ 6.0. Кстати, С#.NET некоторыми деталями уж очень сильно напоминает гибрид этих двух языков.

Стало быть, вся проблема использования стилей Windows XP заключается в двух шагах: 1. В методе main нужно сделать вызов Application.EnableVisualStyles(); ну или Application->EnableVisualStyles(); 2. В дизайнере форм надо для элементов типа кнопок, списков и так далее нужно выбрать свойство FlatStyle равным System. Всё! Больше ничегошеньки делать не надо, всё уже будет сделано за нас.

Хорошо, такой способ действительно имеет полное право на существование. Более того, является прекрасным образчиком решения одной задачи несколькими способами. Мастер Windows Application в Visual Basic.NET, не добавляет автоматически функцию Main, то есть при декомпиляции в вы её увидите, а в коде нет, поэтому вам придётся скопировать в тело класса вашей главной формы следующий код.

Visual Basic.NET
    <STAThread()> Public Shared&nb sp;Sub Main()
        Application.EnableVisualStyl es()
        Application.Run(New For m1)
    End Sub

Имя Form1 измените в зависимости от настроек вашего проекта. В других языках проблем с Main не возникнет, так как она дана сразу.

Данная рекомендация достоверно применима к Visual Studio NET 2003. В Visual Studio NET 2005 и этого делать не надо, там уже включены стили по-умолчанию, а свойства элементов настроены так, чтобы сразу выглядеть как надо. Зачем людям головы морочить - не понимаю!

Очень ценное замечание, но данный пример лишь ставит стили свойства FlatStyle в значение System, чтобы вам не пришлось делать этого вручную. Манифест же загружается самостоятельно, так как имеет такое же имя, как исполняемый файл. Более того, работа с манифестом позволяет изменять его на ходу, без перекомпиляции. Плюс к этому стоит отметить, что его изначальное предназначение несколько иное, а специалистами корпорации Microsoft приведено лишь как учебное пособие.

PS. Если в каком месте допустил ошибку в синтаксисе, не надо сразу придираться к мелочам. Я уже и забыл что такое жизнь программиста без автозавершения ввода, без рефакторинга и дизайнера классов.

В прошлой рассылке код странным образом исказился, поэтому я приведу его ещё раз в несколько другой вариации. Если вы не используете манифест, то можете удалить проверку на его существование в функции FormatForWinXP.

Visual Basic.NET
Imports System.Windows.Forms.Form

Public Module Manifest

    ' Преобразуем подэлементы управления& nbsp;по теме XP
    Private Sub RecursivelyFormatForWinXP(ByVa l control As Control)
        Dim x As Inte ger
        For x = 0&nbs p;To control.Controls.Count - 1
            '&nb sp;Если элемент управления извлекается из ButtonBas e или являтеся GroupBox, 
            '&nb sp;устанавливаем свойству FlatStyle значение FlatStyle.S ystem.
            If&n bsp;control.Controls(x).GetType().BaseType Is GetType(ButtonBase)& nbsp;Then
            &nbs p;   CType(control.Controls(x), ButtonBase).FlatStyle&nb sp;= FlatStyle.System
            End& nbsp;If
            If&n bsp;control.Controls(x).GetType().Name = "GroupBox" Then
            &nbs p;   CType(control.Controls(x), GroupBox).FlatStyle  ;= FlatStyle.System
            End& nbsp;If
            '&nb sp;Если этот элемент управления содержит другие,&nb sp;то пройтись по ним
            If&n bsp;control.Controls.Count > 0 Then
            &nbs p;   RecursivelyFormatForWinXP(control.Controls(x))
            End& nbsp;If
        Next x
    End Sub

    ' Преобразуем элементы управления&nbs p;по теме XP
    Public Sub FormatForWinXP(ByVal crntF orm As Form)
        ' Необходими убеди ться, что Windows XP загрузит существующий фай л .manifest для EXE.
        If Environment.OSVersio n.Version.Major > 4 And Environment.OSVersion.Version .Minor > 0 And _
     System.IO.File.Exists((Application.ExecutableP ath + ".manifest")) Then
            '&nb sp;Повторить для всех элементов управления.
            Dim& nbsp;x As Integer
            For& nbsp;x = 0 To (crntForm.Controls.Count) - 1
            &nbs p;   ' Если элемент управления извлекаетс я из ButtonBase или являтеся GroupBox, 
            &nbs p;   ' устанавливаем свойству FlatStyle з начение FlatStyle.System.
            &nbs p;   If crntForm.Controls(x).GetType().BaseType Is& nbsp;GetType(ButtonBase) Then
            &nbs p;       CType(crntForm.Controls(x),  ;ButtonBase).FlatStyle = FlatStyle.System
            &nbs p;   End If
            &nbs p;   If crntForm.Controls(x).GetType().Name =  "GroupBox" Then
            &nbs p;       CType(crntForm.Controls(x),  ;GroupBox).FlatStyle = FlatStyle.System
            &nbs p;   End If
            &nbs p;   ' Рекурсивный вызов для подэлементов  управления
            &nbs p;   RecursivelyFormatForWinXP(crntForm.Controls(x))
            Next  x
        End If
    End Sub

End Module

Вот следующий код позволяет использовать класс Manifest для установки всех свойств FlatStyle элементов управления в стиль System. ВАЖНО: перед использованием удалите проверку на существования файла .manifest, так как в данном случае создавать такой файл не будет никакой необходимости.

Visual Basic.NET
    <STAThread()> Public Shared&nb sp;Sub Main()
        Application.EnableVisualStyl es()
        Application.Run(New For m1)
    End Sub

    Private Sub Form1_Load(ByVal sender&n bsp;As System.Object, ByVal e As System.EventArgs)& nbsp;Handles MyBase.Load
        Manifest.FormatForWinXP(Me)< BR>     End Sub

Напоминаю, что это всего лишь учебный пример, и для многих действительно легче было бы вручную поставить свойство FlatStyle на System. Но смотрите на это, как на возможность ознакомится с манифестом, рекурсивными функциями и проходом по всем элементам управления находящимся в форме. Для других языков всё делается точно также, теми же функциями, только грамматика будет другой. Приводить её не буду, так как, на мой взгляд, тема по данному вопросу исчерпана. Безусловно, в будущем я буду использовать все языки Visual Studio.NET, однако для столь незначительных примеров в этом нет необходимости. Об их грамматических различиях вы можете узнать, щёлкнув по ссылке на MSDN Language Equivalents.

Если у вас есть какие-то конструктивные комментарии на подобие тех, что написал Sergey R. Sergin, то пишите, не стесняйтесь. Только не забывайте о том, что на письма, проходящие через subscribe.ru накладываются некоторые ограничения. Особо актуальные я опубликую в этой рассылке. Постарайтесь грамотно излагать вашу точку зрения, то есть если вам что-то не нравится, то не спешите говорить, что <всё плохо сделано, и все люди:>, а напишите, как бы вы поступили в подобном случае. Если же вам просто хочется поговорить о программировании в указанных системах, то подписывайтесь на Лист: Обсуждение VS.Net 2003, MSOffice 2003, и пишите в него о том, что вас в данный момент интересует, так как авторами статей в листах являетесь именно вы. Для подписки на интересующие рассылки используйте таблицу Подписка.

перейти к оглавлению

Подписка
Практическая работа с Visual Studio.Net и Microsoft Office Подписаться web'ом Подписаться почтой
Напиши свою собственную книгу Подписаться web'ом Подписаться почтой
Обобщённый взгляд на устройство вселенной Подписаться web'ом Подписаться почтой
Лист: Обсуждение VS.Net 2003, MSOffice 2003 Подписаться web'ом Подписаться почтой
Visual Basic для новичков и профессионалов Подписаться web'ом Подписаться почтой

Практическая работа с Visual Studio.Net и Microsoft Office
➲перейти к началу ➲перейти к концу

В избранное