четверг, 19 августа 2010 г.

Программирование без компилятора

Если вы сейчас подумали, что создавать программы Win32 мы будем без компилятора, то это не так. Компилятор нам понадобится. Суть здесь немного другая. Бывают ситуации, когда у пользователя должен быть достаточно широкий выбор вариантов действий программы. Можно сказать, он должен смочь сделать и свой интерфейс программы, и логику приложения, пусть и для какого-то определённого круга задач.

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

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

У вас должно быть два файла exe: первый - программа для создания пользовательских приложений, второй - шаблон пользовательского приложения. Шаблон должен выводить на себе кнопки, флажки и т. д. так, как задал пользователь. И завершать работу системы, конечно, в соответствии с заданными действиями. Все настройки должны храниться в самом шаблоне (т.е. exe-файле), чтобы пользовательское приложение было самодостаточным и не таскало за собой разные файлы.


Посмотрим, как можно сделать редактор интерфейса в своей программе.



Итак, в дочерней форме у нас находится редактор интерфейса. Также есть панель, на которой можно выбрать, какие визуальные элементы добавлять. Внизу расположена панель прокрутки, а в ней - панель. Эта панель служит подложкой, чтобы расставляемые компоненты не улетали в верхний левый угол панели прокрутки. И уже в этой панели находится IndexToChanel. Естественно, ведь нам нужно как-то определять, какую кнопку на панели инструментов нажали.

Первое событие уводит нас в новую дочернюю панель. Заметьте, что это ChilPanelEx, а не ChildPanel, и параметр Mode=Dynamic. Это означает, что создаваться панель будет динамически в ходе выполнения программы и любое количество раз. Это нам и нужно, потому что когда зайдёте в эту панель, то увидите в ней картинку с изображением кнопки. Размеры панели соответствуют размерам кнопки. Она и будет представлять у нас этот компонент.

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

Сейчас следует научить программу перемещать компоненты, изменять их размеры и удалять. Для демонстрационного примера этого хватит.



Итак, перемещать кнопки достаточно легко. Теперь вы сможете увидеть, что при каждом нажатии клавиши на панели действительно создаётся новая копия компонента «кнопка».



А здесь уже реализовано изменение размера «кнопки». Как видите, при нажатии правой кнопкой мыши запоминаются текущие координаты мыши и размеры динамической панели (именно панели, а на изображения, потому что изменяться размеры будут у панели, а у изображения Align=caClient, оно и так растянется). При перемещении мыши с нажатой правой кнопкой вычисляется разница между текущими координатами и запомненными, а разница прибавляется к запомненным размерам динамической панели.

Сделаем и удаление компонента.



Удаление происходит из контекстного меню. Как видите, схема выходит за пределы динамической панели. Всё дело в том, что элемент не может удалить самого себя, т.е. динамическая схема не может взять и удалить себя своим же событием. Таково правило, и потому мы выводим связь за пределы панели. Но там код тоже сложнее, чем мог бы быть. Сначала запоминается идентификатор схемы-источника события. Это необходимо, чтобы знать, какую копию динамической панели удалять. Затем включается таймер. На этом события панели заканчиваются, и удаление панели производит событие таймера, а не событие самой панели, так что всё правильно.

Здесь важно задать Interval=1, Enable=False и AutoStop=1, чтобы таймер сработал практически сразу и всего 1 раз. Ну а дальше всё просто.

Не будем усложнять демонстрационную схему и делать реализацию остальных компонентов. Лучше доработаем кнопку.



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



Итак, теперь у нас появился ещё один список, в который заносятся действия. Всё очень просто, и здесь важно следить, чтобы количество элементов и действий совпадало. Сами действия, конечно, примитивны, но никто не мешает вам в своей программе сделать что-то более осмысленное и сложное.

Теперь надо как-то сохранять в шаблоне пользовательского приложения (которого у нас пока нет) данные об элементах и действиях. Шаблон у нас - это простой файл exe. Дописывать данные мы будем просто в его конец. Они не повлияют на работу программы, но программа сможет извлечь их оттуда и использовать.



Здесь программа подготавливает данные для записи. Конечно, нет смысла писать идентификатор кнопки (ведь он каждый раз генерируется автоматически), нет смысла словами писать действия - достаточно индексов. Например, индекс 1 означает, что действие - выключение, 2- перезагрузка и т. д.

Давайте проследим все действия от нажатия кнопки «Сохранить в шаблон». Первым делом перебирается массив элементов. В нём могут быть кнопки, флажки и прочие компоненты. Но у нас реализованы только кнопки, чтобы было проще. Однако в программе, где будут и другие компоненты, необходимо указывать, какой именно компонент надо создавать (в шаблоне). Поэтому и создан невизуальный список доступных элементов. Из визуального списка извлекается строка, которая разбивается на имя компонента, дефис и идентификатор. Имя входит в doGetIndex, на выходе которого - уникальный индекс. Например, для кнопки это будет 0, для флажка - 1 и пр.

Дефис нам не нужен. А вот идентификатор динамической панели нам нужен, чтобы узнать её размеры и положение. Но здесь мы задействуем ещё и МТ-поток. Первый элемент этого потока - индекс элемента, второй - идентификатор панели. Когда мы входим в нужный мультиэлемент, МТ-поток разбивается на элементы. Первый элемент - индекс компонента - нужен, чтобы определить какую динамическую панель использовать: панель кнопки, флажка или др. Второй элемент - идентификатор - определяет копию динамической панели. Он её и устанавливает текущей, а затем снимает с нижней точки идентификатор компонента (Handle). Его мы предварительно подключили внутри панели.

Далее этот идентификатор заносится в глобальную переменную id. И всё, в мультиэлементе ничего более не происходит. Возвращаемся к основной схеме.

Там вторым событием разветвителя извлекается индекс действия. Это происходит точно так же, как извлекался индекс компонента, так что здесь всё просто. Ну а затем формируются данные для одного компонента: индекс компонента, положение и размеры, индекс действия. И заносится в список. Следом за ним происходит новая итерация цикла, и так пока не переберётся весь список компонентов.

В конце просто для демонстрации выдаётся содержимое списка. Там одни цифры, что и должно быть. Главное, что мы знаем: на каждый компонент расходуется 6 строк. Большего нам и не надо.

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



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

Пора перейти к шаблону.



Это просто форма. Скомпилируйте её и откройте затем в блокноте (можете сменить расширение на txt). Посмотрите в конец и запомните его. Затем верните расширение обратно, запустите создатель пользовательских приложений, сформируйте кнопки и сохраните в шаблоне (кнопкой из программы). Затем файл bh267.exe опять откройте в блокноте и убедитесь, что в конце появились ваши данные.

Но ведь программа пока не интерпретирует их! Значит, надо добавить в шаблон эту функцию.



Тут данные извлекаются из exe. Сначала указатель устанавливается за 4 байта до конца файла - эти байты несут в себе размер данных. Затем указатель откидывается назад на размер данных и на 4 байта (т.к. он в процессе чтения этих 4-х байт сместился на них к концу).

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



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

Строка интерпретируется в соответствии с её индексом: первая - это индекс компонента (у нас только кнопка, поэтому может быть только 0), следующие 4 - габариты, последнее - индекс действия. Но его я реализовывать не стал, оставив это для вас.

Для проверки не забудьте поменять в программе-создателе имя файла-шаблона (bh269.exe) и создать нужную конфигурацию, а затем сохранить её в шаблоне. Запускайте этот шаблон и наблюдайте за появлением кнопок. Кстати, в шаблоне это уже не рисунки, а настоящие кнопки.

Доделать выполнение действие достаточно просто, поэтому я решил предоставить это сделать вам самостоятельно. Подумайте, и у вас получится!

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


Если файла по ссылке не окажется, напишите в комментариях, и я перезалью его.


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

  1. Помогите реализовать следующее:
    Список строк 1-Список строк 2=Список строк 3
    Например:
    Валя;Коля;Люба;Саша-Коля;Саша=Валя;Люба

    ОтветитьУдалить
  2. Спасибо большое за ответ. Может Вы сможете подсказать как можно сделать так, чтобы при установке метода видимый\скрытый, допустим поле ввода не только показывалось, но и скрывалось?

    ОтветитьУдалить
  3. Все я разобрался, прошу прощения за свою тупость. От кнопки она разумеется работать не будет, а если установить чек бокс то все окей, и скрывается и показывается.

    ОтветитьУдалить
  4. Если на doVisible подать 0, то будет скрыто, если 1 - показано.

    ОтветитьУдалить
  5. Создал программу для удаления дополнительных шрифтов в C:\WINDOWS\Fonts. Чтобы оставались только те шрифты которые устанавливаются с системой, а скопированные пользователем дополнительные шрифты в эту папку удаляются.
    Когда нажимаешь кнопку удалить, появляется системное сообщение "не удается произвести чтения и запись с диска...". И появляется столько раз сколько шрифтов должно было удалиться. Как можно это исправить?

    ОтветитьУдалить
  6. Наверняка шрифты используются какой-либо програмой, например MSWord. Я пробовал, у меня тоже это сообщение выходит. А посл перезагрузки компбтера - нормально удаляет.

    ОтветитьУдалить
  7. После перезагрузки, тоже самое. В атрибурах нет галочек только для чтения и т.д.
    В чем еще может быть дело?

    ОтветитьУдалить
  8. Может, при загрузке запускается какая-то программа, которая использует шрифты. А вручную (кнопкой Delete) удаляются?

    ОтветитьУдалить
  9. Без проблем. В ручную пожалуйста удаляй сколько хочешь. При загрузке наверняка, что то может запускаться. Нужно проверить. Спасибо огромное за не равнодушие. Таких замечательных людей к сожалению мало.

    ОтветитьУдалить
  10. Просто не могу ясно себе представить на какую точку свойств компонента ActiveX подавать данные (и в каком случае на ту или иную точку). Какие свойства передовать в МТ потоке и их последовательность, согласен что в справке они есть, но как они называются, в каком разделе справки находятся и какова их последовательность вот это вопрос.

    ОтветитьУдалить
  11. Ochen haroshije uroki. Jahatel bi uznat kak rabotat s ODBC datasource i kak atobrazhat v tablice :) Takoj urok bilbi kstati :) Zhdu :)

    ОтветитьУдалить
  12. Дописать данные в открытый exe возможно?

    ОтветитьУдалить
  13. Fructus Gravis, это хорошо показано в примерах: Elements\Delphi\Example\DataBase. В этой папке есть разные примеры к базам данных в HiAsm.

    Игорь, попробуйте. Возможно, это зависит от операционной системы (так же, как XP не позволяет удалять открытые exe). Чтение в этой ОС проверялось - возможно.

    ОтветитьУдалить
  14. Zdrastvuijte,

    Da primeri jest, no ja nika nimagu razabratca, kak ustanovit razdelitel iz ODBC patoka, dlia dlia palei. Tak vot hatelos uznat padrobnee kak izpolzovat etat komponent. A v primerah tam sio harasho, no kogda pakazivajut eto luche.

    ОтветитьУдалить
  15. К сожланеию, я знаю работу с ODBC не больше вашего (я не создатель HiAsm, создатель - Dilma). Поэтому рекомендую вам обратиться на форум hiasm.com, где вы сможете задать вопрос автору.

    ОтветитьУдалить
  16. Админ неплохобы показать как можно работать с USB

    ОтветитьУдалить
  17. К сожалению, у меня нет опыта по этой теме. Попробуйте обратиться на форму hiasm.com.

    ОтветитьУдалить
  18. А вы можете создать видео урок по установке 5 версии хайасма, а то там так намудрили с установкой? Заранее спасибо!

    ОтветитьУдалить
  19. Насколько мне известно, официально 5-я версия ещё не вышла, пока только демо. А описывать установку программы, которая ещё не протестирована, не вижу смысла, т.к. она может быть полна ошибок, а для новичков (которые чаще всего и заходят на блог) это будет слишком....сложно.
    Ждите релиза или хотя бы беты, а пока работайте с 4-й. Не думаю, что в 5-й будут коренные отличия - обещается только поддержка другие операционок, а вот прибавка компонентов - вряд ли.

    ОтветитьУдалить
  20. Спасибо за ответ!
    А вы планируете продолжения замечательных блогов и уроков? Хотелось бы узнать о разработки WEB приложений немножко.

    ОтветитьУдалить
  21. Да, разумеется. Просто сейчас времени мало, но вскоре я обязательно что-нибудь напишу!

    ОтветитьУдалить
  22. Здравствуйте,не подскажите, по вашему данному уроку у меня почему-то когда запускаю ваш код,нажимаю на кнопку у меня открывается второе окно и трясется, такое ощущение что как будто добавлен секундомер, в чем может быть проблема?

    ОтветитьУдалить
  23. А какая версия HiAsm? И какая конкретно схема? Я запускал bh266, у меня всё нормально.

    ОтветитьУдалить
  24. У меня такаяже проблема ! Окно тресется , версия хайасма последняя во всех уроках окно тресется если меняешь размер формы все прекращается.
    Уважаемый автор сделайте пожалуйста уроки по WEBу и по составлению отчетов разными извращенными методами. Спасибо.

    ОтветитьУдалить
  25. Скажите пожалуйста, можно ли с помощью Hiasm реализовать функции Undo и Redo (Отменить и Повторить), которые имеются почти во всех программах по редактированию каких-либо данных? Если "Да", то можете рассказать как это сделать?

    ОтветитьУдалить
  26. Как примерс текстом. А суть одна: запоминать текущее значение и потом выдавать его при Undo. Redo, соответственно, реализуется выдачей в обратном порядке.

    ОтветитьУдалить
  27. Здравствуйте. Предлагаю Вам объединить наши проекты. (hi-asm.ru и Ваш). Пожалуйста, пишите на rowder[собачка]yandex.ru

    ОтветитьУдалить
  28. полагаю, что блогун скоро загнется. Здесь неплохо работать AC

    ОтветитьУдалить
  29. Я бы не стал делать пока таких выводов, тем более что забрасывать такой прибыльный (для создателей) сервис вряд ли кто-то будет.
    Что-то Ваша ссылка не отображается.

    ОтветитьУдалить
  30. вопрос! а можно в HiAsm'e сделать что-то похоже на антивирус??? если можно в видео уроке!

    ОтветитьУдалить
  31. Наверное, можно. Но, честно, я не очень представляю, как это можно реализовать. Может, автор HiAsm знает (автор - не я, автор - Dilma, к которому можно обратиться на форуме hiasm.com).

    ОтветитьУдалить
  32. вы можете сделать игру сапер? и если сможете объяснить это в видео уроке! заранее спасибо!

    ОтветитьУдалить
  33. Честно говоря, я не знаю тонкостей этой игры - так, пробовал когда-то (играть). Поэтому вряд ли. Хотя тут сложностей быть не должно: надо лишь просто случайным образом (компонент Random со вкладки Логика) выбрать участки, где будут мины, и занести данные об этом в виртуальную матрицу (например, компонент Matrix со вкладки Массивы). Приготовить поле из кнопок. При нажатии на кнопку проверять значение в виртуальной матрице, соответствующее положению кнопки.
    Но это всё в общих чертах.

    ОтветитьУдалить
  34. Здравствуйте! А можно показать всё это в видео уроке? А то никак не пойму, и покрупнее, пожалуйста, особенно курсор покрупнее, а то обычно в видео уроках я не могу уследить за курсором. И потом когда на паузу ставлю сложно его там найти. У меня, тем более, проблемы со зрением, ещё от рождения, оттуда - все вытекающие последствия. И вообще я сколько ни пытаюсь разобраться в HiAsm - и всё никак не могу, уже сколько месяцев, и всё никак. Всё в Алгоритме приходится делать свои программы, а всё-таки хочется совершенствоваться. Уважаемый админ, если можно, пожалуйста, запишите видео урок, потом скиньте мне на E-mail адрес viv1794@mail.ru. Заранее спасибо!

    ОтветитьУдалить
  35. Да, видеоурок запишу в течение следующей недели.

    ОтветитьУдалить
  36. Автор, пишите еще статьи :) жаль, что больше не пишите...

    ОтветитьУдалить
  37. Напишите например как сделать свой редактор буфера обмена, наподобие моего, который я сделал не в HiAsm, а в Алгоритме, дистрибутив потом скину, требуется Microsoft .NET Framework 2.0. Или как сделать загрузчик файлов из Интернета. Такую схему я ещё не сделал, надо как-то сделать, там у меня затруднения есть. Начинал делать. Вот с объектом Главное меню не могу разобраться, как сделать так, чтобы при нажатии на пункт меню выскакивало вложенное меню.

    ОтветитьУдалить
  38. http://hi-asm.blogspot.com/2009/10/blog-post_30.html - вот тут про загрузчик файлов. Чтобы сделать вложенные меню, надо вложенные пункты заключить в скобки. Например:
    Файл
    (
    Создать
    Открыть
    Закрыть
    )
    Правка
    (
    Отменить
    Повторить
    )

    ОтветитьУдалить
  39. Где скачать все твои видео уроки разом?
    Зачем ты архивируешь видео?

    ОтветитьУдалить
  40. Ссылки на все видеоуроки: http://hi-asm.narod.ru/.
    Без архива видео весит много мегабайт, некоторое - больше сотни. Архивы ужимают его до скромных 5-10 Мб.

    ОтветитьУдалить
  41. я не обратил внимание что это avi.
    сасибо.
    на ютубе как то всё не по порядку.

    ОтветитьУдалить
  42. На ютуб не я выкладывал, это сделал кто-то другой.

    ОтветитьУдалить
  43. Когда же новые статьи и видео уроки? Какая то мертвая точка у вас сейчас.

    ОтветитьУдалить
  44. Здравствуйте!
    Добавьте, пожалуйста, поле поиска на Ваш блог, а то слишком сложно найти нужный материал. Порой сколько ни роюсь - не могу найти! =(((

    ОтветитьУдалить
  45. В blogger.com я гаджета для поиска не нашёл. Поэтому придётся искать через расширенный поиск Яндекса http://yandex.ru/search/advanced?numdoc=10&text= В поле "на сайте" указать адрес этого сайта и искать только на нём.

    ОтветитьУдалить
  46. Хорошо пишете и содержательно мне нравится!!

    ОтветитьУдалить
  47. Так а новые статьи будут? Уже существует пакет C.NET, да и в основном элементов поприбавилось.

    ОтветитьУдалить
  48. Я хотел спросить. Как в HiAsm сделать программу которая блокирует клавиши: ALT , Ctrl . Извините что не по теме.

    ОтветитьУдалить
  49. Спасибо огромное за статьи.Новое что нибудь будет?

    ОтветитьУдалить
  50. Такой вопрос. Как проверить нажата клавиша. Если нажата то выполнить то-то, если нет - то-то.
    Главное чтоб была проверка Каждые 10 секунд.
    Не получилось как-то сделать с помощью:
    -------------------------------------------------------------------
    Вкладка Система - Устройства - Клавиатура.
    -------------------------------------------------------------------
    Сразу же выполняет, если даже не нажал клавишу.

    ОтветитьУдалить
    Ответы
    1. Извиняюсь за задержку с ответом.
      Вот схема:
      Add(Keyboard,6048721,259,294)
      {
      Key=27
      link(onReadKey,5331110:doCase,[])
      }
      Add(Timer,4298945,203,294)
      {
      Interval=10000
      link(onTimer,6048721:doReadKey,[])
      }
      Add(Case,5331110,308,294)
      {
      Value=Integer(1)
      DataOnTrue=String(нажата esc)
      link(onNextCase,12657698:doData,[])
      link(onTrue,723671:doWork3,[(403,307)])
      }
      Add(DoData,12657698,357,294)
      {
      Data=String(не нажата esc)
      link(onEventData,723671:doWork2,[])
      }
      Add(Label,3305103,420,294)
      {
      Left=55
      Top=40
      }
      Add(HubEx,723671,399,294)
      {
      link(onEvent,3305103:doText,[])
      }

      Удалить
    2. Большое спасибо!

      Удалить
  51. Два вопроса:
    1. Можно ли узнать кем является пользователь(админитратором, или огранич. учётной записью),
    Если да, то как...
    2. Как создать инсталлятор(нескольких файлов)?
    Т.е. Чтобы был один EXE, который установлял какой-нибудь ZIP-архив и путь для установки выбирал сам пользователь...

    ОтветитьУдалить
    Ответы
    1. Посмотри видеоурок:
      "Хранение бинарных файлов"

      Удалить
    2. Sorry, Хранение бинарных данных

      Удалить
    3. Разобрался, спасибо!

      Удалить
  52. 1. Можно ли узнать кем является пользователь(админитратором, или огранич. учётной записью),
    Если да, то как...

    ОтветитьУдалить
    Ответы
    1. Смотрите, работает?
      http://www.fayloobmennik.net/3781724

      Удалить
    2. Получается 0 - это не Админ, а 1 Админ(так как-то)

      Удалить
  53. Выбы могли сделать урок про Компонент Delphi, а то не понятно куда надо направлять точки и др.

    ОтветитьУдалить
    Ответы
    1. К сожалению, я больше не занимаюсь созданием видеоуроков, но могу словами описать. Не понял, про что вопрос.

      Удалить
    2. Ладно, вроде у меня получилось, так что вопросов пока не будет...

      Удалить
  54. В RichEdit, как я знаю, можно вставить картинку.
    Такой вопрос:
    её можно сохранять вместе с файлом, если да, то как.
    При этом чтобы она была на том же месте(при открытии), где и при сохранении.

    ОтветитьУдалить
    Ответы
    1. А стандартный doSave разве не работает?

      Удалить
    2. Нет, он картинку сохраняет как пробел!

      Удалить
    3. Я проверил - надо вставлять в RichEdit именно картинку (скопировать её в граф. редакторе), а не кидать туда файл. И при сохранении указывать расширение - rtf. Тогда всё нормально.

      Удалить
    4. Хорошо, спасибо!

      Удалить
  55. Можно ли в HiAsm сделать программу для изменения пароля учетной записи?

    ОтветитьУдалить
    Ответы
    1. Для этого надо знать, где хранятся эти пароли. Я, честно, не знаю. Но если это знать, то, скорее всего, можно (например, через реестр или какой-нибудь файл).

      Удалить
  56. Как отправить данные, например на сайт. Т.е. Пользователь нажимает кнопку, и все данные, введённые им, отправлялись на сайт?

    ОтветитьУдалить
    Ответы
    1. Смотря какие данные. Например, файл можно загрузить так: http://rusfolder.com/40810253. Но для этого надо знать также php, чтобы настроить принимающую страницу.
      Также в папке Hiasm Elements\delphi\Example\Internet есть файл PostBuilder.sha, это тоже пример отправки данных.

      Удалить
    2. С "HTTP_FileUpload" разобрался. И PostBuilder не пригодился! Спасибо!

      Удалить
  57. Можно ли сделать такую программу, чтобы она изменяла вид меню пуск и панель задач? Например, чтобы она делала меню пуск прозрачным.

    ОтветитьУдалить
    Ответы
    1. То что не было реализовано в Windows XP, или что нибудь похожее, но улучшено.

      Удалить
    2. Add(MainForm,2953706,245,196)
      {
      link(onCreate,4320485:doFind,[])
      }
      Add(FindWindow,4320485,308,210)
      {
      ClassName="Shell_TrayWnd"
      SkipParam=1
      link(onFind,3776336:doFindChild,[])
      }
      Add(WinTools,4807529,308,273)
      {
      Point(doAlphaBlendValue)
      link(Handle,6914852:Var2,[])
      }
      Add(TrackBar,1934771,231,301)
      {
      Left=10
      Top=10
      Width=370
      Max=255
      TickCount=32
      Position=255
      link(onPosition,4807529:doAlphaBlendValue,[])
      }
      Add(FindWindow,3776336,371,203)
      {
      Caption="Пуск"
      SkipParam=2
      link(ParentHandle,6914852:Var3,[(377,191)(347,191)(347,257)])
      }
      Add(GetDataEx,6914852,308,252)
      {
      link(Data,4320485:Handle,[])
      }
      Add(WinTools,16074852,371,343)
      {
      Point(doEnable)
      link(Handle,3776336:Handle,[])
      }
      Add(CheckBox,7894858,315,371)
      {
      Left=10
      Top=45
      Checked=0
      Caption="Пуск"
      link(onCheck,16074852:doEnable,[])
      }

      Самое главное - верно ввести ClassName.

      Удалить
    3. P.S. Надеюсь, вы не станете вредить людям такими программами :)

      Удалить
    4. Я хотел сделать прогу наподобии TransBar, Спасибо!

      Удалить
  58. А вот как можно узнать класс практически любого элемента:
    Add(MouseEvent,11963611,287,175)
    {
    Point(Handle)
    }
    Add(Edit,4160676,350,231)
    {
    Left=20
    Top=20
    Width=250
    Text=""
    ClearAfterEnter=1
    link(onEnter,3842873:doAdd,[])
    link(Str,14197673:ClassName,[(356,219)(332,219)(332,275)(307,275)])
    }
    Add(Timer,12494212,252,231)
    {
    Interval=30
    link(onTimer,14197673:doWinInfo,[])
    }
    Add(WinInfo,14197673,301,231)
    {
    link(onWinInfo,4160676:doText,[])
    link(Handle,11963611:Handle,[])
    }
    Add(Memo,3842873,413,238)
    {
    Left=20
    Top=45
    Width=250
    Height=175
    ScrollBars=3
    }

    ОтветитьУдалить
    Ответы
    1. Спасибо...

      Удалить
    2. У меня нет элемента WinInfo, пишет:
      "Элемент WinInfo не найден"!

      Удалить
    3. Обновите версию доя HiAsm 4.04 build 184

      Удалить
    4. У меня 4.04 build 184!!!

      Удалить
    5. Пардон, build 185! Компонент этот будет на вкладке "Окно", третьим.

      Удалить
    6. Честно, и сам не помню, откуда и что качал, потому что после b184 с версиями полная неразбериха. Официально новые выпуски не выходят, но энтузиасты, поддерживающие проект, собирают и дополняют "ночные сборки" и т.п.
      http://forum.hiasm.com/forum.html?q=3&p=207833

      Удалить
    7. Нашёл вот здесь:
      http://hiasm.com/wiki.html
      HiAsm - Packets - Windows - Компоненты - Окно - Общие - "WinInfo"

      Удалить
    8. Да, можно и отдельно установить.

      Удалить
  59. Как сделать программу которая как emu.exe выделяет компоненты, или пример рабочего стола, когда пользователь выделяет файлы...

    ОтветитьУдалить
    Ответы
    1. Вот пример выделения: http://rusfolder.com/40955144. А как выделять внутри объекты - это сами подумайте. Например, можно сравнивать координаты объектов и координаты мыши и потом принимать решение: выделить объект или снять выделение.

      Удалить
    2. Спасибо!

      Удалить
  60. Два поля MEMO и две кнопки для перевода на русский и English, при этом используется переводчик Google...
    - Как это сделать?

    ОтветитьУдалить
    Ответы
    1. Как-то строить запрос, наверное, на страницу. Точно не знаю.

      Удалить
  61. Немогли бы вы сделать урок(можно письменный) про пакет CNET или про что нибудь NOVOE...

    ОтветитьУдалить
  62. Можно ли создать Веб-браузер вместе с TabControl, т. е. как во многих браузерах...
    Если можно то как.

    ОтветитьУдалить
    Ответы
    1. Попробуйте использовать панель ChildPanelEx при Mode=Dynamic. Там, в редакторе мультиэлемента, на вкладке "Точки" есть точки add, select и пр. С ними можно делать копии этой панели прямо во время выполнения программы. Но сам TabControl плохо реализован, например, нет возможности менять название вкладки (если только в новой версии не добавили).

      Удалить
    2. Немогли бы сделать полуфабрикат?

      Удалить
  63. Как сделать так, чтобы была максимальная шир/длина, минимальная шир/длина. Т. е. чтобы окно не выходило за рамки макс. шир/длины и не было меньше минимальной шир/длины

    ОтветитьУдалить
  64. Можно ли с помощью MP3_INFO и ArrayRW записать значение, он может читать, но ним нельзя записывать? Если можно как.

    ОтветитьУдалить
    Ответы
    1. Если, не записывает, значит, нельзя записать. Единственный тут вариант - это искать структуру этих тегов в интернете и потом изменять их с помощью FileStream.

      Удалить
  65. Можно ли создать программу которая бы извлекала иконки из файлов?

    ОтветитьУдалить
  66. Как в RichEdit изменить шрифт текста, который выделен, при этом чтобы невыделенные слова не использовались таким же шрифтом.

    ОтветитьУдалить
    Ответы
    1. А точка doFormatSel там не работает?

      Удалить
    2. Add(RichEdit,6550670,287,245)
      {
      Left=120
      Top=60
      Width=175
      Height=165
      Strings=#7:енркенр|11:кенрмкемнрк|8:емнркенр|
      Point(doFormatSel)
      link(Color,15246680:CurrentColor,[])
      }
      Add(ColorBox,15246680,294,161)
      {
      Left=120
      Top=35
      Width=175
      Height=21
      link(onClick,2560839:doData,[(338,167)(338,227)(226,227)(226,286)])
      }
      Add(DoData,2560839,238,280)
      {
      link(onEventData,6550670:doFormatSel,[])
      }

      Правда, как сменить шрифт, размер, я сам не знаю: можно лишь менять начертание и цвет (верхними точками). Это надо на форуме просить, чтобы доделали компонент.

      Удалить
    3. Да, здесь единственный случай изменения всего шрифта:
      Add(MainForm,2953706,21,105)
      {
      Width=659
      Height=114
      DragForm=0
      }
      Add(RichEdit,6550670,217,147)
      {
      Top=28
      Width=651
      Height=55
      Align=4
      Strings=#7:енркенр|11:кенрмкемнрк|8:емнркенр|
      ScrollBars=2
      Point(doFormatSel)
      Point(doFont)
      link(Color,6559662:Var2,[])
      link(Style,4705978:Var1,[(237,124)])
      }
      Add(ColorBox,15246680,224,63)
      {
      Left=290
      Width=175
      Height=21
      BoxDrawManager="qwerty_1"
      link(onClick,2560839:doData,[(277,69)(277,130)(128,130)(128,188)])
      }
      Add(DoData,2560839,140,182)
      {
      link(onEventData,4973881:doWork2,[])
      }
      Add(ComboBox,13815283,294,49)
      {
      Left=465
      Width=180
      Height=21
      Strings=#7:Обычный|6:Жирный|6:Курсив|13:Жирный курсив|12:Подчёркнутый|19:Подчёркнутый жирный|19:Подчёркнутый курсив|26:Подчёркнутый жирный курсив|
      Text="Обычный"
      ReadOnly=0
      BoxDrawManager="qwerty_1"
      Point(Index)
      Point(doFont)
      link(onClick,8495736:doData,[(338,62)(338,107)(128,107)(128,146)])
      }
      Add(DoData,8495736,140,140)
      {
      link(onEventData,4973881:doWork1,[(200,146)])
      }
      Add(HubEx,4973881,196,182)
      {
      link(onEvent,6550670:doFormatSel,[])
      }
      Add(BoxDrawManager,12168961,371,63)
      {
      Name="qwerty_1"
      Gradient=1
      Gutter=1
      }
      Add(FontBox,5577727,112,224)
      {
      Left=5
      Width=175
      Height=21
      BoxDrawManager="qwerty_1"
      link(onResult,326675:doWork3,[(156,230)(156,286)])
      }
      Add(Font,12870493,98,294)
      {
      link(onFont,6550670:doFont,[(174,300)(174,195)])
      link(Size,10224937:String,[])
      link(Color,6559662:Var1,[(111,117)])
      link(Name,5577727:CurrentFont,[])
      link(Style,4705978:Var2,[(125,211)(307,211)])
      }
      Add(GetDataEx,4705978,301,119)
      {
      Angle=1
      link(Data,13815283:Index,[(314,124)])
      }
      Add(GetDataEx,6559662,224,112)
      {
      link(Data,15246680:CurrentColor,[])
      }
      Add(ComboBox,10224937,91,49)
      {
      Left=180
      Width=110
      Height=21
      Strings=#1:8|1:9|2:10|2:11|2:12|2:14|2:16|2:18|2:20|2:22|2:24|2:26|2:28|2:30|2:32|2:34|2:36|2:38|2:40|2:42|
      Text=""
      DataType=1
      ReadOnly=0
      BoxDrawManager="qwerty_1"
      link(onClick,777428:doWork1,[(135,62)(135,181)(86,181)])
      }
      Add(HubEx,326675,82,280)
      {
      Angle=1
      link(onEvent,12870493:doFont,[(86,300)])
      }
      Add(HubEx,777428,82,259)
      {
      Angle=1
      link(onEvent,326675:doWork1,[])
      }

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

      Удалить
    5. Спасибо

      Удалить
  67. Внутри панели подключите ##select к точке панели doBrignToFront.

    ОтветитьУдалить
  68. Этот комментарий был удален автором.

    ОтветитьУдалить
  69. Веб-браузер является 6 версией IE, можно ли как-нибудь изменить эти параметры?(где они находятся)

    ОтветитьУдалить
  70. В Реестре, в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION создайте параметр DWORD с именем * с необходимым значением. Тут подробнее:
    http://msdn.microsoft.com/en-us/library/ee330730%28v=vs.85%29.aspx

    ОтветитьУдалить
  71. Программа(create.exe) создаёт файл exe(read.exe), который можно запустить и увидеть такой же текст какой и был задан в create.exe
    Как такое сделать?

    ОтветитьУдалить
    Ответы
    1. Сама по себе программа создать exe не может, потому что нужен компилятор и другие служебные файлы для этого. Но почитайте данный пост (программирование без компилятора) - там как раз рассказывается, как вложить в один exe заранее подготовленный другой и чтобы вложенный exe'шник можно было настраивать из основного.

      Удалить
  72. "Ну и немного слов о сайте hi.asm.narod.ru, на котором я располагаю схемы к статьям в блоге. Планируется сделать на сайте некий справочник по компонентам HiAsm. Всё, что я знаю о компонентах, я размещу там. Работы по сайту я уже начал, но пока не загрузил на сайт. Так что скоро, возможно, появится ещё один сайт, где можно прочитать про HiAsm."
    ---
    Цитата из
    http://hi-asm.blogspot.ru/2010/02/blog-post.html
    ---
    Есть ли у вас справочник на данный момент? уже 2014 год.

    ОтветитьУдалить
    Ответы
    1. Когда-то я действительно начинал справочник по компонентам, но тогда ещё не было адекватной справки в hiasm, а сейчас почти по любому компоненту можно получить полноценную справку из самого hiasm.

      Удалить
  73. Make(delphi)
    ver(4.04 build 185)
    Add(MainForm,2953706,21,105)
    {
    Width=247
    Height=295
    }
    Add(ListBox,4154382,203,70)
    {
    Left=10
    Top=5
    Width=70
    Height=75
    Strings=#7:Пункт 1|7:Пункт 2|7:Пункт 3|
    }
    Add(ListBox,15731917,273,70)
    {
    Left=90
    Top=5
    Width=70
    Height=75
    Strings=#10:Подпункт 1|10:Подпункт 2|10:Подпункт 3|
    }
    Add(ListBox,7114400,336,70)
    {
    Left=165
    Top=5
    Width=70
    Height=75
    Strings=#10:Значение 1|10:Значение 2|10:Значение 3|
    }
    Add(StringTableMT,5036724,406,294)
    {
    Left=10
    Top=105
    Width=225
    Height=155
    Columns=#6:Пункты|9:Подпункты|8:Значение|
    IconsCheck=[]
    MiscIcons=[]
    Icons=[]
    }
    Add(Button,849370,112,161)
    {
    Left=10
    Top=85
    Width=225
    Height=15
    Caption=""
    link(onClick,4417484:doEvent1,[])
    }
    Add(FormatStr,10725227,322,294)
    {
    DataCount=3
    Mask="%1;%2;%3"
    link(onFString,5036724:doAdd,[])
    link(Str1,13978727:Value,[(328,272)(223,272)])
    link(Str2,5973897:Value,[(335,264)(293,264)])
    link(Str3,8921946:Value,[(342,272)(356,272)])
    }
    Add(ArrayEnum,10777338,217,161)
    {
    link(onItem,13978727:doValue,[(261,167)(261,197)(205,197)(205,223)])
    link(Array,4154382:Array,[])
    }
    Add(Memory,13978727,217,217)
    {
    }
    Add(ArrayEnum,7727644,287,161)
    {
    link(onItem,5973897:doValue,[(335,167)(335,200)(279,200)(279,223)])
    link(Array,15731917:Array,[])
    }
    Add(Memory,5973897,287,217)
    {
    }
    Add(ArrayEnum,14006049,350,161)
    {
    link(onItem,8921946:doValue,[(394,167)(394,197)(338,197)(338,223)])
    link(Array,7114400:Array,[])
    }
    Add(Memory,8921946,350,217)
    {
    link(onData,10725227:doString,[(394,223)(394,261)(310,261)(310,300)])
    }
    Add(Hub,4417484,168,161)
    {
    OutCount=3
    link(onEvent1,10777338:doEnum,[])
    link(onEvent2,7727644:doEnum,[(234,174)(234,167)])
    link(onEvent3,14006049:doEnum,[(266,181)(266,167)])
    }

    ---
    Мне надо чтобы все пункты, подпункты и значения "шли по порядку". т.е.
    Пункты с пунктами(последовательно),
    Подпункты с подпунктами(последовательно),
    Значения со значениями(последовательно)...
    С перебором Массива можно?

    ОтветитьУдалить
  74. Add(ListBox,4154382,350,175)
    {
    Left=10
    Top=5
    Width=70
    Height=75
    Strings=#7:Пункт 1|7:Пункт 2|7:Пункт 3|
    }
    Add(ListBox,15731917,420,175)
    {
    Left=90
    Top=5
    Width=70
    Height=75
    Strings=#10:Подпункт 1|10:Подпункт 2|10:Подпункт 3|
    }
    Add(ListBox,7114400,483,175)
    {
    Left=165
    Top=5
    Width=70
    Height=75
    Strings=#10:Значение 1|10:Значение 2|10:Значение 3|
    }
    Add(StringTableMT,5036724,511,455)
    {
    Left=10
    Top=105
    Width=225
    Height=155
    Columns=#6:Пункты|9:Подпункты|8:Значение|
    IconsCheck=[]
    MiscIcons=[]
    Icons=[]
    }
    Add(Button,849370,280,273)
    {
    Left=10
    Top=85
    Width=225
    Height=15
    Caption=""
    link(onClick,10777338:doEnum,[])
    }
    Add(FormatStr,10725227,427,455)
    {
    DataCount=3
    Mask="%1;%2;%3"
    link(onFString,5036724:doAdd,[])
    link(Str1,10777338:Item,[(433,380)(370,380)])
    link(Str2,13732527:Item,[])
    link(Str3,8597222:Item,[(447,380)(503,380)])
    }
    Add(ArrayEnum,10777338,364,273)
    {
    link(onItem,13732527:doRead,[])
    link(Array,4154382:Array,[])
    }
    Add(ArrayRW,13732527,434,273)
    {
    link(onRead,8597222:doRead,[])
    link(Array,15731917:Array,[])
    link(Index,192101:Var3,[(447,261)(413,261)(413,320)])
    }
    Add(ArrayRW,8597222,497,273)
    {
    link(onRead,4584902:In,[])
    link(Array,7114400:Array,[])
    link(Index,2310746:Var,[])
    }
    Add(LineBreak,14060436,371,336)
    {
    Type=1
    link(Data,192101:Var2,[])
    Primary=[2310746,133,-91]
    }
    Add(LineBreak,14835053,385,455)
    {
    link(Out,10725227:doString,[])
    Primary=[4584902,154,-182]
    }
    Add(GetDataEx,192101,371,315)
    {
    link(Data,10777338:Index,[])
    }

    ОтветитьУдалить
  75. Как изменить фильтр открытия чтобы было примерно так:
    Изображения|*.bmp* , *.jpeg* , *.png*|
    Т. е. один фильтр с несколькими форматами

    ОтветитьУдалить
  76. Будут ли новые видеоуроки или вы сейчас их не делаете?

    ОтветитьУдалить
  77. Где-то был вопрос о фильтре для нескольких расширений, отвечаю здесь:
    Изображения|*.bmp; *.jpeg; *.png

    ОтветитьУдалить
  78. Можете объяснить про (Вкладка СИСТЕМА - Потоки), для чего они нужны и где применяются(подробнее каждый)

    ОтветитьУдалить
  79. Thread нужен, когда в программе используются ресурсоёмкие вычисления - их выносят в отдельный поток, чтобы они не мешали работать с программой во время их выполнения.

    Mutex - защита от запуска второй копии программы, подробнее - во внутренней справке hiasm, там даже схема есть.

    Назначение остальных компонентов также описано во внутренней справке, там всё довольно подробно. Просто выделите компонент и нажмите F1.

    ОтветитьУдалить
  80. Как работать с компонентом:
    Система - Устройства - Web Cam
    один(можно два,три) примера(полноценных),
    Заранее спасибо!

    ОтветитьУдалить
  81. Всё проще некуда. Дам небольшой пример для основной работы:
    Add(WebCam,7536132,308,231)
    {
    Point(doSaveDIB)
    Point(doStartSequence)
    Point(doStopSequence)
    link(WinHandle,12927403:Handle,[])
    }
    Add(Button,341292,231,203)
    {
    Left=10
    Top=10
    Caption="Подкл"
    link(onClick,7536132:doConnect,[(285,209)(285,237)])
    }
    Add(Button,5881304,231,238)
    {
    Left=10
    Top=35
    Caption="Откл"
    link(onClick,7536132:doDisConnect,[])
    }
    Add(Image,12927403,315,147)
    {
    Left=10
    Top=60
    Width=230
    Height=160
    Point(Handle)
    }
    Add(Button,15916811,161,301)
    {
    Left=70
    Top=10
    Width=145
    Caption="Записать кадр в файл"
    link(onClick,10892608:doExecute,[])
    }
    Add(SDialog,10892608,217,301)
    {
    link(onExecute,7536132:doSaveDIB,[(279,307)(279,251)])
    }
    Add(Button,9077997,175,350)
    {
    Left=70
    Top=35
    Width=145
    Caption="Записать видео в файл"
    link(onClick,15124099:doExecute,[])
    }
    Add(SDialog,15124099,231,350)
    {
    link(onExecute,7536132:doStartSequence,[(285,356)(285,258)])
    }
    Add(Button,3956340,238,399)
    {
    Left=220
    Top=35
    Width=125
    Caption="Остановить запись"
    link(onClick,7536132:doStopSequence,[(289,405)(289,265)])
    }


    Есть ещё методы для вывода окон настроек, их тоже можете использовать. Но у меня нет веб-камеры, проверить не могу.

    ОтветитьУдалить
  82. "Электронная почта" Яндекса работать не будет, она начала использовать SSL/TLS шифрование, что делать?

    ОтветитьУдалить
    Ответы
    1. Попробуйте спросить на форуме hiasm.com. Я точно не знаю, но думаю, придётся поменять значения портов в компоненте.

      Удалить
  83. http://2paste.in/fl1f
    Как сделать так, чтобы отображалось как здесь(в табл.):
    http://vfl.ru/fotos/860bdbfd8450732.html
    При этом таких видов тегов(tr) неограниченное кол-во...

    ОтветитьУдалить
  84. Имеется ввиду, таблица должна быть не в WebBrowser, а StringTable.

    ОтветитьУдалить
  85. Text1, Text2, Text3, Text4, http://1, http://2, http://3, src="rus.jpg" - динамические, т.е. выриантов таких тегов tr много, а эти слова могут иметь другой вид, например не src="rus.jpg" a src="eng.jpg"...

    ОтветитьУдалить
  86. Здравствуйте, как добавлять картинку, звук и текст в конец файла, чтобы их ( из того файла, в который записывали ) можно было считать ?
    Т.е. несколько данных
    Жду ответа !

    ОтветитьУдалить
  87. Почему недоступен сайт программы?

    ОтветитьУдалить
  88. Здесь обсуждение проблем с сайтом http://forum.d2h.ru/xf/topic.php?t=65334&start=40

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