Работа с внешними програмами
Запустить внешнюю программу в PowerBuilder можно с помощью вызова функций
Windows API CreateProcess(Ex) или ShellExecute(Ex) (вторая функция может не
только запускать исполняемые файлы, но и запускать приложения асоциированные с
документами). Можно, конечно воспользоваться и стандартной PowerBuilder'овской
Run("Имя программы",windowstate),
но максимум, чем вы сможете управлять при
таком подходе - размер окна при старте программы. Гораздо же практичнее
использовать вышеупомянутые функции (реализация ShellExecuteEx есть в
библиотеке WinAPI).
Воспользовавшись функцией ShellExecuteEx для запуска программы вы получаете ее
заголовок (handle). Далее, используя его в качестве параметра для функций
TerminateProcess или GetExitProcessCode вы можете завершить работу программы
или проверить, работает ли еще программа (существует еще целый ряд функций для
работы с внешними программами, но об этом следует читать в документации
Microsoft'а), кроме того, можно посылать сообщения созданому приложению.
Как динамически изменять меню
Пример генерации уровня меню:
menu mi,m
m = create menu
for li_item = 1
to UpperBound(as_items[])/
2
// массив с именами меню и их тегами
// пункты меню - это созданное в painter'e меню из одного пункта,
// со скриптом clicked который по тегу определяет что делать
mi = create m_dyn_menu_item
m.item[li_item] = mi.item[1].item[
1] // вот так вот :))
m.item[li_item].text = as_items[li_item * 2 -
1]
m.item[li_item].tag = as_items[li_item * 2]
next
// замена подменю номер n на новое
// если n = UpperBound(m_mdi.item[]) + 1 то пункт меню добавляется в конец.
m_mdi.item[n]= m
m_mdi.item[n].Hide()
m_mdi.item[n].Show()
From: "Anatoly Moskovsky"
avm@trais.com.ua
Каким образом можно установить/получить список библиотек используемых программой.
Это можно сделать с помощью функции SetLibraryList(...).
Естейственно, вызывать данную функцию необходимо до обращения к объектам
из библиотек которые вы собираетесь добавить с помощью SetLibraryList(...).
Дополнение.
Для того, чтобы получить список библиотек используемых программой можно
воспользоваться функцией GetLibraryList(...), но это подходит только для
PowerBulider версии 7.0+. В более ранних версиях можно использовать следующий
код:
string LibList=ProfileString(
"pb.ini",
"Application",
"$d:\pbuilder\pb6\appgal\CashTrak\cashtrak.pbl(CashTrack)"
)
Значение функции ProfileString(...) будет вычисленно для переменной LibList
на момент компиляции. Остается только разобрать строку LibList для выделения
библиотек.
Дополнение From: "Andrew Zorin"
azorin@online.ru
Динамическое изменение порядка групп в отчете.
Мне известно, как минимум, четыре подхода для решения данной задачи:
1. Динамическое генерирование запросов с клиента с необходимыми условиями.
Это способ весьма трудоемкий, и помимо всего "завязывает" на себя определенный
род договоренностей ( к примеру - о структуре базы), однако конечный результат
может быть весьма неплохим, кроме того, можно не ограничиваться только
изменением порядка групп в отчете.
2. Изменение синтаксиса DataWindow.
Достаточно быстро работает, но, как известно, синтаксис DataWindow не
документирован, что порождает дополнительные трудности и возможные проблемы с
переносимостью программы на другие версии PowerBuilder'а. Кроме того этот
способ требует дополнительного DataWindow или DataStore для хранения резльтатов
пока изменяется синтаксис основного DataWindow. Преимущество данного способа в
том, что можно создать число групп больше, чем предусмотренно в Design Time.
3. Заведение суррогатных полей для группировки.
Идея достаточно проста - завести дополнительные поля (назовем их
ID1,ID2,...,IDn), по количеству равных числу групп отчета и создать группы
именно по этим полям и далее, заполнить их возрастающими значениями с той
последовательности, в которой надо группировать. Несколько советов по
реализации. Для начала динамически сфорируйте строку и установите сортировку в
том порядке, в котором вам надо группировать, что-то типа:
dw_1.SetSort("field_3 A field_1 A field_2 A")
dw_1.Sort()
После этого достаточно будет пробежаться по всем строкам dw_1 (либо один раз
по всем field_1..field_n, либо бегать n раз, но в каждый проход только по
какому-то одному field_i - по вкусу) увеличивая какие-то внутренние счетчики
изменений полей field_1..field_n при каждом встеретившемся изменении полей
и заносить их значения в ID1..IDn соответственно. После этого поставить
сортировку по полям ID1..IDn. Вся реализация занимает, от силы, 40-50 строк.
4. Группы можно определять по вычисляемым полям (computed field). Таким
образом, можно просто определить группу по вычисляемому полю, а затем
сменить его expression.
Четвертый способ From: "Andrew Zorin"
azorin@online.ru
Печать и просмотр HTML средствами Windows.
Просмотр HTML достигается посредством вызова функции ShellExecuteEx со
следующими значениями аттрибутов структуры SHELLEXECUTEINFO:
SEI.lpfile="C:\MYPATH\myfile.htm"
Для этого необходима установка какого-либо просмоторщика HTML файлов.
А печать:
SEI.lpfile="rundll32.exe"
SEI.lpparameters="MSHTML.DLL,PrintHTML
C:\MYPATH\myfile.htm"
при этом вызывается диалог печати Internet Explorer'а. Естейственно,
предварительно он должен быть установлен на машине. Реализация функции Windows
API SchellExecuteEx есть в библиотеке WinAPI.
Как получить DWObject для колонок DataWindow.
Для версии PB 6:
DWObject dwo
dwo = dw_1.object.get_attribute(
"column_name",True)
Для PB 7, 8 и 9:
dwo = dw_1.object.__get_attribute(
"column_name",True)
From: "Anatoly Moskovsky"
avm@trais.com.ua
№ колонки | Данные | Текст |
---|---|---|
1 | colname | textname |
2 | colname_1 | textname_1_t |
3 | colname_2 | textname_2_t |
4 | colname_3 | textname_3_t |
5 | colname_4 | textname_4_t |
... | ... | ... |