Вступление
И так прошла неделя, а мыслей как не было, так и нет.
Но раз уж я обещал писать каждую пятницу, то буду держать слово.
Попробую определиться с тем, что было проделано за эту неделю.
1. Разбор скриптов на Python
2. Реализация класса онлайн помощи
3. Отлов утечек памяти
4. Поиск ошибок в коде
Думаю что наиболее значимым была реализация класса помощи.
Предыстория
Сразу хочу предупредить, что данным вопросом занимаемся по мере сил и желания.
Проект, над которым я работаю, имеет в себе огромное количество форм, часть из них достаточно хорошо документирована, другая описана поверхностно, третья не имеет описания вовсе.
Документация по проекту содержится в Word документах, а, следовательно, для её распространения требуется передавать достаточно большой объем информации, для поддержания в актуальном состоянии помнить какой документ что документирует. Так же пользователям достаточно сложно держать в памяти куда именно необходимо перейти для получения справки, и им гораздо проще позвонить в кол центр. Данная работа достаточно трудоёмка и отнимает много времени.
Был предпринят ряд попыток как то организовать документацию и неразрывно связать её с проектом.
Вот список того, что было опробовано.
1. Вести документы в 2х местах 1. в хранилище в word и на сайте организации как html.
2. Реализовать справку в одном документе и хранить его в месте с проектом;
a. Chm формат;
3. Завести отдельную ветку в WIKI организации.
Из выше описанного было испробовано всё, в хронологическом порядке. Используется только первый пункт без реализации в html.
На данном этапе развития проекта я пытаюсь внедрить 3й пункт, документацию на WiKi странице
Итак, приступим. Я не буду описывать, как поднять сервер и завести страницу, а опишу простое действие, как вызвать уже готовую страницу из проекта.
Собственно реализовано всё было на языке Pascal (Delphi)
Задача:
1. Определить текущий браузер, используемом по умолчанию, в операционной системе;
2. Запустить браузер;
3. Открыть нужную страницу.
Описание:
1. Необходимо найти запись о браузере используемом по умолчанию. В ОС Windows эта запись храниться в Реестре.
2. Необходимо указать какую именно страницу открыть для вызова справки.
Решение:
И так поёдем по пунктам
1. Определить текущий браузер.
Для определения и хранения браузера опишем в секции Private две строковых переменных. В первой (stBrPath) будем хранить путь до исполняемого файла браузера, во второй (stBrName) имя браузера. Здесь же опишем процедуру получения данных из реестра.
Принципы работы с Реестром Windows из Delphi легко можно найти в Интернете.
(Windows XP)
Браузер по умолчанию записан по следующему ключу: HKEY_CLASSES_ROOT\HTTP\shell\open\command
А имя браузера можно получить из:
HKEY_CLASSES_ROOT\HTTP\shell\open\ddeexec\Application.
Запишем эти данные в переменные
2. Определить какую страницу нам необходимо вызывать
Поскольку мы знаем исходный адрес страницы помощи, нет смысла передавать её целиком. Для решения этой проблемы предлагаю завести константу в которой будет предписана часть пути до справки.
Далее нам необходимо узнать в каком именно месте располагается справка.
В секции Private заведём ещё одну переменную доступ, к которой будет осуществляться через свойство. Читать мы будем непосредственно из переменной, а вот писать придётся через процедуру.
Процедура должна разбирать пришедшую строку и форматировать её до требуемого формата. Поскольку нам требуется html адрес можно предположить, что входная строка от разработчика может начинаться с '/' или им заканчиваться.
Я описал процедуру следующим образом:
Procedure SetHelpPath (const aHelp : sting) begin if aHelp <> '' then // проверяем, что бы нам не передали, пустую строку begin stHelp := aHelp; // записываем переданную строку в переменную объявленную в privat if stHelp[1] = '/' // проверяем первый символ на «/» then stHelp := copy(stHelp, 2, lenght(stHelp)); if stHelp[lenght(stHelp)] = '/' // проверяем последний символ на «/» then stHelp := copy(stHelp, 1, lenght(stHelp) - 1); end; end;Теперь в переменной stHelp содержится относительный путь до помощи.
Реализуем процедуру вызова справки. Опишем её в секции Public. В целом задача процедуры сводится к вызову Api функции ShellExecute.
Реализована она очень просто:
Procedure ShowHelp (); begin if stBrPath = '' then raise exception.create('Не удалось найти браузер по умолчанию'); if stBrName = '' then raise exception.create('Не удалось найти имя браузера по умолчанию'); if stHelp = '' then then raise exception.create('Не указан конечный путь до справки); ShellExecute(0,'open',stBrPath,cStartURL + stHelp,nil,SW_SHOW); end;В процедуре создания класса необходимо проинициализировать переменные и проверить входной параметр. Если он не пустой, то позвать для него процедуру SetHelpPath.
В целом класс выглядит так:
THelper = class const cStartURL = 'www.xxxxxxxx.wiki.xxxx/'; Private stHelp : string; stBrPath : string; stBrName : string; procedure GetBrPathAndName (); procedure SetHelpPath (const aHelp : sting); Public property HelpWay : string read stHelp write SetHelpPath; procedure ShowHelp; constructor Create(const aHelp : string = ''); desructor destroy; Overload; end;Использование:
1. Создать класс с указанием пути до окончательной справки.
1.1. Если путь не был указан во время создания, воспользуйтесь свойством класса HelpWay и передайте путь через него.
2. Позвать метод класса ShowHelp, для вызова справки в браузере.
3. Уничтожить класс.
Итоги
Реализация данного класса и внедрение его в проект должно способствовать более тесной взаимосвязи документации проекта и его кода. Существует надежда, что более простой доступ к справке, а также накопление её в базе WiKi, позволит решить поставленные задачи, актуализация данных, а также документирование пропущенных частей программы. Так же может идти помощь со стороны пользователя в том виде, что имея доступ к справке в одном месте он может захотеть этот доступ и там где его ещё нет.
Вот вроде и всё.
P.S. описанный выше код писался по памяти и не проверялся в IDE
А ведь когда-то в этой организации еще и DocBook использовали... Но т.к. никто не любил писать справку, а отдельных писателей не было, то это все угасло...
ОтветитьУдалитьДа и тяжеловато было XML ковырять. Wiki вроде как удобный вариант по той причине, что всё просто и всё визуально.
Вообще интересно, будет ли это нововведение использоваться пользователями?
Код желательно каким нибудь форматтером оформлять, а то читать тяжело.
А еще в private секции классов принято называть переменные с префикса F.