<mikekaganski>
В начале функция будет почти как у Питоньяка
<kompi>
я так не могу
<mikekaganski>
как?
<kompi>
мне нужно понимание, что я делаю
<mikekaganski>
я и объясняю
<mikekaganski>
по-русски
<mikekaganski>
и мне приходится стирать то, что я написал, чтобы ответить на "я так не могу"
<mikekaganski>
итак: функция должна получить объект окна, который знает обо всех шрифтах
<kompi>
да
<mikekaganski>
Питоньяк показывает, как это сделать: объявляет переменную "окно" (oWindow), и затем присваивает ей значение ThisComponent.getCurrentController().getFrame().getContainerWindow()
<mikekaganski>
Мы делаем то же самое, здесь ничего менять не нужно
<mikekaganski>
У окна есть функция getFontDescriptors, которая возвращает объект "перечень описаний шрифтов"
<kompi>
угу, сделали
* kompi
копипаст-"программист"
<mikekaganski>
вначале это нормально
<mikekaganski>
так вот, этот объект - это ещё не совсем тот список, который нам нужен.
<mikekaganski>
чтобы заполнить листбокс, нам нужно либо в цикле добавлять в него по одной строке, либо единовременно отправить в него сразу большой список строк
<mikekaganski>
давай начнём с первого
<mikekaganski>
итак, как и у Питоньяка, давай получим тот объект - перечень шрифтов - в переменную oFonts
<mikekaganski>
сделал?
<kompi>
oFonts()=oWindow.getFontDescriptors()
<mikekaganski>
да
<mikekaganski>
теперь, поскольку это массив объектов-описателей шрифтов, мы можем в цикле получать у каждого объекта имя шрифта
<mikekaganski>
Цикл показан у Питоньяка (индекс i последовательно меняется от наименьшего индекса массива до наибольшего)
<mikekaganski>
но делать внутри цикла мы будем немного другое
<kompi>
а что за иФ внутри? что он проверяет?
<kompi>
ааа
<mikekaganski>
Между For и Next у нас будет только одна строчка
<mikekaganski>
Эта строчка будет, собссна, добавлять имя шрифта в листбокс
<mikekaganski>
Добавление одиночной строки в листбокс делается методом oListBox.AddItem(string, n)
<mikekaganski>
где string - это просто строчка, которая появится в списке, а n - это позиция (порядковый номер), где она появится
<mikekaganski>
В качестве порядкового номера мы можем пока использовать просто тот самый i
<kompi>
строка в цикле ничего ничему не присваивает?
<mikekaganski>
То есть для каждого значения i (которое последовательно принимает значения от наименьшего до наибольшего индекса списка шрифтов) мы добавляем имя этого шрифта в наш листбокс в соответствующую позицию
<mikekaganski>
она добавляет
<mikekaganski>
вопросы?
<kompi>
я не понял строку в цикле
<mikekaganski>
По-русски это будет примерно так:
<kompi>
для меня это выглядит как просто перебор, который никуда дальше не идет, поскольку не сохраняется
<mikekaganski>
"Листбокс! Добавь к себе в список имя шрифта i в позицию i"
<mikekaganski>
В общем-то почти всё для начала. Сейчас ты увидешь много недоделок, но для начала достаточно. Осталось только вызвать эту процедуру в нужном месте
<mikekaganski>
Когда же нам заполнять список?
<kompi>
когда юзер нажал мышкой на выпадающий список в диалоге
<mikekaganski>
это нужно делать после того, как окно создано, но до того, как пользователь его увидел
<kompi>
э?
<mikekaganski>
нет, не когда мышкой
<kompi>
пачЕму?
<mikekaganski>
Потому что это должно делаться один раз, а не каждый раз при нажатии. Или ты думаешь, что список будет каждый раз новый?
<kompi>
хм
<mikekaganski>
у тебя есть процедура, которая открывает диалог
<kompi>
есть
<mikekaganski>
DialogFormattingShow
<mikekaganski>
в ней oDialog = LoadDialog("FAF", "FaF") собственно создаёт диалог, а oDialog.Execute() - показывает его пользователю
<kompi>
угу
<kompi>
между ними надо вставить вызов процедуры со списком?
<mikekaganski>
между ними и нужно сделать
<mikekaganski>
да
<kompi>
как вызывается процедура?
<mikekaganski>
пишется её имя, а потом в скобках - то, что ты в неё передаёшь
<mikekaganski>
в данном случае процедура называется FillFontsList, а передать в неё ты должен листбокс
<kompi>
FillFontsList(oListBox)?
<kompi>
или листбокс из диалога?
<mikekaganski>
именно из диалога
<mikekaganski>
ты его уже использовал в другой процедуре
<mikekaganski>
Здесь я не описываю весь алгоритм по шагам - просто возьми его себе. Это нормально, поскольку это алгоритм общего назначения, фактически, библиотечная функция, которую ты используешь как чёрный ящик
<mikekaganski>
это процедура, помести её куда-нибудь перед своими процедурами
<kompi>
и перед открытием диалога?
<mikekaganski>
и использовать её мы будем так: quicksort(массив, индексМин, индексМакс)
<mikekaganski>
нет ещё
<mikekaganski>
эта процедура сортирует массив (строк или чисел). А у нас нет никакого массива строк
<kompi>
а?
<kompi>
это я понял
<mikekaganski>
Мы не создавали массива строк, а просто в цикле добавляли по строке в листбокс
<mikekaganski>
теперь мы слегка подрихтуем нашу FillFontsList
<mikekaganski>
Мы перед циклом создадим массив, в цикле его заполним (вместо добавления в листбокс), после цикла отсортируем, а потом одним движением запихнём в листбокс
<mikekaganski>
Для создания массива нужно, как и раньше, воспользоваться оператором Dim
<mikekaganski>
но, поскольку это массив, мы должны указать его границы
<mikekaganski>
Dim sFonts(LBound(oFonts()) to UBound(oFonts())) As String
<kompi>
угу
<mikekaganski>
Эта строка (которую помести после того, как ты получил oFonts) делает следующее: объявляет переменную sFonts - массив с индексами, такими же, как у oFonts
<mikekaganski>
но это массив именно строк, а не объектов-описателей шрифтов, как oFonts
<kompi>
афк 5 мин
<mikekaganski>
ок
<kompi>
здесь
<kompi>
mikekaganski: ^
<mikekaganski>
ок
<mikekaganski>
Итак: теперь, вместо того, чтобы в цикле добавлять строки в листбокс, мы будем добавлять их в наш массив
<mikekaganski>
здесь будет твоё долгожданное присвоение
<kompi>
=)
<mikekaganski>
sFonts(i) = oFonts(i).Name
<mikekaganski>
В элемент массива строк (с индексом i ) мы записываем имя шрифта из oFonts (с тем же индексом)
<mikekaganski>
вопросы?
<kompi>
это ясно
<mikekaganski>
ок
<kompi>
и теперь мы имеем массив
<mikekaganski>
после цикла (т.е. после Next) мы вызовем тот самый quicksort
<mikekaganski>
sFontName или sTypeFont? Ты ж смотри
<mikekaganski>
это именно то, о чём я говорил вчера
<mikekaganski>
лучше использовать Option Explicit
<mikekaganski>
у тебя ж переменная называется sTypeFont
<kompi>
погоди
<kompi>
да, сори
<kompi>
все ОК, работает
<mikekaganski>
:)
<mikekaganski>
для этого мы и делали все те движения
<kompi>
я вот думаю
<kompi>
с точки зрения юзабельности, лучше чекбокс или лучше до нот чейндж
<mikekaganski>
а есть много способов сделать одно и то же :)
<mikekaganski>
и учти: если ты хочешь чекбокс, то его отключение должно делать листбокс неактивным
<kompi>
конечно!
<kompi>
в этом и суть
<mikekaganski>
так что некоторые вещи, являясь практически идентичными с тз юзабилити, очень неидентичны для программирования
<kompi>
убрал чекбокс, сделать с текущим шрифтом ничешго нельзя
<mikekaganski>
на мой взгляд, это глупости
<mikekaganski>
если пользователю всё понятно, глупо считать, на сколько десятых процента одно понятнее другого
<mikekaganski>
а многие тупо этим и заняты
<kompi>
хз
<kompi>
mikekaganski: я так понимаю, сейчас мы берем текущий документ и весь его проверяем на предмет "Это формула Math?", если да, то шаманим, если нет, то чекаем следующий объект, так?
<mikekaganski>
именно
<kompi>
чтобы чекать только некий выделенный диапазон в документе наверняка есть какой-то простой метод?
<mikekaganski>
а продолжение (обработка выделения) - в следующем номере :)
<kompi>
ахаха
<kompi>
ок
<kompi>
тут наверное придется с чекбоксом выделываться, это ж другой вариант...или радиокнопки...
<kompi>
э?
<kompi>
mikekaganski: меня смущает зависон либры при инсталле расширения, вот это беда реальная