пятница, 7 августа 2009 г.

Реализация класса, вызова справки из WiKi.

Вступление
И так прошла неделя, а мыслей как не было, так и нет.
Но раз уж я обещал писать каждую пятницу, то буду держать слово.
Попробую определиться с тем, что было проделано за эту неделю.
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


1 комментарий:

  1. А ведь когда-то в этой организации еще и DocBook использовали... Но т.к. никто не любил писать справку, а отдельных писателей не было, то это все угасло...
    Да и тяжеловато было XML ковырять. Wiki вроде как удобный вариант по той причине, что всё просто и всё визуально.
    Вообще интересно, будет ли это нововведение использоваться пользователями?

    Код желательно каким нибудь форматтером оформлять, а то читать тяжело.
    А еще в private секции классов принято называть переменные с префикса F.

    ОтветитьУдалить