1 (изменено: wisgest, 2013-08-31 02:27:15)

Тема: HTA: отображение анимированной заставки

Коллекция скриптов и идей — HTA: отображение анимированной заставки

1) Выводить заставку перед запуском приложения на заранее заданное время — дурной вкус, имеет смысл делать это на время необходимое для полной загрузки (инициализации) приложения. Как быть в таком случае при использовании отдельного hta-файла: как его прикрутить к выполняющему полезную работу скрипту? — вопрос не раскрыт (в случае HTA можно бы окно заставки создавать через window.showModelessDialog()).

2) Рассмотрим строки:

        <meta charset="windows-1251">
        <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
        <meta http-equiv="Content-Language" content="ru">

— первые две задают одно и то же, одну из них надо убрать (я бы убрал первую), а с учётом того, что не используются не-ASCII символы можно убрать обе; третья здесь бесполезна и, к тому же, ложна (весь немногочисленный текст — на английском).

3) Не стоит полагаться на .commandLine — это свойство может содержать путь к файлу отличному от загруженного в данный момент в окно HTA или вообще быть пустым (правильно использовать location или document.URL)!
Да и не надо его узнавать:
так как файл изображения находится в том же каталоге что и HTA, в атрибуте src можно указать относительный путь, но прочтя соответствующее атрибуту свойство .src уже можно будет узнать полный путь к файлу изображения и вывести его, если произойдёт ошибка при загрузке изображения (а ошибкой будет не только отсутствие файла, но и, например, его неправильный формат!).

4) Размеры же изображения можно узнать обратившись к его свойствам .width и .height, если явно не заданы соответствующие атрибуты, — а зачем их задавать, если размеры окна всё-равно подгоняются к размерам изображения?

5) Явный недочёт: после вывода сообщения об отсутствии файла изображения окно HTA остаётся открытым ещё какое то время.
В идеале же до этого момента его вообще не следовало бы делать видимым.


С учётом (2-5) можно сделать так:

<html>
<head>
<title>Splash</title>

<style type="text/css">
html {background-color: buttonface;}
body {margin: 0px; padding: 0px; border-width: 0px; overflow: hidden;}
</style>

<script language="VBScript">
Option Explicit

With window
  .resizeTo 0, 0
  .moveTo 0, -500
End With


Sub onImgLoad()
  Set Img.onload = Nothing 'защита от повторных вызовов для анимированных GIF

  Dim width, height
  width = Img.width: height = Img.height

  With window
    .moveTo (.screen.availWidth - width) \ 2, (.screen.availHeight - height) \ 2
    .resizeTo width, height
    .setTimeout "window.close()", 5000
  End With
End Sub


Sub onImgError()
  Dim path: path = unescape(Img.src)
  MsgBox "Can't open path """ & path & """.", vbOKOnly & vbExclamation, document.title
  window.close
End Sub
</script>

<hta:application
  applicationname="Splash"
  singleinstance="yes"
  showintaskbar="no"
  border="none"
  contextmenu="no"
  selection="no"
></hta:application>
</head>

<body>
<div>
<img id="Img" src="160x160.gif"
  onload="onImgLoad()" onerror="onImgError()"
  ondragstart="window.event.returnValue = False"
></div>
</body></html>

Буду рад ответной критике. Примите искреннийшие заверения в совершеннейшем почтении.

2

Re: HTA: отображение анимированной заставки

Выводить заставку перед запуском приложения на заранее заданное время — дурной вкус

OFF: Кто бы спорил о целесообразности сего . Как я понимаю, у заказчика была именно такая блажь на «свистоперделки».

— первые две задают одно и то же,

Точнее — вторая строка частично содержит ту же инструкцию, что и первая, так?

а с учётом того, что не используются не-ASCII символы можно убрать обе; третья здесь бесполезна и, к тому же, ложна (весь немногочисленный текст — на английском).

Это у меня — на ломаном английском. Отсутствие наличия не есть наличие отсутствия. Посему — не приемлется.

Не стоит полагаться на .commandLine — это свойство может содержать путь к файлу отличному от загруженного в данный момент в окно HTA или вообще быть пустым

Поскольку инициализация hta проводится нами же (свойство «.commandLine» определяется однозначно), способ с «.commandLine» мне показался предпочтительнее. Почему я отказался от «document.url» — уже не помню.

Размеры же изображения можно узнать обратившись к его свойствам .width и .height, если явно не заданы соответствующие атрибуты, — а зачем их задавать, если…

Недостаток опыта: «body {… overflow: hidden;}».

Прочее же принимается.


Коллекция Вас ждёт .

3 (изменено: wisgest, 2013-10-13 16:23:37)

Re: HTA: отображение анимированной заставки

Чувствую, что моё молчание выглядит невежливо, но на самом деле оно вызвано не неуважением, а наоборот желанием ответить пообстоятельнее (возможно, по несколько отвлеченным вопросам), но т.к. с мыслями так и не собрался, то приходится ограничиваться дежурной отпиской.

Чтобы это сообщение было хоть немного содержательным отмечу следующее:

alexii пишет:

Размеры же изображения можно узнать обратившись к его свойствам .width и .height, если явно не заданы соответствующие атрибуты, — а зачем их задавать, если…

Недостаток опыта: «body {… overflow: hidden;}».

— на самом деле это предназначено для того же, что и <HTA:APPLICATION SCROLL=NO /> (и могло было также быть получено с помощью <BODY SCROLL=NO>). Так же и ряд других атрибутов HTA:APPLICATION может быть заменён более общими решениями. Собственно говоря, это относится к одному из направлений по которому мне хотелось растечься мыслию по древу — о непродуманности нововведений, плодящей новые сущности вместо упорядочивания имеющихся (к этому относится и «<meta charset=…»)…


alexii пишет:

Коллекция Вас ждёт .

Не исключено, коль такая тема уже существует, но пусть пока подождёт.

Возвращаясь к исходному примеру, хочу спросить, откуда взялось волшебное число 26.47?

4

Re: HTA: отображение анимированной заставки

Прошу прощения — зараз просмотрел.

wisgest пишет:

Возвращаясь к исходному примеру, хочу спросить, откуда взялось волшебное число 26.47?

Мне бы тоже хотелось вспомнить, что это . Вроде как отношение одних единиц измерения к другим.