Архив рубрики: Статьи по Clarion

Многопользовательские сетевые приложения

Написал: Игорь Морковин

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

У CapeSoft есть такое решение на уровне шаблонов, доп. утилит и библиотек(AutoUpdate) в составе FileManager, но этот пакет недешево стоит(правда, там много и других полезных вещиц). Но в Clarion Magazin №9 за 2001 год есть статья Джефа Берлингофа «Self-Upgrading Applications» с исходными кодами в виде APP-шки. Суть в том, что создаются три дополнительных файла, хранящих инфу о приложениях, новых версиях и рабочих станциях. Этот процедуры я и использовал практически без изменений(русификация интерфейса не в счет). Т. е. встроил их в свой EXE-шник. А для отслеживания версий(правильнее — билдов) использую шаблон от ABCFree — MISC:Update and Display build number(Global). Читать далее

Локатор по очереди

Думаю, что у каждого был тот день, когда вместо обычного «брауза» по файлу, вы решили отображать «рукопашную» очередь. В стандартном «браузе» на раз два активируется «поиск по первым буквам». При использовании же очереди стандартного средства нет. В этой статье рассказывается о том, каким образом можно организовать поиск по первым буквам в рукопашной очереди.

Задача

У нас есть лист бокс, в котором отображается очередь. Поиск будет осуществляться по определенному полю очереди. Желательно, чтобы данное поле было отсортировано.

Когда фокус находится на лист боксе необходимо отлавливать нажатия клавиш. Составлять из набора клавиш «строку» и искать в очереди совпадение с этой строкой. При совпадении осуществить позиционирование в лист боксе на заданную запись.

При нажатии на клавишу «Delete» необходимо уменьшить строку поиска на 1 символ.

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

Усложним себе задачу еще и тем, что по истечении некоторого времени локатор также должен быть очищен (так, например, работает поиск в Проводнике).

В качестве локатора также может выступать entry-поле. В этом случае позиционирование в очереди происходит при уходе с этого поля. Читать далее

Hotkey – горячие клавиши

Я думаю, что все видели Winamp. Если нет, хех… Одной из особенностей Winamp-а является большое количество горячих клавиш. Эти клавиши вы можете нажимать в любой программе, т.е. они определены для всей системы. Вы можете задать свои комбинации клавиш для выполнения определенной функции. Одна из функций – Показать/Скрыть окно Winampa-а. Эта статья о том, как этого добиться.

Задачи

  1. «Дать» пользователю поле для занесения комбинации горячих клавиш. Естественно, в этом поле необходимо отображать какую комбинацию пользователь нажал.
  2. Необходимо зарегистрировать комбинацию.
  3. Определить в программе, что зарегистрированная комбинация клавиш нажата.
  4. Entry-поле для отображения комбинации нажатых клавиш

Читать далее

Экономия места в браузе: Full Splitter

«дизайнерский» момент 🙂

  • Автор: Still Zero
  • Дата публикации: 30.12.2005
  • Уровень: начальный

Я думаю, что зачастую, размещая элементы на окне просмотра данных, вы сталкиваетесь с ограничением размеров экрана. Существует такая вещь как splitter — разделитель, который помогает уменьшить/увеличить зону видимости листа. Как он работает можно посмотреть, например, в Проводнике Windows.

Но сегодня речь пойдет не о разделителе 🙂 … а о похожей на него вещи, я не знаю как это правильно называется — назвал Full splitter — полный разделитель. Задача, которая ставится перед этим элементом — полностью скрыть часть окна слева (или справа) от разделителя.

Full splitter реализовывается буквально несколькими строками кода.

Между областями, которые необходимо разделить положим кнопку. Установим на кнопку клавишу быстрого вызова (Key). В качестве клавиши может выступать, например, кнопка с буквой «Ё», или, что тоже, знаком «тильда». Также, напишем tip-чик на кнопке, что то вроде «Скрыть/показать области». Текст с кнопки необходимо удалить. Желательно установить другой вид курсора для кнопки.

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

При нажатии на кнопку-разделитель должны выполняться следующие действия:

  • определяемся, что необходимо делать — скрывать область или показывать (по «флаговой» переменной);
  • если скрывать — скрываем все контролы левее (правее) разделителя — команда HIDE и изменяем размеры контролов правее (левее) разделителя на величину освободившегося места, также меняем положение самого разделителя — это свойства Prop:Xpos, Prop:Ypos, Prop:Width, Prop:Height;
  • если показывать, то показываем ранее скрытие контролы — команда UNHIDE, и восстанавливаем предыдущее положение контролов

Пример собран на C55H, ABC.
Я использую стандартный ABC-ресайзер (resizer). Возможно для вашего ресайзера код обновления будет несколько другим. Все действия со сплиттером я вынес в простой локальный класс. Собственно такой сплиттер был подсмотрен в EMS MS SQL manager-е SplitDemo (832)

Локальные хуки

Установка локального хука

  • Автор: Still Zero
  • Уровень знаний: advanced
  • Подразделы: нет
  • Дата публикации: 06.12.2005

Впервые прочитав о локальных хуках, я решил, что это абсолютно никчемная вещь. Есть ведь сабклассинг, его вполне достаточно. Но, все-таки дочитал до конца и попробовал в применении. Реальная вещь. Сабклассинг отдыхает 🙂

Устанавливая хук, вы указываете процедуру, которая может обрабатывать сообщения ОС. По сути — тоже что и сабклассинг. Мулька в том, что сообщения приходят в процедуру хука раньше, чем они попадут в сабклассинг. Также, можно установить хук так, чтобы в него попадали сообщения уже после того, как они «побывали» в процедуре окна.

Хуки бывают разных типов. Тип задается при установке хука.
Хук, который отлавливает те же сообщения, которые попадают в процедуру сабклассинга имеет тип WH_CALLWNDPROC.
Хук, обрабатывающий сообщения после того как они побывали в процедуре сабклассинга имеет тип WH_CALLWNDPROCRET. Читать далее

ИЗО: рисуем в памяти и в не клиентской области

О рисовании в MS Windows

  • Автор: Still Zero
  • Уровень знаний: advanced
  • Подразделы: нет
  • Дата публикации: 03.11.2005

О окнах
Окна, как возможно вам известно, состоят из двух областей: «клиентской» и «не клиентской». К «не клиентской» области относится заголовок (caption), статус-бар, фрэйм (бордюр вокруг окна), вертикальный и горизонтальный скролл-бары. Все остальное, а это «внутренности» окна — клиентская часть.
Рисование в этих областях различается. В эти области приходят разные события. Так например, при рисовании клиентской части приходит событие WM_PAINT, а не клиентской — WM_NCPAINT.
Области имеют разные хэндлы. Хэндл клиентской части — MyWindow{Prop:ClientHandle}, хэндл не клиентской — MyWindow{Prop:Handle}. Читать далее

Вызов Clarion функции из Delphi

Вызов функции на Delphi из Clarion и передача параметров

  • Автор: Evgeny Stefanenko
  • Уровень знаний: начальный/advanced
  • Подразделы: нет
  • Дата публикации: 21.10.2005

Задача: Вызвать из функции на Delphi функцию написанную на Кларе.

Создаем в Кларионе функцию с параметрами:

ClarionProcedure(LONG Param), LONG,PASCAL

Ее мы собственно из Delphi и будем вызывать…

Далее в Delphi лепим на скорую руку проект в котором описываем нашу процедуру как:

var ClarionProcedure: function(Param: Integer):Integer; stdcall;

Важно указать именно stdcall, для того что бы Delphi правильно передавала параметры в Clarion. Читать далее

Диалог выбора компьютера

Диалог выбора компьютера по аналогии с диалогом выбора папки

  • Автор: Still Zero
  • Уровень знаний: начальный
  • Подразделы: нет
  • Дата публикации: 21.10.2005

Как вы знаете, существует стандартный диалог выбора файла/папки. В Кларионе для этого используется команда FILEDIALOG. По большому счету, этой же командой можно воспользоваться для выбора компьютера в сети, но это не очень удобно, так как нет возможности сразу же встать на папку «Сетевое окружение», показываются «расшареные» ресурсы компьютеров и существует возможность выбора обычных папок. Поэтому, приложим немного усилий и пойдем другим путем.

Во-первых, существует несколько API функций для обзора сети: WNetOpenEnum, WNetEnumResource, WNetCloseEnum. Используя эти функции, можно перечислить ресурсы сети (сами сети, домены, компьютеры, «шары» и т.п.). Минус этого метода в том, что функция WNetEnumResource, которая собственно и отвечает за перечисление ресурсов, достаточно медленная. В примерах обычно показывается рекурсивный вызов этой функции, что еще более замедляет работу Читать далее

Создание COM-сервера в Clarion

Большая статья о создание COM-сервера

  • Автор: Михаил Дуга
  • Уровень знаний: профессионал
  • Подразделы: нет
  • Дата публикации: 03.07.2005

Чтобы в Clarion создать COM-сервер, надо в интернете найти толковую статью с примером создания COM, желательно на чистом C или C++, и перевести код один в один на Clarion, что я и сделал. К моему большому удивлению, всё сразу заработало.
com (1330)
© Михаил Дуга, 2005. Все права защищены.

Предварительный просмотр отчетов

Кратко о организации печати в Clarion

  • Автор: Still Zero
  • Уровень знаний: начальный
  • Подразделы: нет
  • Дата публикации: 21.06.2005

Как вы знаете, печать в Кларионе организована с использованием структуры REPORT.

Report  REPORT,AT(1000,2000,6000,7000),PRE(RPT),FONT('Arial',10,,),THOUS
detail1    DETAIL,AT(,,,438),USE(?detail1)
              STRING('DATA STRING'),AT(2656,156),USE(?String1),TRN
           END
        END

Здесь описан простой отчет, состоящий всего из одного detail-а, на котором присутствует всего одна строка «DATA STRING».
Описывается отчет в секции данных. Читать далее