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

Бизнес с высокой прибылью

  Все выпуски  

Черный ящик. Эпизод первый: от компьютера - к бизнесу


Информационный Канал Subscribe.Ru

Работа над программой

Работа над программой

Всем доброго времени!
Как я уже написал, новую версию 1.2 программы можно загрузить отсюда:
http://blackbox.mailru.com/program/download.htm

Интерфейс, меню и операции со списком слов

Перед началом переделки программы встал вопрос - как работать с документами, какой выбрать подход - однодокументный ("SDI") или многодокументный ("MDI")? В предыдущей версии была работа только с одним списком слов. В моих ближайших планах - добавить "фильтрацию" результатов, т.е. возможность вычеркивать из результатов слова, которые есть в списке стоп-слов. (Это слова, которые часто встречаются в тексте, но обычно выполняют служебные функции и не имеют глубокой смысловой нагрузки. Обычно к ним относят артикли, предлоги, междометия, вводные слова, наречия и т.д.) Эта операция требует работы с двумя документами. Дальше хочу ввести операции над двумя списками слов, чтобы получать их пересечение, объединение и разность. Чтобы это было не сложно добавить я и решил делать программу как "MDI-приложение".

Для многодокументного приложения нужны команды для расположения окон на экране (они автоматически создаются в меню "Window"), а также команды в меню "Файл" ("File"): "Новый" ("New"), "Открыть" ("Open"), "Сохранить все" ("Save All") и "Закрыть все" ("Close All").

Документ - это набор записей. В каждой записи - строка и число (смотри http://blackbox.mailru.com/issue/9.htm). Как отображать такой документ на экране? В предыдущей версии увидеть можно было только результат работы программы - текстовый файл с отсортированным набором записей. В новой версии такой фокус не пройдет - нужна возможность редактирования записей. Наиболее естественный компонент для отображения - это TStringGrid.

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

Кроме самого списка слов, пользователю может понадобиться общее количество и количество разных слов в обработанных текстах. Эти числа отображаются в двух TLabel, которые лежат на TPanel, которую тоже можно убрать с экрана. Итого, в меню "View" включил четыре команды для управления видом данных.

Какие операции и виды действий над документами должны быть в программе?

  • Добавление: текста, слова.
  • Удаление: слова, набора слов.
  • Правка: отдельной записи, группы записей.
  • Какие-то другие (информационные) операции.

Очевидно, что операции можно разделить и по "объекту воздействия":

  • Действие над всем списком записей.
  • Действие с одной (несколькими) записью.
  • Действие над одним элементом записи.

В предыдущей версии программы были реализованы только действия над всем списком записей.

Что есть в новой версии.

Начнем с добавления текста. Новый текст можно взять из файла на диске или из какой-то другой программы - через буфер обмена. Для первого (и главного) способа предназначена команда "Добавить текст" ("Add Text") в меню "Файл" ("File"). При этом появляется диалоговое окно выбора файла, в котором надо указать нужный текстовый или html-файл. Второй способ: по команде "Вставить текст" ("Paste Text") из меню "Правка" ("Edit"), появляется окошко с текстовым содержимым буфера и если пользователь нажимает "Да" ("Ok"), то слова из этого текста добавляются к списку. В любом случае работа идет с документом из активного дочернего окна. Если ни одного окна нет, то перед командой "Добавить текст" автоматически выполняется команда "Новый" ("New") из меню "Файл" ("File").

Для добавления слова, по команде "Добавить слово" ("Add Word") из меню "Правка" ("Edit"), появляется окошко для ввода слова и его количества.

Операция удаления. Для удаления одного слова предусмотрена команда "Удалить слово" ("Delete Word") из меню "Правка" ("Edit"). После подтверждения, удаляется текущая запись (на которой находится курсор в таблице StringGrid). После этого, как и после других операций, оба StringGrid перерисовываются.

Все операции удаления групп слов выделены в отдельное подменю "Удалить" ("Delete") в меню "Правка" ("Edit"). Сейчас есть пять вариантов удаления слов.

  • Удалить короткие слова ("Delete Short Words") - позволяет выбрать минимальную длину слов, которые нам нужны, а слова меньшей длины из списка вычеркиваются.
  • Удалить редкие слова ("Delete Rare Words") - позволяет вычеркнуть из списка слова, которые редко встречались, минимальное количество можно выбрать.
  • Оставить только лучшие слова ("Keep Top Words") - удаляет все, кроме нужного числа лучших, т.е. самых частых слов.
  • Удалить слова, составленные только из цифр ("Delete Digit") - когда писал эту строку, понял, что такие слова лучше отфильтровать заранее и вообще не включать их в список.
  • Очистить список ("Clear All") - удалить все записи.

Правка отдельной записи сделана в виде двух различных команд из меню "Правка" ("Edit"):

  • "изменить количество" ("Edit Count");
  • "изменить слово" ("Edit Word").

Разница в том, что когда меняется слово нужно не просто пересортировать список, но и проверять - может новое слово уже есть в списке. Конечно, можно было сделать и одну команду, а после нее проверять - изменилось ли слово.

Из операций для обработки всего массива записей сейчас реализована только одна: объединить похожие слова ("Group Similar Words") в меню "Правка" ("Edit"). Она позволяет объединить слова, которые отличаются только своими окончаниями. Другая важная операция - удаление стоп-слов еще не реализована. Операции с двумя списками слов тоже появятся в следующих версиях.

Другие операции. Есть операция "Найти/Перейти к слову" ("Find / Go to Word") в меню "Правка" ("Edit"), - так легче находить нужное слово в больших списках, особенно когда нужно найти его в сортировке по количеству.

Есть возможность получить результат в текстовом виде, как это было в предыдущей версии - команда "Внешний просмотр" ("External Viewer") в меню "Вид" ("View"). (Мне уже написали, что обычно эта команда выдает ошибку - пытается создавать файлы с нехорошими именами - в следующей версии исправлю.) В том же меню еще две команды: "Статистика" ("All statistics") для просмотра и сравнения количества слов во всех открытых окнах, "История" ("History") - показывает список основных операций, которые были выполнены над активным списком.

Начал, но еще не сделал меню "Опции" ("Options"). В меню "Помощь" ("Help") пока две команды - показать информацию о программе ("About") и пойти на сайт ("Goto WWW page").

Логика программы

Функциональность программы реализована на трех уровнях (в трех модулях):

  1. Уровень главной формы (интерфейс программы).
  2. Уровень дочерней формы (интерфейс документа).
  3. Уровень класса-списка записей (функциональность документа).

Есть еще несколько вспомогательных форм - диалоговых окон.

Какие возникали сложности:

  1. Не сразу получилось разделить все операции по уровням. Некоторые переносил уже два раза :) И сейчас некрасиво выглядят некоторые вызовы методов объектов из других модулей.
  2. Включение и выключение пунктов меню. Когда нет открытых окон, то многие операции должны быть недоступны. Некоторые операции с данными имеет смысл делать только один раз, и после отключать эти пункты меню. Простым выходом было бы сделать отдельные меню: для общих операций - в главной форме, а для операций с выбранным документом - меню в дочерней форме. Но для многих пользователей такое решение оказывается слишком сложным :(. Еще хуже могут быть только программы, в которых пункты меню динамически делаются видимыми или невидимыми. Я наблюдал, в какой тупик попадают пользователи подобных программ, когда пытаются найти команду, которая "только что тут была" :).
  3. Операции со всеми открытыми документами. Простой цикл по всем дочерним окнам почему-то не всегда давал нужный результат. Возможно потому, что некоторые мои процедуры работают с активным окном как с ActiveMDIChild. Нужное выполнение операций получил только с таким кодом:
    Cascade; // расположить дочерние окна
    for I := MDIChildCount-1 downto 0 do // цикл по окнам по убыванию
     with MDIChildren[I] as TMDIChild do
      begin
       // то, что надо сделать с каждым окном
      end;
  4. Как должна вести себя программа - какой вариант выбрать?
    • Командный - без наворотов, делать только то, что приказал пользователь.
    • Интерактивный - серия диалоговых окон или "мастер работы".
    • Пакетный - сразу все делать автоматически.

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

А сейчас можно пойти на http://blackbox.mailru.com/program/download.htm скачать себе "Wordstat" v. 1.2 (размер 200Кб) и попробовать его в деле. А потом написать мне письмо с критикой и замечаниями.

Тема следующего выпуска: Выбор Домена-2.


Ведущий проекта - Алексей.

Есть что сказать? пишите сюда: blackbox@mailru.com
Все, что вы напишете, может быть использовано для вас в рассылке (в том числе ваша подпись под письмом).
Если вы против публикации своего письма, укажите тему письма "секретно" или "не публиковать".

По вопросам идеология проекта - смотри идеи Школы своего Дела (ШСД).
Рекомендую: лучшие рассылки по бизнесу и развитию личности .

Архив выпусков рассылки находится здесь http://blackbox.mailru.com



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное