Конференция "KOL" » поддержка HtmlHelp [Delphi, Windows]
 
  • vampir_infernal (14.05.10 13:21) [0]
    Начал разбираться с htmlhelp в kol, обнаружил следующее:
    1) При подключении htmlhelp функцией AssignHtmlHelp код от использования WinHelp все равно включается в приложение, при включенной оптимизации (процедура CallWinHelp);
    2) hhctrl.ocx линкуется статически. Автор книжки "Delphi Programming for the HTML Help API" (http://www.workwrite.com/helpthink/zip/delphi_chandler.zip) утверждает, что hhctrl.ocx не всегда находится в System32. Подробнее по сылке.
    3) используется только ansi-функция HtmlHelpA.
    Но тут такой момент. Для работы HtmlHelp в версиях windows младше Win98SE требуется обновлять или hhctrl.ocx, или IE, или их обоих. А для получения полного пути к hhctrl.ocx требуется читать значение из реестра.
    Поддержка Win9x мне не особо нужна, но хочется, чтобы работало у всех.
    В результате получилось следующее:
    1) ввел директивы компилятора USE_HTML_HELP и USE_WIN_HELP, USE_WIN_HELP задана по-умолчанию (по аналогии с OLD_ALIGN и NEW_ALIGN). Если задана USE_HTML_HELP, то подключается только код для htmlhelp, аналогично с winhelp.
    2) глобальную переменную HelpFilePath привел к PKOLChar, в методе TControl.SetHelpPath заменил StrCopy на CopyMemory.
    3) в методе TControl.GetHelpPath в случае, если HelpPath не задан, то в зависимости от директивы USE_HTML_HELP берется путь до исполняемого файла программы с расширением hlp либо chm.
    После этого AssignHtmlHelp и HtmlHelpCommand становятся не нужны вообще.
    Линковку оставил статическую, с объявлением в kol_unicode.inc и kol_ansi.inc для HtmlHelpW и HtmlHelpA соответственно.
    Теперь интересует мнение сообщества во главе с Владимиром: как быть с поддержкой HtmlHelp в Win9x и методом загрузки hhctrl.ocx?
    Код не выкладываю сознательно, так как если Владимир хотябы часть из этих идей одобрит, то проще будет сделать upd-файл для детального ознакомления.
    Спасибо, надеюсь я это не зря затеял.
  • Vladimir Kladov © (14.05.10 16:39) [1]
    Почему бы и нет, если это работает. Если динамическую загрузку HtmlHelp, то - тоже по директивам, судя по всему, размер может отличаться несколько: нужно лезть в реестр за полным путем к просмотрщику html help'а.

    Кстати, а вы в курсе, что в Windows 7 (и кажется, в Vista/Win2008Server), наоборот, изначально нет поддержки WinHlp32? Правда, там, кажется, есть стаб-заглушка, которая выводит на экран объяснение по этому поводу и предлагает скачать с microsoft.com соответствующую версию WinHlp32, заодно проверив легальность ОС. Т.е. обращаться к API старой справочной системы по-прежнему относительно безопасно.

    Что до меня, то я сторонник минимализма. Идеальная справочная система для разработчика - это html без всяких htmlhelp. В ней не очень удобно выполнять поиск по всей справке, но в случае достаточно компактного и структурированного описания вообще не нужно ничего искать. При этом даже не обязательно обеспечивать контекстный вызов справки, достаточно открывать главную страницу справки с оглавлением. Т.е. достаточно shellexecute, чтобы вызвать отображение нужного документа html в браузере по умолчанию, и все заморочки оставить в стороне.

    Недавно я вынужденно поставил Windows7 (цель - раздать инет с ноутбука по вай-фай на 2 других домашних компа - жене и сыну, Ad-Hoc сеть работала из вон рук плохо, с Win7+Connectify получилась виртуальная точка доступа, ничего и делать не пришлось). Так вот, заморочками новой оси я страшно недоволен. Может, конечно, сказывается то, что переход произошел минуя стадию сВисты, но очень большие и непонятные изменения во всем. Впервые с win95 я вынужден отказаться от explorer в качестве файлового менеджера. Интерфейс стал совершенно неудобным в работе: вмещается в окно мало, в том же экране, некоторая контекстная информация (размер файла, дата изменения) в режиме списка (другие режимы я не пользовал практически никогда) видны только в специальной панели, которая отжирает целых 2 строки экрана, статусная строка стала бесполезной, там показывается только число выделенных элементов, зачем-то выделена целая строка под контекстное меню (начиная со слова Упорядочить), причем за целую неделю возни с новой системой понадобилась эта строка только раза три, причем только пункт Упорядочить. +единственая полезная кнопка в этой же строке для изменения вида. Причем полезная только потому, что при заходе в папку, в которой есть хотя бы одна картинка или музыкальный трек, мой список, установленный для всех папок, все равно игнорируется, и высвечивается режим эскизов (ненавижу).

    Короче, господа, я поискал и взял Q-Dir вместо эксплорера. Пока устраивает, хотя совсем небольшие огрехи в нем имеются. Хотелось бы иметь в QDir свой поиск файлов и нормальный драг файлов извне, а так - чисто прежний ХР-шный проводник (х4), плюс расцветка имен файлов и папок, которой от мелкософтовцев так я и не дождался. Как будто это невесть какая сложная функциональность, что аж суппер-пуппер.

    И все это я пишу к чему. Вот выйдет Win8 - и пропадет труд ваш по созданию htmlhelp-справки. Лучше плюньте и сделайте обычную html-страницу. Полная платформенная независимость гарантируется. Только не надо модными технологиями перегружать (типа asp, java). Просто html+css+картинки.
  • vampir_infernal (14.05.10 18:03) [2]
    Владимир, похоже мы говорим о разных вещах. WinHlp32 - это для просмотра .hlp файлов. По запросу "WinHlp32" гугл мне выдал много ссылок про то, что в Win7 отказались от поддержки hlp-справки в пользу chm, и с предложениями скачать тот самый WinHlp32.exe для просмотра hlp. Хотя и chm уже тоже признан устаревшим, от него будут отказываться.
    Насчет справки в виде html+css+картинки согласен, обычно так и делаю, но тут случай особый.
    Буду продолжать работу в этом направлении, о результатах сообщу.
  • Vladimir Kladov © (14.05.10 18:33) [3]
    Нет, не о разных. Как в Windows 6.1+ оказались от включения winhlp32, так могут отказаться и от htmlhelp в Windows8 или 9. Причем, тенденция уже имеет место: производители софта все чаще отправляют по нажатию F1 на свои сайты в интернете. И не только браузеры (Opera), но и антивирусы (Avast!, NOD32), и некоторые другие приложения, вплоть до шареварных. Вывод: они улавливают, куда дует ветер, и берегут свои силы.

    Закончите, сообщите, да. Мы включим, особенно если будет минус в размере и плюс в многоплатформенности.
  • QAZ (15.05.10 22:33) [4]

    > Интерфейс стал совершенно неудобным в работе: вмещается
    > в окно мало, в том же экране, некоторая контекстная информация
    > (размер файла, дата изменения) в режиме списка (другие режимы
    > я не пользовал практически никогда) видны только в специальной
    > панели,

    неправда, в режиме таблици доступны все свойства файла,все настраиваеца
    поповоду перехода к режим эскизов-тоже настраиваеца

    > плюс расцветка имен файлов и папок, которой от мелкософтовцев
    > так я и не дождался. Как будто это невесть какая сложная
    > функциональность, что аж суппер-пуппер.

    мелкософтовцы дали возможность это сделать любому програмисту за счет расширений оболочки
    толька програмисты каковата хрена предпочитают плодить клонов нортон\тотал командеров,а написать расширение експлорера, типа западло-луче плагин к тоталу сделать...
  • Vladimir Kladov © (16.05.10 13:51) [5]
    Я таблицы не использую. Кроме уровня Компьютер, они мне неинтересны. Вообще, список в семерке сделан неплохо, даже колонки разной ширины. Но нет отображения нужной мне в этом режиме информации (размер, дата изменения) - в одну строку. Вместо этого есть отображение этой и еще не нужной мне информации в две строки.

    Кстати, в проводнике для режима список так и осталась фича: если эксплорер считает, что колонка, по файлу в которой кликнули, не входит в экран, и она не первая, то он скроллирует окно. Если вы делаете двойной клик, то второй клик приходится уже на файл, который кликать вы не собирались. Хорошо еще, второй клик в этом случае не воспринимается как двойной.

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

    О, я вчера нарвался. Они там хвалились, что калькулятор и паинт улучшили. Открыл я в паинте старый черно-белый рисунок. Карандаш правой кнопкой мыши не рисует. Т.е. сначала вроде бы рисует, но стоит отпустить клавишу мыши - восстанавливает картинку как до нажатия правой. Левая -нормально. Новая картинка, хоть ч/б, хоть цветная -нормально. То ли формат битмапа ему не нравится, то ли что еще. (Ну не нравится, так и скажи - зачем тогда его загружаешь и даешь редактировать).  Обошелся Image Edit'ором из Delphi.

    С сетью вчера проблема была. Так мне прежде чем в тех поддержку звонить - минут 15 пришлось разбираться как выдать на экран окошко с мак-адресом и IP. Как было это просто в ХР, и как совершенно нелепо это задвинуто в семерке, что только по кругу водит (за нос), а нужное окошко найти... (Да знаю я про ipconfig, только там теперь так много выдается, что листать замучишься - гуи оно тем и хорошо, что все изменения сразу видны на экране).

    Не, я говорю, семерка - это не ОС, это квестовая игруха такая. И не надо хвалить эту ось - ерундень полная. Даже справку нормальную написать не могут. Практически все, что удалось найти - только благодаря прямому конкуренту МС - Гуглу.

    А вот еще прикол. Я поместил, как всегда, панель задач на правый край экрана. Такой способ размещения экономит вертикальный размер экрана, больше видно в документах, браузерах, и др. текстах. Кнопка Пуск при этом оказывается в верхем правом углу. В 7-ке кнопка для завершения работы теперь выпадает в правой нижней части главного меню. Треугольничек вправо для выбора пункта, отличного от по умолчанию, тоже справа. Угадайте, где появляется меню с пунктами Сменить пользователя-Выйти из системы-...-Завершние работы. Слева. От пункта по умолчанию. Нужно очень резко прыгнуть мышью в направлении этого меню, чтобы успеть до него добраться, пока оно не исчезло с экрана. Раза с третьего у меня (после некоторой тренировки) стало получаться.

    7-ка - это не только квест, это еще и аркада. С тренировкой на скорость реакции и мышедрыга.

    Программисты правильно соображают: нет никакого смысла за бесплатно расширять проводник. В следующей версии все наработки пойдут прахом, потому что АПИ изменится на 200%.

    Кстати, в KOL придется изменить процедуру GetDesktopRect. В 7-ке не работает правильно, окошко с классом SHELLDLL_DefView теперь мало того, что не там находится (говорят, что под WorkerW, но я его вроде бы нашел опять под Progman'ом), так еще и возвращает просто размеры экрана. Правильнее обращаться теперь к GetWorkArea.

    Я не люблю Norton/Total/Far. Но новый проводник я не люблю еще больше, чем всех этих трех вместе взятых. (Вот бы - мечта идиота - просто иметь возможность в качестве проводника запустить проводник от ХР под 7-кой. Увы).
  • QAZ (16.05.10 16:06) [6]

    > В следующей версии все наработки пойдут прахом, потому что
    > АПИ изменится на 200%.

    документированное апи никогда неизменится
    это гарантия совместимости которую винда блюдЁт по полной
    ато что > в KOL придется изменить процедуру GetDesktopRect
    так это ваш косяк-использование "самопального" против родного, как в GetWorkArea. я уж молчу про пэйджсайз у скролбара...
  • Vladimir Kladov © (16.05.10 16:44) [7]
    GetWorkArea до Vist'ы и 7-ки никогда правильно не работал. Всегда находились условия, когда он врал. Да достаточно было таскбар в другое место положить, или еще какой тулбар запустить по стеночке. И посмотрите как много народу использует получение окна SHELLDLL_DefView. В основном, правда, для доступа к иконкам рабочего стола. Но я этот рецепт тоже в свое время не с потолка взял, поиском в интернете.

    Косяк - это изначальное отсутствие в системе функций API, выдающих нужные данные прямым запросом, а не через заднее крыльцо. Не было, к примеру, API для управления ассоциациями, в итоге вышло так, что теперь на уровне системы приходится встраивать компонент (Программы по умолчанию) для борьбы с войнами ассоциаций.

    То же и с pagesize в скроллбаре. У меня как раз сделано нормально. Если брать то, что предлагает API, то получается лажа в чистом виде. Я, кстати, не против того, чтобы кто-либо делал реализацию по-своему. Есть ifdef'ы, альтернативный код, если будет работать лучше, можно и основным сделать. Что-то никто не берется.

    API меняется, только не все это замечают. Например, от версии к версии DirectX не только появляются новые функции, но и старые изменяются или исчезают. С Open GL такой несовместимости ни разу не замечено: то, что сделано для старой версии, пойдет и на новой. Потому что это не МС.
  • QAZ (16.05.10 17:58) [8]

    > Что-то никто не берется.

    по поводу скролбара я все описал в http://pda.delphimaster.net/?id=1269716585&n=10
    и картинку приложил

    >  Если брать то, что предлагает API, то получается лажа в
    > чистом виде

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

    > Например, от версии к версии DirectX не только появляются
    > новые функции, но и старые изменяются или исчезают

    в директе добавляются не функции,а новые интерфейсы с новыми функциями
    а все старые остаются в предудущих интерфейсах,а не исчезают
    т.е. в текущем дх11 присутствую все предыдущие начиная с дх5
    по поводу совместимости вобще даже не стоит спорить
    у меня в семерке без вопросов работают игры и софт под дх7

    зы предлагаю какуюнить тему для боданий создать :)
  • Vladimir Kladov © (16.05.10 19:46) [9]
    По скролбару вопрос несколько ушел в сторону МСК, и я не помню уже ответил или нет. Отвечу на всякий случай. Вы можете считать, что pagesize показывает, сколько осталось скроллировать, но это не так. SBMax должен быть достижимой позицией для SBPosition. Если вы допускаете такую кривую работу того же мемо, когда можно скроллировать текст ниже самой нижней строчки, тогда да, все ОК - по-вашему. Но по-нашему это не ОК. Для того, чтобы текст из 100 строк правильно отображался, достаточно учесть в SBMax то максимальное значение, которое сможет принимать SBPosition. Это значение есть 100-SBPageSize. Для случая, когда влазит в окошко 50 строк, это как раз 50. А в случае, когда SBMax=100 и SBPageSize=50, общее число строк = 150, как раз потому, что при значении SBPosition=100 на экране все еще видно 50 последних строк текста.

    Если уж о формулировках спорить, то в скролбаре, сколько осталось скроллировать, показывает не размер тумбочки, а остаток размера скроллбара ниже-правее этой тумбы.

    С директом я имел конкретные траблы, когда брал пример, собранный для DX7 и пытался его откомпилировать на DX8. С тех пор у меня никакого желания использовать DX нет вообще.

    На 7-ке работает вообще все. Правда, паре-тройке программ пришлось включить режим совместимости с ХР. Иначе на панели задач зависает кнопка, которая ничего не делает при нажатии, при наличии второй кнопки того же приложения на той же панели задач.
  • QAZ (16.05.10 21:40) [10]
    с определением я малясь ошибся :(
    визуально pagesize показывает отношение числа строк показываемых в окне и числа строк вообще
    и по его размеру человек сразу видит насколько большей список
    т.е. если строк 100 а в окне умещается 50 то размер pagesize должен быть ровно половину скролбара

    http://narod.ru/disk/19441012000/kosyak.jpg.html


    > Если вы допускаете такую кривую работу того же мемо, когда
    > можно скроллировать текст ниже самой нижней строчки, тогда
    > да, все ОК - по-вашему. Но по-нашему это не ОК.

    чета я такого не встричал нигде

    в принципе мне не впадлу в каждой версии кол править это самому
    но я считаю что все проблемы от того что люди пытаются исправить "косяки" которые документально прописаны и в msdn и в sdk
    и если какойнибуть "Вася" поправит "косяки" в заголовках для DX, то не надо удивлятся что пример для DX7 не компилируется на DX8
  • Vladimir Kladov © (17.05.10 12:14) [11]
    Просто вы думаете, что SBMax - это "число строк в тексте". А это не оно, это число позиций, которые может принимать SBPosition. Т.е. число строк, которые могут стать первыми в странице окна. Так сделал Microsoft.

    Пожалйста. Если вам не в падлу видеть последнюю строку задвинутой выше первой строчки экрана, и пустой экран, когда бегунок в нижнем положении.
  • QAZ (17.05.10 12:38) [12]

    > видеть последнюю строку задвинутой выше первой строчки экрана,
    >  и пустой экран, когда бегунок в нижнем положении.

    а можно пример, я прям реально не представляю как и где это можно наблюдать с апишным скролом
  • QAZ (17.05.10 15:44) [13]
    а вот от меня пример
    http://narod.ru/disk/20833716000/scrollbartest.rar.html
    таскаем скролбары до полного просветления
 
Конференция "KOL" » поддержка HtmlHelp [Delphi, Windows]
Есть новые Нет новых   [120349   +19][b:0][p:0.001]