(Продолжение, начало см. в МК № 6, 9——10, 19, 25, 27, 29—30, 33, 36—38, 45, 48, 3, 6—7, 12—13 (125, 128—129, 138, 144, 146, 148—149, 152, 155—157, 164, 167, 174, 177—178, 183—184))10, 19, 25, 27, 29—30, 33, 36—38, 45, 48, 3, 6—7, 12—13 (125, 128—129, 138, 144, 146, 148—149, 152, 155—157, 164, 167, 174, 177—178, 183—

Старая тема: CSS

Самое время, Читатель, вспомнить о таблицах стилей в MCP. Как все, вероятно, помнят, MCP (МайКомПад) предлагает усеченную версию таблиц стилей (CSS). Основную инициативу я предлагаю Вам проявить самостоятельно — ничто не мешает Вам дополнить процедуру —Add класса StyleSheet (и аналогичным образом отредактировать класс Style) такими свойствами-аргументами как linkColor, linkFontFace и, наверное, какими-нибудь hover-атрибутами для определения поведения текста, помеченного стилем по тем или иным соображениям — короче говоря, классы —Style и StyleSheet я отдаю Вам на растерзание.

Наверняка не все читатели знакомы с принципами каскадных таблиц стилей в документах HTML. Немного ранее я слегка их коснулся этой темы, потому сейчас на ней застревать нет смысла. Подробнее об использовании будет далее (в статье о генерировании HTML и форматировании исходных кодов), а пока рассмотрим, каким образом можно реализовать генерирование такой таблички в коде Visual Basic 6.

Напомню, что основным набором стилей (коллекцией) является StyleSheet. Класс Style содержит все необходимые свойства для описания минимального набора свойств CSS-стиля. В процедуре Add класса StyleSheet эти свойства повторяются, причем добавление нового стиля в набор происходит путем создания временного объекта objMember. Здесь же описываются его свойства, исходя из такого же набора свойств класса Style (внутренняя объектная переменная objMember является его экземпляром — это метод, которым пользуется мастер создания классов ClassBuilder).

Уголок Литературного Редактора. С позволения читателя привожу цитату из моей переписки с автором, отчасти в качестве оправдательного аргумента за синтаксически неразборчивый фрагмент, отчасти как забавный пример коммуникативной неудачи. Вопрос касался местоименных конструкций предыдущего абзаца и их управления, а также несколько настораживающей избыточности дефиниций этого самого objMember (то он «временный объект», то «объектная переменная», то «метод» — и все это разные сущности). Для ясности я счел нужным сделать приписку, быть может, не вполне корректную с этической точки зрения, но, как мне казалось, достаточную, чтобы подчеркнуть прагматику вопроса: —

«Признаюсь по секрету, я не программист. Думаю, в данном случае это скорее плюс, чем минус, поскольку благодаря этому я в состоянии оценивать, так сказать, «удельную прозрачность» текста независимо от того, насколько отчетливо я понимаю этот текст и насколько я в состоянии следовать предложенным инструкциям. От меня этого не требуется, я всего лишь литредактор. Как литредактор я давно подметил, что ряд Ваших мест почти непроницаемы для читателя, не знакомого с темой, причем отнюдь не из-за специализированности текста, а просто из-за недобросовестного проговаривания материала. Если в живом общении этот недостаток с лихвой компенсируется (психологический выигрыш, приятное слуху бормотание ламера, пытающегося задавать корректные вопросы и пр.), то в публикации подобные места так и остаются открытыми язвами в смысловой ткани. Простите за критику…»

Ответ пришел незамедлительно:

«Во-первых, в таком деле, как публикации, критика со стороны редактора — нормальное явление, посему сегодня-завтра опишу Вам более подробно процесс добавления элемента в набор (—Collection)... Функция Add, возвращающая специфический для ситуации тип данных (ака Объект) предусматривает создание экземпляра — от этого никуда не деться. Бейсик есть Бейсик, есть регламентные вещи, от которых не уйти. Более того, VB не является 100-процентно Объектно-Ориентированным языком, многое в нем реализовано как имитация во имя удобства. Кроме того, выигранное удобство иногда весьма сомнительно. Другими словами, если вы удивляетесь бессмысленности кода в —Add, то остальные приколы (в частности, Закупоренность Бейсика в контексте интерфейсов — у вас нет доступа ко многим функциям, доступным в C++) Вас повергнут в шок. Вообще-то ClassBuilder делает всю грязную работу за Вас (причем не худшим образом. Плохой визард не был бы включен в дистрибутив. Функция —Add в том варианте, в котором я ее преподнес читателям, мною не изменялась, разве что немного была приукрашена — суть осталась та же) — этот процесс был описан еще на стадии «зачатия» цикла. Возможно, есть смысл описать все это снова В СТАТЬЯХ???— суть осталась та же) —

В общем, не сегодня так завтра опишу вам лично. Если вдруг редакторы посчитают необходимым, можно опубликовать эту оправдательно-объяснительную записку в журнале (т. е. газете)...»

Вот такой вот разговор получился. От дальнейших попыток докопаться до своей рутинной и неказистой истины я отказался, от комментариев тоже воздерживаюсь. Есть род текстов, к которым простому смертному лучше не притрагиваться — без поста и молитв (. — без поста и молитв :-)

Выход из Уголка.

После создания коллекции мы можем использовать ее компоненты (элементы набора) и их свойства путем перечисления по счетчику (это самый удобный, на мой взгляд, метод): StyleSheet(i).Свойство, где i — счетчик типа Integer. Почему Integer? Потому что Long забирает намного больше памяти, да и лимитов Integer`а вполне хватает для тривиальной таблицы стилей, даже самой большой в мире: грубо говоря, «потолок» для типа Integer — что-то около тридцати тысяч (.— что-то около тридцати тысяч :-)

Синтаксис CSS

Синтаксические раскладки CSS весьма просты и не должны вызвать у Вас каких-либо затруднений: вначале указывается имя стиля, после чего в фигурных скобках — набор описывающих этот стиль критериев: начертание шрифта (Font-Family), размер (Font-Size), цвет (Color). Это описание обычного текста, помеченного стилем. Однако в тексте может оказаться, например, гиперссылка — тогда браузер обязательно исказит ее отображение в соответствии со своими установками. Так, для IE это синий для «свежих» гиперссылок и лиловый для посещенных. Конечно, для кого-то это не представляется особой проблемой, однако сама идея использования стилей в документах предполагает оформление текста в обход каких-то default-параметров. Это первый побудительный мотив. Второй — особенности национального трафика: Интернет по-прежнему является «территорией», где нет места расточительству ресурсов — текстовый файл размером в 100 К загружается целую вечность. К сожалению, не всегда технологические уловки в состоянии сломить противостояние отечественных АТС и различных ограничителей трафика. Речь, однако, не об этом, а об упрощении разметки Интернет-страниц путем задания некоторых свойств Body-сегменту такой страницы. Например, указание — набор описывающих этот стиль критериев: начертание шрифта (Font-Family), размер (Font-Size), цвет (Color). Это описание обычного текста, помеченного стилем. Однако в тексте может оказаться, например, гиперссылка — тогда браузер обязательно исказит ее отображение в соответствии со своими установками. Так, для IE это синий для «свежих» гиперссылок и лиловый для посещенных. Конечно, для кого-то это не представляется особой проблемой, однако сама идея использования стилей в документах предполагает оформление текста в обход каких-то default-параметров. Это первый побудительный мотив. Второй — особенности национального трафика: Интернет по-прежнему является «территорией», где нет места расточительству ресурсов — текстовый файл размером в 100 в разделе приведет к тому, что весь Body-сектор будет помечен стилем MyBodyStyle. А указание свойств «якорей» (Anchor) в разделе `

Реализация

В МайКомПаде реализована процедура InsertCSS (она вынесена в отдельную процедуру в связи с соображениями по поводу будущей макро-автоматизации текстового редактора). Единственное, на чем я бы хотел заострить внимание — это функция определения цвета исходя из его индекса в списке. GetColor возвращает либо символьные эквиваленты типа —maroon, gold, heaven или black, либо #ffcc00, #ffffff, #000000 — все зависит уже от Вас. Принцип прост до безобразия: Select Case Index (где Index — аргумент, переданный функции). Помните, что свойство StyleColor объекта Style — числовое. Далее совсем просто: используя перебор возможных вариантов, присваиваем нужное значение результату работы функции.

Public Function GetColor(Index As Integer) As String Select Case Index Case Is = 0 GetColor = "black" Case Is = 1 GetColor = "white" Case Is = 2 GetColor = "silver" Case Is = 3 GetColor = "red" Case Is = 4 GetColor = "maroon" Case Is = 5 GetColor = "blue" Case Is = 6 GetColor = "grass" Case Is = 7 GetColor = "yellow" Case Is = 8 GetColor = "gold" Case Is = 9 GetColor = "heaven" Case Is = 10 GetColor = "aqua" Case Is = 11 GetColor = "olive" End Select End Function

Возможно, когда-нибудь будет реализовано считывание стилей из файлов, и даже переход по связующей ссылке на файл CSS — тогда логично было бы сохранять и читать стили из таких файлов, выводя их списки вообще в другом окне, а также предусматривать добавление в этот список пользовательских цветов. Однако эту тему мы рассмотрим в публикации о —Color Picker`е...

Для того чтобы описать «текст по умолчанию», достаточно создать аналогичную таблицу для Body, причем точка перед соответствующей лексемой не ставится, как не ставится и перед другими встроенными объектами HTML-страницы — —A, HR, P... Завораживает?

HR {COLOR: gold; height:100%} P {FONT-FAMILY: Helvetica, Verdana; FONT-SIZE: 12px; line-height:3.7mm; text-indent:0.4cm} P:link {COLOR: gold; TEXT-DECORATION: none} P:hover {TEXT-DECORATION: none} P:visited {COLOR: ; TEXT-DECORATION: none} Body {FONT-FAMILY: Helvetica, Verdana; FONT-SIZE: 12px; line-height:3.7mm; text-indent:0.4cm}

Вот, собственно, процедура InsertCSS, вынесенная в модуль:

Public Sub InsertCSS() Dim I As Integer, s As String For I = 1 To StyleSheet.Count s = s &amp; "." &amp; StyleSheet(I).StyleName &amp; _ " {FONT-FAMILY:" &amp; _ StyleSheet(I).StyleFont &amp; _ "; FONT-SIZE:" &amp; _ StyleSheet(I).StyleSize &amp; _ "; COLOR:" &amp; _ GetColor(StyleSheet(I).StyleColor) &amp; _ "}" &amp; vbCrLf &amp; _ "." &amp; StyleSheet(I).StyleName &amp; _ ":link {COLOR:" &amp; _ GetColor(StyleSheet(I).StyleColor) &amp; _ "; TEXT-DECORATION:none" &amp; _ "}" &amp; vbCrLf &amp; _ "." &amp; StyleSheet(I).StyleName &amp; _ ":hover {TEXT-DECORATION:none}" &amp; vbCrLf &amp; _ "." &amp; StyleSheet(I).StyleName &amp; _ ":visited {COLOR:" &amp; _ GetColor(StyleSheet(I).StyleColor) &amp; _ "; TEXT-DECORATION:none" &amp; _ "}" &amp; vbCrLf &amp; vbCrLf Next s = "<style>" & vbCrLf & _ s & _ vbCrLf & _ "</style>" &amp; vbCrLf frmMain.txtMain.SelText = s End Sub

Примечание: Для простоты я для каждого стиля указал отсутствие подчеркивания и прочих эффектов — —Text-decoration:none; первый индекс стиля в наборе — —1 (единица); таблица стилей, если она внедрена в текст самой страницы, должна быть помещена между тэгами до начала сектора . Если есть внешний файл CSS, то связь страницы с ним прописывается следующим образом:

``

Такая строка вставляется в гипертекст в разделе .

Для удобства просмотра HTML-текста с применением стилей в МайКомПаде используйте соответствующий плагин — Web Browser Preview (— Web Browser Preview ().

(Продолжение следует)