| Автор | Сообщение |
|
gfilatov
|
| модератор
|
Пост N: 699
Зарегистрирован: 25.05.05
|
|
Отправлено: 29.01.08 13:59. Заголовок: Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)
Начало темы находится здесь, а теперь АНОНС * АНОНС * АНОНС * АНОНС * АНОНС Готовится к опубликованию новая сборка №48, которая выйдет в конце недели. Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне Кратко, что нового: - исправление обнаруженных ошибок и неточностей кода; - новый класс HEADERIMAGE для Grid и Browse; - свойство Address в Hyperlink может теперь открывать папку или файл на диске; - добавлен NOTABSTOP класс для Browse; - поддержка пользовательских компонентов (заимствована из оффициального релиза); - расширения и исправления в библиотеках TsBrowse и PropGrid; - обновлены сборки Харбор и HMGS-IDE; - новые и обновленные старые примеры (как обычно  ).
|
 |
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 4530
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.02.24 13:59. Заголовок: gfilatov2002 пишет Э..
gfilatov2002 пишет | цитата: | | Это не всегда удобно. Но, возможно, надо добавить команду-переключатель этого режима |
| Речь скорее о надежности, сам попадался вместо interval 100 ставил 10 и получал сваливание и сразу не поймешь почему. Вместо переключателя предложил бы сделать _HMG_aFormMiscData1[ k ] := oHmgData() и все массивы, которые есть перенес в объект. Мест для замены не много, даже учитывая примеры. Если это слишком радикально, то сделать _HMG_aFormMiscData1[ k ] := array(6) везде и 6-м элементом сделать oHmgData() (_HMG_aFormMiscData1[ k ] сейчас имеет значения массива от 0 до 5). Если добавить в THmgData метод :DO(...), то получится внутренний псевдо объект, куда можно регистрировать свойства окон и их обработчики, для исп. в Events(...), по мне, это упростило бы многие ситуации. Например, для таймеров, можно их зарегистрировать (имена), поставив disable .F., а в ON INIT по списку включить disabled .T. . Для PAINT можно сразу прописывать блоки кода и в events(...) просто вызывать и т.д. Конечно и _HMG_aFormMiscData2[ k ] := oHmgData() сделал - это удобно, опять же, по мне | цитата: | | Это подстраховка, если библиотека собрана без использования NAMES_LIST (например, для xHarbour). |
| Надо привести THmgData к одинаково работающему элементу (Hash, Class в xHarbour есть, вызовы, вроде, отличаются) и упростить код
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7691
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.02.24 18:39. Заголовок: Григорий, а нельзя с..
Григорий, а нельзя сделать в hbmk2.bat ВСЕГДА следующее: set _PATH=%PATH% set PATH=%MG_BCC%\bin;%MG_ROOT%\harbour\bin;%PATH% echo %MG_ROOT%\ echo %MG_BCC% rem *************************************************************************** rem set default GT driver Чтобы было ВСЕГДА видно какая версия компилируется ? Я у себя держу на диске C: сразу несколько версий МиниГуи MiniGUI-23.09.2 MiniGUI-23.10 MiniGUI-23.12 MiniGUI-24.01 Это позволяет быстро переключаться между версиями... Это из-за проблем Харбора, приходиться тестировать на разных версиях Харбора.
|
 |
|
|
krutoff
|
| |
Пост N: 234
Зарегистрирован: 17.10.05
|
|
Отправлено: 28.02.24 19:12. Заголовок: Благодарность
Наверное Флейм: Григорий - Думаю, твое решение правильное, Время покажет. Тебе (извини за ТЫ) Огромное спасибо за Твою Работу! 20 лет пользуюсь miniGUI БЛАГОДАРЯ Тебе! Сергею! Крутой аудитор и со-разработчик проекта! Проект с тобой развился на 200%! Андрей: Гуру-Тестировщик, задавальщик классных вопросов, PR-manager. Спасибо! Твои ссылки, примеры в моем избранном! Много других классных - Павел, Дима... Всегда помогали! Немного эмоционально.
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4531
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.03.24 11:39. Заголовок: krutoff пишет Всегда..
krutoff пишет | цитата: | | Всегда помогали! Немного эмоционально. |
| Какой то, грустный пост, как прощание 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4532
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.03.24 11:41. Заголовок: gfilatov2002 Григори..
gfilatov2002 Григорий, а можно получить unicode версию и ключик от Pro, а то мои версии сильно рассогласовались (unicode 23.07)
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2290
Зарегистрирован: 11.02.10
|
|
Отправлено: 01.03.24 15:24. Заголовок: SergKis пишет: можн..
SergKis пишет: | цитата: | | можно получить unicode версию |
| Отправил ссылку в личку Добавил также предложенные Вами изменения для поддержки JSON кода. 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4533
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.03.24 17:11. Заголовок: gfilatov2002 Спасиб..
gfilatov2002 Спасибо  С трудностями (блокировано все), но забрал.
|
 |
|
|
Dima
|
| |
Пост N: 7938
Зарегистрирован: 17.05.05
|
|
Отправлено: 01.03.24 17:41. Заголовок: SergKis пишет: С тр..
SergKis пишет: | цитата: | | С трудностями (блокировано все), но забрал. |
| Не приходила мысль просто дать Григорию координаты своего FTP ? 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4534
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.03.24 17:51. Заголовок: Dima пишет Не приход..
Dima пишет | цитата: | | Не приходила мысль просто дать Григорию координаты своего FTP ? |
| Приходила, но он в подвешенном состоянии, может быть отключен, но ты прав на 100% (фирма продана, а сервер у товарища дома теперь) PS В личку положил, Дима, спасибо, пнул в нужном направлении 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7711
Зарегистрирован: 12.09.06
|
|
Отправлено: 08.03.24 18:34. Заголовок: Обратите внимание на..
Обратите внимание на новую версию МиниГуи !!! 1) Пример \SAMPLES\Advanced\ACHOICE_3 позволяет показывать массив в окне с выбором. Синтаксис в программе простой: aRet := MenuAviAchoice( aMenu ) Есть и более продвинутые показы. К своему проекту нужно прилинковать модуль util_AviAchoice.prg 2) Пример \SAMPLES\Advanced\ACHOICE_4 позволяет показывать массив в окне с выбором. Синтаксис в программе простой: aRet := MenuAchoice( aMenu ) Есть и более продвинутые показы. К своему проекту нужно прилинковать модуль util_achoice.prg 3) Пример \SAMPLES\BASIC\WAIT_WINDOW_4 Прелодер показа на длительных операциях для AVI файлов Пробовал в больших проектов, картинка не тормозит и не замирает, работает как часы. К своему проекту нужно прилинковать модуль WaitWinAvi.prg Смотреть короткий тест demo3.prg - показ работы с базой и в цикле.
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7712
Зарегистрирован: 12.09.06
|
|
Отправлено: 15.03.24 10:18. Заголовок: Как увеличить фонт в..
Как увеличить фонт в окне "Program Error" ? На большом экране мелко очень. Да и текст перескакивает на другую строчку.
|
 |
|
|
|
|
Haz
|
| |
Пост N: 1964
Зарегистрирован: 20.02.11
|
|
Отправлено: 15.03.24 11:31. Заголовок: Andrey пишет: На бо..
Andrey пишет: | цитата: | | На большом экране мелко очень. |
| Неужели кто то из пользователей это читает? Правь обработчик ошибок и делай там что хочешь
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7713
Зарегистрирован: 12.09.06
|
|
Отправлено: 15.03.24 12:44. Заголовок: Haz пишет: Неужели ..
Haz пишет: | цитата: | Неужели кто то из пользователей это читает? Правь обработчик ошибок и делай там что хочешь |
| Обработчик для юзеров давно сделан. У меня на экране такое для тестовых программ. Глаза сломаешь, пока прочитаешь это. Экран большой, окно ошибки слишком маленькое....
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4544
Зарегистрирован: 17.02.12
|
|
Отправлено: 15.03.24 12:55. Заголовок: Andrey пишет Глаза с..
Andrey пишет | цитата: | | Глаза сломаешь, пока прочитаешь это. |
| Смысл это читать в чем ? Окно topmost, т.е. посмотреть ошибку (допустим прочитал) не удобно в редакторе (он под этим окном) Смотри ErrorLog.htm сразу 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7714
Зарегистрирован: 12.09.06
|
|
Отправлено: 15.03.24 13:04. Заголовок: SergKis пишет: Смот..
SergKis пишет: | цитата: | | Смотри ErrorLog.htm сразу |
| Да так и делаю... Но хотелось бы починить фонт в окне "Program Error" ? 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2297
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.03.24 13:13. Заголовок: Andrey пишет: Как у..
Andrey пишет: | цитата: | | Как увеличить фонт в окне "Program Error" ? |
| Добавь при инициализации программы команду
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4545
Зарегистрирован: 17.02.12
|
|
Отправлено: 15.03.24 13:14. Заголовок: Andrey пишет Но хоте..
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7715
Зарегистрирован: 12.09.06
|
|
Отправлено: 15.03.24 13:40. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | Добавь при инициализации программы команду Set ShowRedAlert On |
| Классно ! То что надо ! Только кнопка обрезана. Поправь пожалуйста для следующих версий. 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2298
Зарегистрирован: 11.02.10
|
|
Отправлено: 18.03.24 11:11. Заголовок: Всем кому это интересно
Выложил финальную сборку 24.03 с последними исправлениями и дополнениями. Стандартная сборка Благодарю Сергея Киселева за помощь при подготовке этой сборки Желаю всем хорошего дня.
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2299
Зарегистрирован: 11.02.10
|
|
Отправлено: 19.03.24 15:35. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Выложил финальную сборку 24.03 |
| Также вы можете скачать платную версию, для которой понадобится пароль, чтобы распаковать 7z архив, по адресу: Профессиональная версия Я подготовил две частные сборки для компилятора MinGW (32- и 64-бит): | цитата: | MinGW GNU C 13.2.0 (packaged on 2024-03-10). Components versions: -------------------- Harbour MiniGUI Extended Edition 24.03 (Release) Harbour 3.2.0dev (r2403071241) Harbour Make (hbmk2) 3.2.0dev (r2024-03-07 12:41) ------------------------------------------------- |
| Эти сборки содержат обновленную версию библиотеки SQLRDD и рабочий пример доступа к базам MySQL. Они доступны для всех, кто поддерживает этот проект материально. 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4546
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.03.24 11:56. Заголовок: gfilatov2002 Неболь..
gfilatov2002 Небольшая правка (для типа "D" тащится "чужой" cPicture) METHOD LoadFields( lEditable, aColSel, cAlsSel, aNameSel, aHeadSel ) CLASS TSBrowse ... cType := aStru[ nE, 2 ] IF ( nType := AScan( aAdsType, {| e | e[ 1 ] == cType } ) ) > 0 cType := aAdsType[ nType, 2 ] ENDIF cPicture := NIL IF cType == "C" cPicture := "@K " + Replicate( 'X', aStru[ nE, 3 ] ) ...
|
 |
|
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 2300
Зарегистрирован: 11.02.10
|
|
Отправлено: 20.03.24 12:18. Заголовок: SergKis пишет: Небо..
SergKis пишет: ОК Благодарю за помощь 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7716
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.03.24 12:25. Заголовок: Григорий, а в новой ..
Григорий, а в новой версии что-то нет примеров Menu_3 и Menu_4 и Alert_demo ?
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7717
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.03.24 19:35. Заголовок: Функция AlertInfo() ..
Функция AlertInfo() Если строка большая, то окно по ширине от 0 до конца экрана ! Некрасиво очень Можно задать ограничения по ширине ? Хотя бы 0.75 ширины экрана. Везде вставлять код через bInit удовольствия мало...
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2302
Зарегистрирован: 11.02.10
|
|
Отправлено: 02.04.24 17:23. Заголовок: Всем кому это интересно
Добавил реальное использование многопоточности в утилиту сборки проектов hbmk2. По умолчанию количество потоков присваивается равным количеству процессоров в системе. На первый взгляд, это ускоряет компиляцию проектов за счет многопоточности. Если у вас есть мысли по этому поводу, то я с удовольствием прочту ваши комментарии. 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4547
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.04.24 19:57. Заголовок: gfilatov2002 пишет Н..
gfilatov2002 пишет | цитата: | | На первый взгляд, это ускоряет компиляцию проектов за счет многопоточности. |
| По мне, многопоточность сборки не главный критерий hbmk2, она сама как то подрабатывает (сборка не стабильна), что приходится делать в bat @echo off SET P=demo2 if exist _MsgLog.txt del _MsgLog.txt > nul if exist ErrorLog.htm del ErrorLog.htm > nul if exist .\obj\%P%.res del .\obj\%P%.res > nul if exist .\obj\%P%.obj del .\obj\%P%.obj > nul call ..\..\..\batch\hbmk2.bat %* %P%.hbp Ускорение сборок происходит, опять же по мне, с использованием lib, т.е. проект делим на части (модули) вынося весь функционал в prg без function Main(), так и отлаживать проще. hbmk2 создает подкаталог OBJ с файлами *.obj. Завершив отладку, удаляем obj, содержащий Function Main() из остальных создаем lib и в дальнейшем исп. ее в других частях проекта. hbmk2 отслеживает измененные prg и создает obj только для них.
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7721
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.04.24 18:27. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | На первый взгляд, это ускоряет компиляцию проектов за счет многопоточности. |
| А насколько ускоряет ? Как можно у себя проверить ?
|
 |
|
|
PSP
|
| постоянный участник
|
Пост N: 1723
Зарегистрирован: 27.01.07
|
|
Отправлено: 03.04.24 20:02. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Если у вас есть мысли по этому поводу |
| Потоки должны работать таким образом, чтобы нагрузка была распределена равномерно. Чтобы не было потоков, которые закончили работу, но вынуждены ожидать завершения других потоков. Это может только ухудшить ситуацию. Как заранее предугадать - не знаю))
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2303
Зарегистрирован: 11.02.10
|
|
Отправлено: 04.04.24 11:04. Заголовок: PSP пишет: Потоки д..
PSP пишет: | цитата: | | Потоки должны работать таким образом, чтобы нагрузка была распределена равномерно. |
| Благодарю за ваши отклики. Я только восстановил режим многопоточности в утилите hbmk2, который был в ней отключен по причине несовместимости с различными Си-компиляторами. Поскольку меня интересовала многопоточность только для компилятора BCC, я решил проверить эту возможность только для него. Судя по максимальной загрузке всех ядер процессора, этот режим сейчас рабочий.  Если используется один поток, то загрузка ядер составляет около 30% для каждого ядра. Andrey пишет: | цитата: | | Как можно у себя проверить ? |
| Модифицированная утилита и ее исходники будут включены в следующую профессиональную сборку. 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2304
Зарегистрирован: 11.02.10
|
|
Отправлено: 05.04.24 18:54. Заголовок: Всем кому это интересно
Выложил Borland/Embarcadero C++ 7.7 (32-bit) по адресу: Скачать Ваши комментарии приветствуются... 
|
 |
|
|
Dima
|
| |
Пост N: 7941
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.04.24 16:02. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Ваши комментарии приветствуются |
| Brc32.exe от древней версии и не 7.7
|
 |
|
|
|
|
gfilatov2002
|
| moderator
|
Пост N: 2305
Зарегистрирован: 11.02.10
|
|
Отправлено: 06.04.24 16:19. Заголовок: Dima пишет: Brc32.e..
Dima пишет: | цитата: | | Brc32.exe от древней версии |
| Да, верно. Этот компилятор ресурсов не изменялся очень давно. Если есть в наличие более свежая версия, то файл - в студию... 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2306
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.04.24 10:11. Заголовок: Опубликована финальн..
Опубликована финальная сборка 24.04 с последними исправлениями и дополнениями. Стандартная сборка Благодарю Сергея Киселева за помощь при подготовке этой сборки Желаю всем хорошего дня. 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2314
Зарегистрирован: 11.02.10
|
|
Отправлено: 09.05.24 14:23. Заголовок: Всем кому это интересно
Поскольку 7 мая вышло важное обновление компилятора MinGW 14.1 (последнее такое обновление 13.1 было ровно год назад), то я успешно протестировал текущую Минигуи сборку для работы с этим компилятором (32/64 бита). Результаты теста представлены на картинках ниже. Благодарю за ваше внимание. 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2315
Зарегистрирован: 11.02.10
|
|
Отправлено: 19.05.24 14:08. Заголовок: Всем кому это интересно...
Завершена подготовка новой сборки 24.05, которая будет опубликована на следующей неделе. Что нового: - исправление обнаруженных ошибок; - добавлена штатная возможность изменения текста пунктов меню | цитата: | Form.MenuName.Caption := cNewValue Form.MenuName.Caption --> cNewValue |
| - Split Button теперь поддерживает установку иконки; - цвет Label теперь можно устанавливать с использованием чисел, а не только массива {r,g,b}; - некоторые псевдо-функции переведены обратно в полноценные функции для использования в пользовательских скриптах (размер заголовка i_pseudofunc.ch при этом уменьшился вдвое); - обновлена функция | цитата: | HMG_FileCopy( <cSourceFile>, <cTargetFile>, [<nBuffer>], [<bEval>] ) --> lSuccess |
|
с использованием возможностей последней версии Харбора (только PRO версия); - добавлены полные тексты следующих программ для использования баз данных на сервере MySQL | цитата: | * New: 'xBase Package 2024' examples: using MySQL through the TMySql class. * School (registration, cources, finance) * Football School (using DBFCDX) * Real estate (Leasing) * Meter (small restaurants) * Service Order * SysFood (food companies) * CRUD (create, read, update and delete) example with MySQL Note. You will need a fully working MySQL server installation and the correct connection parameters. Contributed by Marcelo Neves (see in folder \samples\Applications\pacote_xbase) [PRO VERSION] |
| - и т.д. Благодарю Сергея Киселева за помощь при подготовке этой сборки Желаю всем хороших выходных. 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2316
Зарегистрирован: 11.02.10
|
|
Отправлено: 21.05.24 09:41. Заголовок: Опубликована новая с..
Опубликована новая сборка 24.05 с последними исправлениями и дополнениями. Стандартная версия Про-версия (защищена паролем) Также для доноров проекта доступны сборки для последнего BCC 7.70 (32-bit) и MinGW GNU C 14.1.0 (packaged on 2024-05-08). По просьбе Андрея Верченко в эту сборку добавлены два его новых примера: - Basic\ToolBarEx_3; - Advanced\Tsb_oHmgData. Желаю всем хорошего дня! 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7759
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.05.24 06:32. Заголовок: Примеры demo.exe и d..
Примеры demo.exe и demo2.exe из MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData Я их собирал и тестировал на версии MiniGUI 23.09.2 - работают отлично. Если собрать их с помощью НОВОЙ версии, то при запуске вылазит окно с ДОБАВЛЕНИЕМ записи и в папке организуются ещё 2 файла: checkres.txt и checkstatic.txt Почему ? Это так и должно быть ? 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2317
Зарегистрирован: 11.02.10
|
|
Отправлено: 22.05.24 10:39. Заголовок: Andrey пишет: Если ..
Andrey пишет: | цитата: | | Если собрать их с помощью НОВОЙ версии, то при запуске вылазит окно с ДОБАВЛЕНИЕМ записи |
| Проверь содержание файла _msg.log: при запуске программы там есть строка вызова функции RECNOINSERT(): | цитата: | ======= MYTSBEDIT SELECTOR .OR. ORDKEYNO = 2 nO= 1 1 nP= 1 >>> MYTSBEND(1299) => demo_tsb.prg cMaska= input 16.03.24 Ivanova ----- SCOPE ---- [INPUT 16.03.24 IVANOVA ] 60 .F. INDEXORD()= 3 DOCDTV NIL oBrw:Cargo:cMaska= [input 16.03.24 Ivanova] 22 App.Cargo:oIni:MAIN:cMaska= [input 16.03.24 Ivanova] 22 RECNOINSERT(): oWnd: wMain 11 _RecIns TSBROWSE ########## _ItogGet >>> (b)MAIN(129) => demo.prg INDEXORD()= 3 DOCDTV |
| Andrey пишет: | цитата: | | в папке организуются ещё 2 файла: checkres.txt и checkstatic.txt |
| Все верно: при выходе из программы создаются отладочные файлы, поскольку при сборке использована СТАНДАРТНАЯ версия библиотеки, которая является ОТЛАДОЧНОЙ. Кстати, наличие файла checkres.txt указывает на наличие утечки ресурсов в программе. В противном случае этот файл НЕ создается. Файл checkstatic.txt при отладке создается всегда, он содержит типы и значения всех использованных статических переменных.
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2318
Зарегистрирован: 11.02.10
|
|
Отправлено: 22.05.24 14:25. Заголовок: Дополнение
Andrey пишет: | цитата: | | при запуске вылазит окно с ДОБАВЛЕНИЕМ записи |
| Вылечил с помощью добавления следующей команды в процедуру Sets_ENV(). 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7760
Зарегистрирован: 12.09.06
|
|
Отправлено: 22.05.24 17:23. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Вылечил с помощью добавления следующей команды |
| Спасибо БОЛЬШОЕ ! gfilatov2002 пишет: | цитата: | | Кстати, наличие файла checkres.txt указывает на наличие утечки ресурсов в программе. В противном случае этот файл НЕ создается. |
| Как понять/расшифровать это ? Вроде в коде делаю правильно, или нет ??? Как правильно сделать ??? Вот в checkres.txt следующее: C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- ICON,209389999,MAIN(73) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- ICON,209389999,MAIN(73) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- ICON,366216997,MAIN(73) Код программы: // верхнее меню окна myToolBar(owc) // <<<---- строка 73 И что тут за потеря ? 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7761
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.05.24 18:52. Заголовок: Убрал из примера HB_..
Убрал из примера HB_FUNC( DESTROYICON) - модуль demos_util.prg Теперь в checkres.txt следующее: C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,84219576,COLUMN_TSB(136)->MAIN(91) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,84219576,COLUMN_TSB(136)->MAIN(91) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,117774005,COLUMN_TSB(136)->MAIN(91) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,84219576,COLUMN_TSB(136)->MAIN(91) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,117774005,COLUMN_TSB(136)->MAIN(91) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,67442359,COLUMN_TSB(136)->MAIN(91) .... и т.д. C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,67442359,COLUMN_TSB(136)->MAIN(91) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,50665150,COLUMN_TSB(140)->MAIN(91) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,33887935,COLUMN_TSB(140)->MAIN(91) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,33887936,COLUMN_TSB(140)->MAIN(91) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,33887937,COLUMN_TSB(140)->MAIN(91) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,33887938,COLUMN_TSB(140)->MAIN(91) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,33887939,COLUMN_TSB(140)->MAIN(91) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,33887940,TSBROWSE:NEW(1560)->_DEFINETBROWSE(314)->_TBROWSE(559)->MAIN(102) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BRUSH,1242568359,TSBROWSE:SETCOLOR(13377)->TSBROWSE:NEW(1660)->_DEFINETBROWSE(314)->_TBROWSE(559)->MAIN(102) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BRUSH,1024464538,_TBROWSE(559)->MAIN(102) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,17110726,(b)MAIN(96)->_TBROWSE(572)->MAIN(102) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BRUSH,1997543076,(b)MAIN(98)->_TBROWSE(579)->MAIN(102) Размер checkres.txt - 11158 байт И как его сокращать/убирать утечку памяти ? Вот у себя в коде нашёл незакрытый хендл FOR nI := 1 TO LEN(aImg) hIco := LoadIconByName( aImg[nI], nHImg, nHImg ) hBmp := BmpFromIcon( hIco ) // вернет хендл bmp cFile := cPath + aImg[nI] + ".png" HMG_SaveImage( hBmp, cFile, "png" ) .... Как его убить ? А что делать с этим ? BMP,33887940,TSBROWSE:NEW(1560)->_DEFINETBROWSE(314)->_TBROWSE(559)->MAIN(102)
|
 |
|
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 4576
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.05.24 20:21. Заголовок: Andrey пишет Как его..
Andrey пишет DeleteObject( hBmp )
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7762
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.05.24 00:54. Заголовок: Размер checkres.txt ..
Размер checkres.txt уменьшился до 11285 (было 11158) байт Остались тоже самое: C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,-234549685,COLUMN_TSB(136)->MAIN(91) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,-234549685,COLUMN_TSB(136)->MAIN(91) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,1627723450,COLUMN_TSB(136)->MAIN(91) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,-234549685,COLUMN_TSB(136)->MAIN(91) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,1627723450,COLUMN_TSB(136)->MAIN(91) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,2080708307,COLUMN_TSB(136)->MAIN(91) ... C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,-184215828,COLUMN_TSB(140)->MAIN(91) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,486872819,TSBROWSE:NEW(1560)->_DEFINETBROWSE(314)->_TBROWSE(559)->MAIN(102) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BRUSH,1511003877,TSBROWSE:SETCOLOR(13377)->TSBROWSE:NEW(1660)->_DEFINETBROWSE(314)->_TBROWSE(559)->MAIN(102) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BRUSH,890246898,_TBROWSE(559)->MAIN(102) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,1308956330,(b)MAIN(96)->_TBROWSE(572)->MAIN(102) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BRUSH,1343231766,(b)MAIN(98)->_TBROWSE(579)->MAIN(102) Ну и как дальше бороться с утечкой памяти ? 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7763
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.05.24 13:42. Заголовок: C:\MiniGUI_24.05..
C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,-184215828,COLUMN_TSB(140)->MAIN(91) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,486872819,TSBROWSE:NEW(1560)->_DEFINETBROWSE(314)->_TBROWSE(559)->MAIN(102) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BRUSH,1511003877,TSBROWSE:SETCOLOR(13377)->TSBROWSE:NEW(1660)->_DEFINETBROWSE(314)->_TBROWSE(559)->MAIN(102) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BRUSH,890246898,_TBROWSE(559)->MAIN(102) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,1308956330,(b)MAIN(96)->_TBROWSE(572)->MAIN(102) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BRUSH,1343231766,(b)MAIN(98)->_TBROWSE(579)->MAIN(102) У меня большая система, чистку памяти делаю ври входе и выходе в TBROWSE, но всё равно прога ПЕРИОДИЧЕСКИ падает после 4-5 часов работы. Юзер постоянно открывает, то одну/другую/третью/четвертую таблицу. Связано ли это с утечкой памяти в TBROWSE ? Очистку от хендов иконок сделал уже.
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2319
Зарегистрирован: 11.02.10
|
|
Отправлено: 26.05.24 14:10. Заголовок: Andrey пишет: C: ..
Andrey пишет: | цитата: | C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,-184215828,COLUMN_TSB(140)->MAIN(91) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,486872819,TSBROWSE:NEW(1560)->_DEFINETBROWSE(314)->_TBROWSE(559)->MAIN(102) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BRUSH,1511003877,TSBROWSE:SETCOLOR(13377)->TSBROWSE:NEW(1660)->_DEFINETBROWSE(314)->_TBROWSE(559)->MAIN(102) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BRUSH,890246898,_TBROWSE(559)->MAIN(102) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BMP,1308956330,(b)MAIN(96)->_TBROWSE(572)->MAIN(102) C:\MiniGUI_24.05\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BRUSH,1343231766,(b)MAIN(98)->_TBROWSE(579)->MAIN(102) |
| Эти ресурсы должны очищаться с помощью метода Destroy() в классе TSBROWSE. Но этот метод НЕ срабатывает, поскольку TBROWSE не получает от системы сообщение WM_DESTROY. Я попытался сделать этот метод деструктором класса, но он все равно НЕ отрабатывает. Сейчас ищу другой способ запустить этот метод на выполнение призакрытии окна, которое содержит элемент управления TBROWSE. 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4577
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.05.24 15:01. Заголовок: gfilatov2002 пишет С..
gfilatov2002 пишет | цитата: | | Сейчас ищу другой способ запустить этот метод на выполнение призакрытии окна, которое содержит элемент управления TBROWSE. |
| Так должен срабатывать цикл WM_DESTROY окна, т.е. **************************************************************************** CASE WM_DESTROY **************************************************************************** i := AScan ( _HMG_aFormHandles , hWnd ) IF i > 0 #ifndef __XHARBOUR__ // Remove All HMG_* Properties IF Len( EnumProps( hWnd ) ) > 0 EnumPropsEx( hWnd, {|hWnd, cPropName, hHandle| HB_SYMBOL_UNUSED( hHandle ), ; iif( hb_LeftEqI( cPropName, "HMG_" ), RemoveProp( hWnd, cPropName ), Nil ), .T. } ) ENDIF #endif // Remove Child Controls FOR EACH r IN _HMG_aControlParentHandles IF r == hWnd x := hb_enumindex ( r ) IF _HMG_aControlType [x] == "MESSAGEBAR" _ReleaseControl ( "StatusBar" , GetParentFormName( x ) ) ELSE _EraseControl ( x , i ) ENDIF ENDIF NEXT ... _HMG_aControlType[ k ] := "TBROWSE" _HMG_aControlNames[ k ] := ControlName _HMG_aControlHandles[ k ] := ControlHandle _HMG_aControlParenthandles[ k ] := ParentFormHandle _HMG_aControlIds[ k ] := oBrw ... имеем, значит имеем и _HMG_aControlIds[ k ]:Destroy() PS. Добавить в _EraseControl ( i, p ) обработку CASE t == 'TBROWSE'
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2320
Зарегистрирован: 11.02.10
|
|
Отправлено: 26.05.24 16:23. Заголовок: SergKis пишет: Доба..
SergKis пишет: | цитата: | | Добавить в _EraseControl ( i, p ) обработку CASE t == 'TBROWSE' |
| Да, так получилось сделать Уже намного лучше. Но осталось удалить BRUSH, который создается в методе SetColor() класса TControl 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4578
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.05.24 16:41. Заголовок: gfilatov2002 Но оста..
gfilatov2002 | цитата: | | Но осталось удалить BRUSH, который создается в методе SetColor() класса TControl |
| FUNCTION _DefineTBrowse добавил IF HB_ISARRAY( aBrush ) .AND. Len( aBrush ) > 2 IF oBrw:hBrush != NIL DeleteObject( oBrw:hBrush ) ENDIF oBrw:hBrush := CreateSolidBrush( aBrush[ 1 ], aBrush[ 2 ], aBrush[ 3 ] ) ENDIF /* BK end */ ... METHOD Enabled( lEnab ) CLASS TSBrowse ... DeleteObject( ::hBrush ) ::hBrush := CreateSolidBrush( GetRed( ::nClrPane ), GetGreen( ::nClrPane ), GetBlue( ::nClrPane ) ) IF ::lSelector .AND. ::lDrawSpecHd ::nClrSpcHdBack := ::nCLR_HGRAY ENDIF ELSE ... но с ::hBrush не все понятно, т.к. есть места TControl.prg без DeleteObject( ::hBrush ) как пример METHOD Colors( hDC ) CLASS TControl DEFAULT ::nClrText := GetTextColor( hDC ), ; ::nClrPane := GetBkColor( hDC ), ; ::hBrush := CreateSolidBrush( GetRed( ::nClrPane ), GetGreen( ::nClrPane ), GetBlue( ::nClrPane ) ) SetTextColor( hDC, ::nClrText ) SetBkColor( hDC, ::nClrPane ) RETURN ::hBrush Если поискать "CreateSolidBrush" в prg, то есть и др. места ... PS. Если взять простой вариант окна MDI, то тоже остается BRUSH не освобожденный DEFINE WINDOW &cForm AT nY, nX WIDTH nW HEIGHT nH TITLE om:cTitle ; MINWIDTH nWm MINHEIGHT nHm ; MAIN MDI TOPMOST ; BACKCOLOR cBClr ; ON INIT _wPost( 0) ; ON RELEASE _wSend(90) ; ON INTERACTIVECLOSE ( _wSend(98), This.Cargo:lClose ) This.Cargo := oHmgData() ; oMain := This.Object This.Cargo:lClose := .T. ... END WINDOW IF lCenter ; CENTER WINDOW &cForm ENDIF ACTIVATE WINDOW &cForm RETURN NIL
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2321
Зарегистрирован: 11.02.10
|
|
Отправлено: 26.05.24 17:09. Заголовок: SergKis пишет: FUNC..
SergKis пишет: | цитата: | | FUNCTION _DefineTBrowse добавил |
| Спасибо за помощь! Сейчас остался не удаленным только один BRUSH | цитата: | c:\minigui\SAMPLES\Advanced\Tsb_oHmgData\demo.exe -- BRUSH,-904917253,_TBROWSE(559)->MAIN(102) |
|
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4579
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.05.24 17:30. Заголовок: gfilatov2002 пишет С..
gfilatov2002 пишет | цитата: | | Сейчас остался не удаленным только один BRUSH |
| С ним, пока и не понятно, т.к. _TBROWSE(559) -> DEFINE TBROWSE &cBrw OBJ oBrw AT nY, nX WIDTH nW HEIGHT nH CELL ; ... BRUSH aBrush ; ... т.е. это FUNCTION _DefineTBrowse( ControlName, ParentFormName, nCol, nRow, nWidth, nHeight, ; ... и дальше параметр aBrush  смотрим
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7764
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.05.24 22:20. Заголовок: Вопрос по теме удале..
Вопрос по теме удаления хендлов. Если я делаю так LOCAL oBrw, oTsb .... // построение таблицы oTsb := oHmgData() ... oTsb:aBmp1 := { {"bMinus32", "bZero32", "bPlus32"} ,; { LoadImage("bMinus32"), LoadImage("bMinus32"), LoadImage("bMinus32")} ,; , {||блок кода смены картинки}, ... } .... // --------- хранилище картинок, удаляется после закрытия объекта автоматом ------ :aBitMaps := { Nil, LoadImage("bRecDel16") } :aColumns[2]:aBitMaps := oTsb:aBmp1[2] :aColumns[2]:uBmpCell := oTsb:aBmp1[3] // там далее смена картинки по алгоритму в myLoadBmpTsb(...) .... То нафига НУЖНО удалять хендлы из oTsb:aBmp1 если эта переменная LOCAL и после закрытия этой функции переменная oTsb удалиться ????? Или я чего то не знаю ?
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7765
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.05.24 16:16. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Сейчас остался не удаленным только один BRUSH |
| Как успехи ? У меня в примере в файле checkres.txt (695 байт) остался BRUSH. А внешней командой можно удалить BRUSH при закрытии окна ? 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4581
Зарегистрирован: 17.02.12
|
|
Отправлено: 30.05.24 07:58. Заголовок: gfilatov2002 hmg-24..
gfilatov2002 hmg-24.05 Исправил (строки //!!!) Скрытый текст
TControl.prg ------------ ... METHOD SetColor( nClrFore, nClrBack, hBrush ) CLASS TControl ::nClrText = nClrFore ::nClrPane = nClrBack If ::hBrush != nil DeleteObject( ::hBrush ) // Alen Uzelac 13.09.2012 ::hBrush := NIL //!!! DoEvents() //!!! EndIf if hBrush != nil ::hBrush := hBrush else ::hBrush := CreateSolidBrush( GetRed( nClrBack ), GetGreen( nClrBack ), GetBlue( nClrBack ) ) endif return nil ... h_TBrowse.prg ------------- ... FUNCTION _DefineTBrowse( ControlName, ParentFormName, nCol, nRow, nWidth, nHeight, ; ... IF HB_ISARRAY( aBrush ) .AND. Len( aBrush ) > 2 IF oBrw:hBrush != NIL //!!! DeleteObject( oBrw:hBrush ) //!!! oBrw:hBrush := NIL //!!! ENDIF //!!! oBrw:hBrush := CreateSolidBrush( aBrush[ 1 ], aBrush[ 2 ], aBrush[ 3 ] ) ENDIF /* BK end */ ControlHandle := oBrw:hWnd ... METHOD Enabled( lEnab ) CLASS TSBrowse ... ::lEnabled := .F. ::SetColor( { 2 }, { ::nCLR_HGRAY } ) ::SetColor( { 3, 4 }, { ::nCLR_GRAY, ::nCLR_HGRAY } ) ::SetColor( { 9, 10 }, { ::nCLR_GRAY, ::nCLR_HGRAY } ) ::SetColor( { 16, 17 }, { ::nCLR_GRAY, ::nCLR_HGRAY } ) ::SetColor( { 18, 19 }, { ::nCLR_GRAY, ::nCLR_HGRAY } ) ::nClrPane := ::nCLR_HGRAY ::nClrLine := ::nCLR_Lines DeleteObject( ::hBrush ) //!!! ::hBrush := NIL //!!! ::hBrush := CreateSolidBrush( GetRed( ::nClrPane ), GetGreen( ::nClrPane ), GetBlue( ::nClrPane ) ) ELSE ... h_events.prg ------------ **************************************************************************** CASE WM_DESTROY **************************************************************************** ... // Remove Child Controls FOR EACH r IN _HMG_aControlParentHandles IF r == hWnd x := hb_enumindex ( r ) IF _HMG_aControlType [x] == "MESSAGEBAR" _ReleaseControl ( "StatusBar" , GetParentFormName( x ) ) ELSEIF _HMG_aControlType [x] == "TBROWSE" //!!! _HMG_aControlIds [x]:Destroy() //!!! ELSE _EraseControl ( x , i ) ENDIF ENDIF NEXT ...
| Сборка примера Advanced\Tsb_oHmgData\demo.prg дает (OBJ удалил) Скрытый текст
Harbour 3.2.0dev (r2402161723) Copyright (c) 1999-2021, https://harbour.github.io/ Borland Resource Compiler Version 5.40 Copyright (c) 1990, 1999 Inprise Corporation. All rights reserved. OBJ\demo.c: OBJ\Column_TSB.c: OBJ\demo_tsb.c: OBJ\demo_menu.c: OBJ\demo_menu_find.c: OBJ\demo_print.c: OBJ\demos_util.c: OBJ\demos_about.c: OBJ\demos_use.c: OBJ\demo2_tsb_func.c: OBJ\util_button.c: OBJ\util_keychar.c: OBJ\cell_edit_memo.c: OBJ\_hbmkaut_demo.c: Turbo Incremental Link 5.69 Copyright (c) 1997-2005 Borland Error: Unresolved external '_HB_FUN__ADDNEWGLOBAL' referenced from C:\MINIGUIBCC58\LIB\MINIGUI.LIB|h_ini Error: Unresolved external '_HB_FUN__SETGETGLOBAL' referenced from C:\MINIGUIBCC58\LIB\MINIGUI.LIB|h_ini Error: Unresolved external '_HB_FUN_HMG_GET' referenced from C:\MINIGUIBCC58\LIB\MINIGUI.LIB|h_getbox Error: Unresolved external '_HB_FUN_CHECKSTATIC' referenced from C:\MINIGUIBCC58\LIB\MINIGUI.LIB|h_windows Error: Unresolved external '_HB_FUN__SETGETNAMESLIST' referenced from C:\MINIGUIBCC58\LIB\MINIGUI.LIB|h_pubfunc Error: Unresolved external '_HB_FUN_ALERTSTOP' referenced from C:\MINIGUIBCC58\LIB\MINIGUI.LIB|errorsys Error: Unresolved external '_HB_FUN_ALERTINFO' referenced from C:\MINIGUIBCC58\SAMPLES\_TEST\_TSB_OHMGDATA9\OBJ\DEMO2_TSB_FUNC.OBJ Error: Unresolved external '_HB_FUN_ALERTYESNO' referenced from C:\MINIGUIBCC58\SAMPLES\_TEST\_TSB_OHMGDATA9\OBJ\DEMO_TSB.OBJ Error: Unresolved external '_HB_FUN_ALERTOKCANCEL' referenced from C:\MINIGUIBCC58\SAMPLES\_TEST\_TSB_OHMGDATA9\OBJ\DEMO_MENU.OBJ hbmk2[demo]: Error: Running linker. 2
| Беру версию hmg-24.04, повторяю правки, пересобираю примеры Advanced\Tsb_oHmgData -> все OK!
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2322
Зарегистрирован: 11.02.10
|
|
Отправлено: 30.05.24 12:58. Заголовок: SergKis пишет: hmg-..
SergKis пишет: Большое спасибо! Я уже исправил эту утечку ресурсов похожим кодом. Заодно поправил код в классе TGetBox, чтобы освобождались ресурсы при выходе из режима редактирования полей. Не очень понятна необходимость присваивать если в следующей строке кода мы снова назначаем | цитата: | | ::hBrush := CreateSolidBrush( GetRed( ::nClrPane ), GetGreen( ::nClrPane ), GetBlue( ::nClrPane ) ) |
| У меня происходит освобождение ресурсов и без этой строки 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4582
Зарегистрирован: 17.02.12
|
|
Отправлено: 30.05.24 13:07. Заголовок: gfilatov2002 пишет У..
gfilatov2002 пишет | цитата: | | У меня происходит освобождение ресурсов и без этой строки |
| If ::hBrush != nil DeleteObject( ::hBrush ) // Alen Uzelac 13.09.2012 ::hBrush := NIL //!!! DoEvents() //!!! EndIf Без выделенной строки сообщение BRUSH из txt файла не уходило, сделав DoEvents(), условную задержку, все стало работать. Поставил везде ::hBrush := NIL, как вариант принудительного сброса адреса и выполненных доп. команд.
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4583
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.06.24 12:55. Заголовок: gfilatov2002 Поправи..
gfilatov2002 Поправил в тсб Скрытый текст
METHOD New( cControlName, nRow, nCol, nWidth, nHeight, bLine, aHeaders, aColSizes, cParentWnd, ; bChange, bLDblClick, bRClick, cFont, nFontSize, ; hCursor, aColors, aImages, cMsg, lUpdate, uAlias, ; bWhen, nValue, lCellBrw, nStyle, bLClick, aLine, ; aActions, nLineStyle, lRePaint, lDelete, aJust, ; lLock, lAppend, lEnum, lAutoSearch, uUserSearch, lAutoFilter, uUserFilter, aPicture, ; lTransparent, uSelector, lEditable, lAutoCol, aColSel, cTooltip ) CLASS TSBrowse LOCAL aSuperHeaders, ParentHandle, ; aTmpColor := Array( 20 ), ; cAlias := "", ; lSuperHeader := .F., ; hFont, aClr IF HB_ISARRAY( aHeaders ) .AND. Len( aHeaders ) > 0 .AND. aHeaders[ 1 ] == NIL aHeaders := NIL ENDIF IF HB_ISARRAY( aColSel ) .AND. Len( aColSel ) > 0 .AND. aColSel[ 1 ] == NIL aColSel := NIL ENDIF DEFAULT nRow := 0, ; nCol := 0, ; nHeight := 100, ; nWidth := 100, ; nLineStyle := LINES_ALL, ; aLine := {}, ; aImages := {}, ; cFont := _HMG_ActiveFontName, ; nFontSize := _HMG_ActiveFontSize, ; nValue := 0, ; lDelete := .F., ; lAutoFilter := .F., ; lRepaint := .T., ; lAppend := .F., ; lLock := .F., ; lEnum := .F., ; lAutoSearch := .F., ; lTransparent := .F., ; lEditable := .F. IF _HMG_BeginWindowActive cParentWnd := _HMG_ActiveFormName ENDIF aTmpColor[ 1 ] := GetSysColor( COLOR_WINDOWTEXT ) // nClrText aTmpColor[ 2 ] := GetSysColor( COLOR_WINDOW ) // nClrPane aTmpColor[ 3 ] := GetSysColor( COLOR_BTNTEXT ) // nClrHeadFore aTmpColor[ 4 ] := GetSysColor( COLOR_BTNFACE ) // nClrHeadBack aTmpColor[ 5 ] := GetSysColor( COLOR_CAPTIONTEXT ) // nClrForeFocu aTmpColor[ 6 ] := GetSysColor( COLOR_ACTIVECAPTION ) // nClrFocuBack aTmpColor[ 7 ] := GetSysColor( COLOR_WINDOWTEXT ) // nClrEditFore aTmpColor[ 8 ] := GetSysColor( COLOR_WINDOW ) // nClrEditBack aTmpColor[ 9 ] := GetSysColor( COLOR_BTNTEXT ) // nClrFootFore aTmpColor[ 10 ] := GetSysColor( COLOR_BTNFACE ) // nClrFootBack aTmpColor[ 11 ] := CLR_HGRAY // nClrSeleFore inactive focused aTmpColor[ 12 ] := CLR_GRAY // nClrSeleBack inactive focused aTmpColor[ 13 ] := GetSysColor( COLOR_BTNTEXT ) // nClrOrdeFore aTmpColor[ 14 ] := GetSysColor( COLOR_BTNFACE ) // nClrOrdeBack aTmpColor[ 15 ] := GetSysColor( COLOR_BTNSHADOW ) // nClrLine aTmpColor[ 16 ] := GetSysColor( COLOR_BTNTEXT ) // nClrSupHeadFore aTmpColor[ 17 ] := GetSysColor( COLOR_BTNFACE ) // nClrSupHeadBack aTmpColor[ 18 ] := GetSysColor( COLOR_BTNTEXT ) // nClrSpecHeadFore aTmpColor[ 19 ] := GetSysColor( COLOR_BTNFACE ) // nClrSpecHeadBack aTmpColor[ 20 ] := CLR_HRED // nClrSpecHeadActive IF lAutoFilter aTmpColor[ 19 ] := GetSysColor( COLOR_INACTCAPTEXT ) ELSEIF lAutoSearch aTmpColor[ 19 ] := GetSysColor( COLOR_INFOBK ) ENDIF IF HB_ISARRAY( aColors ) .AND. Len( aColors ) > 0 IF HB_ISARRAY( aColors[ 1 ] ) FOR EACH aClr IN aColors IF HB_ISNUMERIC( aClr[ 1 ] ) .AND. aClr[ 1 ] > 0 .AND. aClr[ 1 ] <= Len( aTmpColor ) aTmpColor[ aClr[ 1 ] ] := aClr[ 2 ] ENDIF NEXT ELSE AEval( aColors, {| bColor, nEle | aTmpColor[ nEle ] := bColor } ) ENDIF ENDIF ...
|
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2323
Зарегистрирован: 11.02.10
|
|
Отправлено: 01.06.24 14:42. Заголовок: SergKis пишет: Попр..
SergKis пишет: Идея понятна, но после этих изменений начались проблемы с цветом заголовков и подвала - везде черный цвет. Вернул старый файл обратно - все стало нормально... 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4584
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.06.24 16:43. Заголовок: gfilatov2002 пишет н..
gfilatov2002 пишет | цитата: | | начались проблемы с цветом заголовков и подвала - везде черный цвет. |
| 1. добавить проверку входного массива IF HB_ISARRAY( aColors ) .AND. Len( aColors ) > 0 IF HB_ISARRAY( aColors[ 1 ] ) FOR EACH aClr IN aColors IF HB_ISNUMERIC( aClr[ 1 ] ) .AND. aClr[ 1 ] > 0 .AND. aClr[ 1 ] <= Len( aTmpColor ) IF aClr[ 2 ] != NIL aTmpColor[ aClr[ 1 ] ] := aClr[ 2 ] ENDIF ENDIF NEXT ELSE AEval( aColors, {| bColor, nEle | iif( bColor != NIL, aTmpColor[ nEle ] := bColor, )} ) //AEval( aColors, {| bColor, nEle | aTmpColor[ nEle ] := bColor } ) ENDIF ENDIF 2. входной массив формировать FUNCTION _DefineTBrowse( ControlName, ParentFormName, nCol, nRow, nWidth, nHeight, ; ... LOCAL aTmpColor := Array( 0 ), aClr ... IF Type( '_TSB_aControlhWnd' ) != 'A' PUBLIC _TSB_aControlhWnd := {}, _TSB_aControlObjects := {}, _TSB_aClientMDIhWnd := {} ENDIF IF HB_ISARRAY( aColors ) .AND. Len( aColors ) > 0 /* IF HB_ISARRAY( aColors[ 1 ] ) FOR EACH aClr IN aColors IF HB_ISNUMERIC( aClr[ 1 ] ) .AND. aClr[ 1 ] > 0 .AND. aClr[ 1 ] <= Len( aTmpColor ) aTmpColor[ aClr[ 1 ] ] := aClr[ 2 ] ENDIF NEXT ELSE AEval( aColors, {| bColor, nEle | aTmpColor[ nEle ] := bColor } ) ENDIF */ aTmpColor := aColors ENDIF IF ValType( fontcolor ) != "U" AAdd( aTmpColor, {{ 1, RGB( fontcolor[ 1 ], fontcolor[ 2 ], fontcolor[ 3 ] ) }} ) //aTmpColor[ 1 ] := RGB( fontcolor[ 1 ], fontcolor[ 2 ], fontcolor[ 3 ] ) ENDIF IF ValType( backcolor ) != "U" AAdd( aTmpColor, {{ 2, RGB( backcolor[ 1 ], backcolor[ 2 ], backcolor[ 3 ] ) }} ) //aTmpColor[ 2 ] := RGB( backcolor[ 1 ], backcolor[ 2 ], backcolor[ 3 ] ) ENDIF IF Empty( aTmpColor ) ; aTmpColor := NIL ENDIF ... Сейчас задание цветов входным параметром массива надо подправлять методом :SetColor()
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2324
Зарегистрирован: 11.02.10
|
|
Отправлено: 02.06.24 13:05. Заголовок: SergKis пишет: доба..
SergKis пишет: | цитата: | | добавить проверку входного массива |
| Пошел по этому пути, вроде отрабатывает нормально. Благодарю за помощь 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2325
Зарегистрирован: 11.02.10
|
|
Отправлено: 09.06.24 15:42. Заголовок: Завершена подготовка..
Завершена подготовка новой сборки 24.06, которая будет опубликована на следующей неделе. Что нового: - исправление обнаруженных ошибок; - добавлена новая функция HMG_GetUniqueName( [<NamePrefix>] ) и идентификатор пустого имени NUL для создания элемента управления без необходимости указания его имени (удобно, например, для безымянных меток Label); - важное обновление библиотеки TSBrowse ( спасибо, Сергей!) - обновлены Харбор, библиотеки SqlRdd, PdfPrinter и Sqlite3; - добавлены новые и обновлены старые примеры для демонстрации новых возможностей библиотеки. Желаю всем хорошего дня 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7772
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.06.24 14:37. Заголовок: В функциях Alert*() ..
В функциях Alert*() наверное нужно сделать запоминание/возврат текущего окна и сохранения среды This Я сталкивался с проблемами при показе простого сообщения. Приходиться делать так: .... _SetThisFormInfo(oWnd) AlertStop(cMsg) // или вызов другого окна _SetThisFormInfo() ..... Пример отправил на почту.
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2326
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.06.24 10:48. Заголовок: Всем кому это интересно
Опубликована финальная сборка 24.06 Стандартная сборка Профессиональная сборка (под паролем) Также были подготовлены дополнительные сборки для следующих компиляторов: - MinGW GNU C 14.1.0 (packaged on 2024-05-08) - BCC 7.70 (32-bit) (основан на коде Борланда) - BCC 7.70 (64-bit) (основан на CLang 5.0) Желаю всем хорошего дня 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2327
Зарегистрирован: 11.02.10
|
|
Отправлено: 14.06.24 12:50. Заголовок: Всем кому это интересно ;-)
Продолжаем хорошие новости... Протестировал текущую сборку Минигуи со свежей сборкой разрабатываемой версии компилятора MinGW 15.0 (64-bit). Результат можно увидеть на картинке ниже. 
|
 |
|
|
krutoff
|
| |
Пост N: 240
Зарегистрирован: 17.10.05
|
|
Отправлено: 25.06.24 11:29. Заголовок: Начались проблемы с цветом заголовков
У меня один TSBrowse вызывает несколько десятков броузов. Работает один блок создания экземпляра TSBrowse. С версии 24.03 в каждом экземляре цвет заголовка и Background стал меняться. Откатился на верию 24.01 - цвета отработали нормально..
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7774
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.06.24 12:05. Заголовок: krutoff пишет: С ве..
krutoff пишет: | цитата: | | С версии 24.03 в каждом экземляре цвет заголовка и Background стал меняться. |
| Поставил сегодня 24.06, собрал свою большую прогу - цвет фона таблицы стал другим ! У меня в коде так: DEFINE TBROWSE oBrw ... ; BACKCOLOR aBackColor ; ... В примере Tsb_oHmgData в новой версии цвет фона таблицы тоже меняется ! Сделал в старой 23.12 фон нормальный.
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4590
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.06.24 13:20. Заголовок: krutoff пишет С верс..
krutoff пишет Andrey пишет | цитата: | | в старой 23.12 фон нормальный |
| Была исправлена многолетняя ошибка в тсб (METHOD New) задания цветов параметром DEFINE TBROWSE oBrw ... ; BACKCOLOR aBackColor FONTCOLOR aFontColor ; COLOR aColors ; Если посмотрите код, то была в массив aTmpColor сначала установка из элементов параметра команды, а потом делались Default-ы на все элементы aTmpColor, потом менялись принудительно др. элементы, например IF lAutoFilter aTmpColor[ 19 ] := GetSysColor( COLOR_INACTCAPTEXT ) ELSEIF lAutoSearch aTmpColor[ 19 ] := GetSysColor( COLOR_INFOBK ) ENDIF т.е. затиралась установка из массва параметра команды тсб. Приходилось всегда править цвета доп. методами :SetColor(...) Правка коснулась перестановкой действий, сначала в массиве aTmpClor заполняются цвета по умолчанию (все элементы), потом команды IF lAutoFilter ... (см. выше) и потом из параметров команды тсб переносятся значения указанных\заданных элементов. Код стал такой Скрытый текст
METHOD New( cControlName, nRow, nCol, nWidth, nHeight, bLine, aHeaders, aColSizes, cParentWnd, ; ... aTmpColor[ 1 ] := GetSysColor( COLOR_WINDOWTEXT ) // nClrText aTmpColor[ 2 ] := GetSysColor( COLOR_WINDOW ) // nClrPane aTmpColor[ 3 ] := GetSysColor( COLOR_BTNTEXT ) // nClrHeadFore aTmpColor[ 4 ] := GetSysColor( COLOR_BTNFACE ) // nClrHeadBack aTmpColor[ 5 ] := GetSysColor( COLOR_CAPTIONTEXT ) // nClrForeFocu aTmpColor[ 6 ] := GetSysColor( COLOR_ACTIVECAPTION ) // nClrFocuBack aTmpColor[ 7 ] := GetSysColor( COLOR_WINDOWTEXT ) // nClrEditFore aTmpColor[ 8 ] := GetSysColor( COLOR_WINDOW ) // nClrEditBack aTmpColor[ 9 ] := GetSysColor( COLOR_BTNTEXT ) // nClrFootFore aTmpColor[ 10 ] := GetSysColor( COLOR_BTNFACE ) // nClrFootBack aTmpColor[ 11 ] := CLR_HGRAY // nClrSeleFore inactive focused aTmpColor[ 12 ] := CLR_GRAY // nClrSeleBack inactive focused aTmpColor[ 13 ] := GetSysColor( COLOR_BTNTEXT ) // nClrOrdeFore aTmpColor[ 14 ] := GetSysColor( COLOR_BTNFACE ) // nClrOrdeBack aTmpColor[ 15 ] := GetSysColor( COLOR_BTNSHADOW ) // nClrLine aTmpColor[ 16 ] := GetSysColor( COLOR_BTNTEXT ) // nClrSupHeadFore aTmpColor[ 17 ] := GetSysColor( COLOR_BTNFACE ) // nClrSupHeadBack aTmpColor[ 18 ] := GetSysColor( COLOR_BTNTEXT ) // nClrSpecHeadFore aTmpColor[ 19 ] := GetSysColor( COLOR_BTNFACE ) // nClrSpecHeadBack aTmpColor[ 20 ] := CLR_HRED // nClrSpecHeadActive IF lAutoFilter aTmpColor[ 19 ] := GetSysColor( COLOR_INACTCAPTEXT ) ELSEIF lAutoSearch aTmpColor[ 19 ] := GetSysColor( COLOR_INFOBK ) ENDIF IF HB_ISARRAY( aColors ) .AND. Len( aColors ) > 0 IF HB_ISARRAY( aColors[ 1 ] ) FOR EACH aClr IN aColors IF HB_ISNUMERIC( aClr[ 1 ] ) .AND. aClr[ 1 ] > 0 .AND. aClr[ 1 ] <= Len( aTmpColor ) IF aClr[ 2 ] != NIL aTmpColor[ aClr[ 1 ] ] := aClr[ 2 ] ENDIF ENDIF NEXT ELSE AEval( aColors, {| bColor, nEle | iif( bColor != NIL, aTmpColor[ nEle ] := bColor, ) } ) ENDIF ENDIF ...
|
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7775
Зарегистрирован: 12.09.06
|
|
Отправлено: 25.06.24 15:38. Заголовок: SergKis пишет: Была..
SergKis пишет: | цитата: | | Была исправлена многолетняя ошибка в тсб (METHOD New) задания цветов параметром |
| Так как исправить/задать заново фон ТСБ ? P.S. Поставил так, всё равно не работает !!! // цвет фона под таблицей IF MGVersNumba() >= 231202 // MG Version 23.12.02 :hBrush := aClrBrush ELSE DeleteObject(:hBrush) :hBrush := CreateSolidBrush(aClrBrush[1], aClrBrush[2], aClrBrush[3]) ENDIF
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4591
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.06.24 18:51. Заголовок: Кто нибудь может объ..
Кто нибудь может объяснить такую херомантию с цветами SpecHd ? Имеем в METHOD New( cControlName, nRow, nCol, nWidth, nHeight, bLine, aHeaders, aColSizes, cParentWnd, ; ... aTmpColor[ 18 ] := GetSysColor( COLOR_BTNTEXT ) // nClrSpecHeadFore aTmpColor[ 19 ] := GetSysColor( COLOR_BTNFACE ) // nClrSpecHeadBack ... IF lAutoFilter aTmpColor[ 19 ] := GetSysColor( COLOR_INACTCAPTEXT ) ELSEIF lAutoSearch aTmpColor[ 19 ] := GetSysColor( COLOR_INFOBK ) ENDIF ... ::aColors := aTmpColor ... в TSColumn еще краше METHOD DefColor( oBrw, aTmpColor ) CLASS TSColumn ... IF oBrw == NIL ... ELSE ... aTmpColor[ 17 ] := oBrw:nClrHeadBack, ; aTmpColor[ 20 ] := oBrw:nClrSpcHdActive IF oBrw:lEnum DEFAULT aTmpColor[ 18 ] := oBrw:nClrHeadFore, ; aTmpColor[ 19 ] := oBrw:nClrHeadBack ELSE DEFAULT aTmpColor[ 18 ] := oBrw:nClrEditFore, ; aTmpColor[ 19 ] := oBrw:nClrEditBack ENDIF ENDIF ... ::nClrSpcHdFore := aTmpColor[ 18 ] ::nClrSpcHdBack := aTmpColor[ 19 ] ... получается, что нет нормального задания цвета для спец. header, т.е. задаем ... AAdd( aColors, { CLR_EDITF , {|| CLR_RED } } ) // 7 , текста редактируемого поля AAdd( aColors, { CLR_EDITB , {|| CLR_YELLOW } } ) // 8 , фона редактируемого поля ... AAdd( aColors, { CLR_SPCF , {|| CLR_RED } } ) // 18, specheader text AAdd( aColors, { CLR_SPCB , {|| CLR_GRAY } } ) // 19, specheader back ... В итоге получаем цвет спец. header от CLR_EDITF и CLR_EDITB, что не правильно.
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7776
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.06.24 16:16. Заголовок: Если задаём цвет фон..
Если задаём цвет фона под таблицей ТОЛЬКО так: DEFINE TBROWSE &cBrw OBJ oBrw OF &cForm ; AT oTsb:nY, oTsb:nX ALIAS oTsb:cAls WIDTH oTsb:nW HEIGHT oTsb:nH CELL ; FONT oTsb:aFont ; // все фонты для таблицы BRUSH oTsb:aClrBrush ; // цвет фона под таблицей То в новой версии Минигуи 24.06 - цвет фона под таблицей будет белым ... Если добавить так, самым последним при назначении цветов: :hBrush := CreateSolidBrush(aClrBrush[1], aClrBrush[2], aClrBrush[3]) // цвет фона под таблицей То цвет фона под таблицей будет правильным. Объясните мне разницу - почему так нужно делать ? Мне не сложно добавить ещё строку в код, было бы без утечек памяти. И ещё фигня происходит, после использования oBrw:Enabled(.F.) ... oBrw:Enabled(.T.) Цвет фона под таблицей меняется на белый... 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2328
Зарегистрирован: 11.02.10
|
|
Отправлено: 28.06.24 15:16. Заголовок: Andrey пишет: Если ..
Andrey пишет: | цитата: | Если задаём цвет фона под таблицей ТОЛЬКО так: DEFINE TBROWSE &cBrw OBJ oBrw OF &cForm ; AT oTsb:nY, oTsb:nX ALIAS oTsb:cAls WIDTH oTsb:nW HEIGHT oTsb:nH CELL ; FONT oTsb:aFont ; // все фонты для таблицы BRUSH oTsb:aClrBrush ; // цвет фона под таблицей То в новой версии Минигуи 24.06 - цвет фона под таблицей будет белым |
| Благодарю за сообщение. Я уже поправил использование класса BRUSH для этого синтаксиса команды DEFINE TBROWSE. Andrey пишет: | цитата: | после использования oBrw:Enabled(.F.) ... oBrw:Enabled(.T.) Цвет фона под таблицей меняется на белый. |
| Эту проблему я тоже решил, внес исправление в код этого метода. Примечание. В вашей программе не нужно делать никаких изменений, нужна только исправленная библиотека.
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7777
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.06.24 13:13. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | В вашей программе не нужно делать никаких изменений, нужна только исправленная библиотека. |
| Там нужно код править для цветов, с учётом нового задания цвета для спецхидера. Сделаю сам, когда пришлёте новую библиотеку.
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2329
Зарегистрирован: 11.02.10
|
|
Отправлено: 29.06.24 15:17. Заголовок: Andrey пишет: когда..
Andrey пишет: | цитата: | | когда пришлёте новую библиотеку |
| Проверь свою почту Отправлено: Вчера, 15:39 | цитата: | Андрей! Высылаю для проверки исправленный вариант библиотеки. Сейчас такой вызов должен отработать нормально DEFINE TBROWSE oBrw AT nY,nX WIDTH nW HEIGHT nH CELL ; FONT aTsbFont ; BRUSH aBrush ; ON INIT {|ob| |
| 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7778
Зарегистрирован: 12.09.06
|
|
Отправлено: 29.06.24 21:50. Заголовок: Часть заработало, а ..
Часть заработало, а цвета спецхидера нет. Отправил письмо на почту.
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2330
Зарегистрирован: 11.02.10
|
|
Отправлено: 30.06.24 15:02. Заголовок: Andrey пишет: цвета..
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7779
Зарегистрирован: 12.09.06
|
|
Отправлено: 07.07.24 13:36. Заголовок: ColorBack для footer..
ColorBack для footer "SELECTOR" берется из последней фантомной (добавленной колонки), которая перед VScrollBar-ом (исторически) Для замены цвета введена переменная oBrw:nClrSelectorHdBack := ... Если менять на другой цвет, то вверх таблицы становиться обгрызанным. Можно ли добавить ЕЩЁ одну переменную, типа oBrw:nClrSelectorBottomBack для задания своего цвета ? Или добавить другую переменную для верха "SELECTOR", типа oBrw:nClrSelectorTopBack для задания своего цвета ? Вот для этого (1): 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2331
Зарегистрирован: 11.02.10
|
|
Отправлено: 07.07.24 15:35. Заголовок: Andrey пишет: добав..
Andrey пишет: | цитата: | | добавить ЕЩЁ одну переменную |
| Я добавил новую переменную nClrSelectorFtBack Такой вид подвала устраивает 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4592
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.07.24 15:42. Заголовок: Andrey пишет Можно л..
Andrey пишет | цитата: | | Можно ли добавить ЕЩЁ одну переменную |
| Можно добавить переменную отключающую :nClrSelectorHdBack и вкл. работу от данных цвета из колонки DATA nClrSelectorHdBack // special selector header background color DATA lClrSelectorHdBack AS LOGICAL INIT .T. // special selector header background color ON\OFF DATA nClrLine // grid line color ... METHOD DrawHeaders( lFooters, lDrawCell ) CLASS TSBrowse ... IF ::lDrawHeaders .AND. ! lFooters ... IF !( nJ == 1 .AND. ::lSelector ) IF ( nClrBack := iif( ::nColOrder == nI, oColumn:nClrOrdeBack, oColumn:nClrHeadBack ) ) == NIL nClrBack := iif( ::nColOrder == nI, nClrOrdeBack, nClrHeadBack ) ENDIF ELSEIF ! ::lClrSelectorHdBack nClrBack := oColumn:nClrHeadBack ELSEIF ::nClrSelectorHdBack != NIL nClrBack := ::nClrSelectorHdBack ELSE nClrBack := ATail( ::aColumns ):nClrHeadBack ENDIF ... IF ::lFooting .AND. ::lDrawFooters ... IF !( nJ == 1 .AND. ::lSelector ) // JP nClrBack := iif( oColumn:nClrFootBack != NIL, oColumn:nClrFootBack, nClrFootBack ) ELSEIF ! ::lClrSelectorHdBack nClrBack := oColumn:nClrFootBack ELSEIF ::nClrSelectorHdBack != NIL nClrBack := ::nClrSelectorHdBack ELSE nClrBack := ATail( ::aColumns ):nClrFootBack ENDIF ... тогда в prg делаем ~ так ... oBrw:lClrSelectorHdBack := .F. ... когда виртуальные колонки уже есть в oBrw:aColumns // изменим цвет колонки - виртуальная колонка / virtual column oBrw:GetColumn("SELECTOR"):nClrBack := nBCSpH oBrw:GetColumn("SELECTOR"):nClrFore := CLR_RED oBrw:GetColumn("SELECTOR"):nClrHeadBack := CLR_GREEN oBrw:GetColumn("SELECTOR"):nClrFootBack := CLR_YELLOW ...
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4593
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.07.24 11:55. Заголовок: PS Для SpecHeader та..
PS Для SpecHeader так же нужна правка, сделал так (тот же метод) ... IF ::lDrawSpecHd ... IF nI == nBegin .AND. ::lSelector //!!! nClrBacks := iif( ::lDrawSpecHd, ::nClrSpcHdBack, nClrHeadBack ) IF ::nClrSelectorHdBack != NIL nClrBacks := iif( ::lClrSelectorHdBack, ::nClrSelectorHdBack, oColumn:nClrSpcHdBack ) ELSE nClrBacks := nClrHeadBack ENDIF ELSE nClrBacks := iif( ::nPhantom == -1, ATail( ::aColumns ):nClrSpcHdBack, nClrPane ) ENDIF ... Пример использования oBrw:nClrSelectorHdBack := CLR_YELLOW oBrw:lClrSelectorHdBack := .F. // background OFF // изменим цвет колонки - виртуальная колонка / virtual column oCol := oBrw:GetColumn("SELECTOR") oCol:nClrBack := nBCSpH oCol:nClrFore := CLR_RED oCol:nClrHeadBack := CLR_BLUE oCol:nClrFootBack := CLR_GREEN oCol:nClrSpcHdBack := CLR_YELLOW oCol := oBrw:GetColumn("ORDKEYNO") oCol:nClrBack := nBCSpH oCol:nClrFore := CLR_RED oCol:nClrFootBack := nBCSpH oCol:nClrFootFore := CLR_RED
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4594
Зарегистрирован: 17.02.12
|
|
Отправлено: 13.07.24 14:00. Заголовок: gfilatov2002 Сделал..
gfilatov2002 Сделал правки Скрытый текст
METHOD DrawHeaders( lFooters, lDrawCell ) CLASS TSBrowse ... IF ::lDrawSpecHd ... IF HB_ISNUMERIC( oColumn:nSLineStyle ) nLineStyle := oColumn:nSLineStyle ENDIF IF nAlign != DT_CENTER .AND. ::nCellMarginLR != NIL cHeading := ::CellMarginLeftRight( nJ, cHeading, oColumn, nAlign, lMultiLine, 0 ) ENDIF // SergKis 11.11.21 nBitmapMask := oColumn:nBmpMaskSpcHd ... METHOD InsColNumber( nWidth, nColumn, cName, nAlign, uBitmap ) ... IF ::lIsDbf ... oCol:cFooting := {| nc, ob | nc := ob:nLen, iif( Empty( nc ), '', hb_ntos( nc ) ) } IF !Empty( uBitmap ) .and. Valtype( uBitmap ) $ "NC" IF Valtype( uBitmap ) == "N" oCol:aBitMaps := { Nil, StockBmp ( uBitmap ) } ELSE oCol:aBitMaps := { Nil, LoadImage( uBitmap ) } ENDIF oCol:uBmpCell := {|nc,ob,oc| oc := ob:aColumns[ nc ], ; nc := iif( (ob:cAlias)->(Deleted()), 2, 1 ), ; oc:aBitMaps[ nc ] } ENDIF ... oCol:nFieldDec := 0 IF HB_ISNUMERIC( nAlign ) .and. nAlign >= DT_LEFT .and. nAlign <= DT_RIGHT oCol:nSAlign := nAlign oCol:nAlign := nAlign oCol:nFAlign := nAlign ENDIF IF nColumn > 0 .and. nColumn <= Len( ::aColumns ) ... FUNCTION _TBrowse( oParam, uAlias, cBrw, nY, nX, nW, nH ) ... DEFAULT aColor := { ; { CLR_FOCUSF, GetSysColor( COLOR_WINDOWTEXT ) }, ; { CLR_FOCUSB, {|c,n,b| c := n, iif( b:nCell == n, -CLR_HRED, iif( b:lIsDbf .and. (b:cAlias)->(Deleted()), -CLR_HGRAY, -RGB( 128, 225, 225 ) ) ) } }, ; { CLR_SELEF , GetSysColor( COLOR_WINDOWTEXT ) }, ; { CLR_SELEB , {|c,n,b| c := n, iif( b:nCell == n, -CLR_BLUE, -RGB( 128, 225, 225 ) ) } } } ... Можно задавать для _TBrowse(...) oTsb := oHmgData() oTsb:aFooter := .T. oTsb:aEdit := .T. oTsb:lSpecHd := .T. oTsb:uSelector := 20 oTsb:aNumber := { 1, 50, DT_RIGHT, "bRecDel16" } // варианты: //oTsb:aNumber := { 1, 50 } // center and no bitmap //oTsb:aNumber := { 1, 50, DT_RIGHT } // no bitmap //oTsb:aNumber := { 1, 50, DT_RIGHT, 1 } // StockBmp(1) //oTsb:aNumber := { 1, 50, DT_RIGHT, 7 } // StockBmp(7) oBrw := _TBrowse( oTsb, cAls, "Brw_1", nY, nX, nW, nH ) ... Может быть стоит добавить в массив ф-ии StockBmp() еще пару,тройку простых bmp - крестик, галочку, кружочек, для пометки записей удаленных и ...
| Пример на версии 23.12 https://TransFiles.ru/opjc0
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2332
Зарегистрирован: 11.02.10
|
|
Отправлено: 13.07.24 16:26. Заголовок: SergKis пишет: Сдел..
SergKis пишет: Принято с благодарностью SergKis пишет: Криптование базы у меня НЕ работает. Также потребовалось добавить и пропущенную обработку новых параметров метода InsColNumber() в функцию _DefineTBrowse(). После этого вывод картинки в колонку нумератора заработал. 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4595
Зарегистрирован: 17.02.12
|
|
Отправлено: 13.07.24 17:26. Заголовок: gfilatov2002 пишет Т..
gfilatov2002 пишет | цитата: | | Также потребовалось добавить oBrw:lRowPosAtRec := .T. |
| Это я пропустил (вылетело из головы, от жары, наверное, извините), т.к. установка :lRowPosAtRec := .T. у меня стоит в _TBrowse(...) по умолчанию, что бы всегда знать строки отображаемые и для Tooltip подсвечивать длинную информацию из строки FUNCTION _TBrowse( oParam, uAlias, cBrw, nY, nX, nW, nH ) ... DEFAULT oParam := oHmgData() DEFAULT oParam:lRowPosAtRec := .T. ... :lRowPosAtRec := oParam:lRowPosAtRec :Cargo:oParam := oParam ... Вызов InsColNumber() в _DefineTBrowse() у себя сделал так Скрытый текст
LOCAL i, nColums, nLen, aColNumber := array(5) ... nW := 0 IF nColNumber != NIL IF HB_ISLOGICAL( nColNumber ) nColNumber := iif( nColNumber, 1, NIL ) ELSEIF HB_ISARRAY( nColNumber ) IF Len( nColNumber ) > 1 ASize( nColNumber, 5 ) //nW := nColNumber[ 2 ] aColNumber[2] := nColNumber[ 2 ] // nWidth aColNumber[3] := nColNumber[ 3 ] // nAlign aColNumber[4] := nColNumber[ 4 ] // Bitmap aColNumber[5] := nColNumber[ 5 ] // cName nColNumber := nColNumber[ 1 ] // nCol ELSE nColNumber := 1 ENDIF aColNumber[1] := nColNumber Default aColNumber[2] := 80 ENDIF ENDIF IF HB_ISNUMERIC( nColNumber ) nColNumber := iif( nColNumber > 0 .AND. nColNumber <= n, nColNumber, 1 ) // width name align bitmap oBrw:InsColNumber( aColNumber[2], nColNumber, aColNumber[5], aColNumber[3], aColNumber[4] ) oBrw:nCell := nColNumber + 1 oBrw:nFreeze := nColNumber oBrw:lLockFreeze := .T. //IF HB_ISNUMERIC( nW ) .AND. nW > 0 // oBrw:GetColumn( nColNumber ):nWidth := nW //ENDIF ENDIF ...
|
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2333
Зарегистрирован: 11.02.10
|
|
Отправлено: 13.07.24 18:06. Заголовок: SergKis пишет: Вызо..
SergKis пишет: | цитата: | | Вызов InsColNumber() в _DefineTBrowse() |
| Работает. Благодарю за помощь 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2334
Зарегистрирован: 11.02.10
|
|
Отправлено: 20.07.24 11:21. Заголовок: Всем кому это интересно...
Завершена подготовка новой сборки 24.07, которая будет опубликована в понедельник. Благодарю Сергея Киселева за помощь при подготовке этой сборки. Желаю всем хороших выходных. 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7783
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.07.24 18:14. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Завершена подготовка новой сборки 24.07 |
| А пример SIX3 будет в новой сборке ? 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2335
Зарегистрирован: 11.02.10
|
|
Отправлено: 20.07.24 18:44. Заголовок: Andrey пишет: приме..
Andrey пишет: | цитата: | | пример SIX3 будет в новой сборке ? |
| Нет. К слову SIXRDD версии 3.02 был разработан в 1993-1995, и он поддерживается в Харборе для совместимости. Многие его функции заменены вызовом нативных Харбор функций (или заданы через них). В свое время, конечно, это был продвинутый RDD, но кому сейчас интересен формат DBF, кроме гиков Считаю более актуальными для тех, кто рассматривает миграцию от DBF к SQL, примеры с использованием библиотек SQLRDD, SQLMIX и т.п. Но я могу быть неправ... P.S. Кстати, я включил в ПРО-сборку исправленную версию библиотеки SQLRDD: - была исправлена ошибка, когда для символьных полей возвращался размер, который в 4 раза больше, чем размер оригинального поля в базе DBF. Эта ошибка проявляется только в 64-битной версии библиотеки. 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7784
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.07.24 20:40. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | Считаю более актуальными для тех, кто рассматривает миграцию от DBF к SQL, примеры с использованием библиотек SQLRDD, SQLMIX и т.п. Но я могу быть неправ... |
| Это да, нужное решение. А можно включить простой пример открытия базы SQLRDD с использованием ТСБ на базе примера SIX3 ? Для sqlite тоже хотелось бы иметь пример на базе ТСБ, как пример для SIX3 (коротко и понятно) Я сам работал ранее с PostgreSql, сделаю простой пример для него, ранее давал конвертор DBF -> PgSql.
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2336
Зарегистрирован: 11.02.10
|
|
Отправлено: 22.07.24 09:50. Заголовок: Опубликована финальн..
Опубликована финальная сборка 24.07 Стандартная сборка Профессиональная сборка (под паролем) Также были подготовлены дополнительные сборки для следующих компиляторов: - MinGW GNU C 14.1.0 (packaged on 2024-07-09) - BCC 7.70 (32-bit) (основан на коде Борланда) - BCC 7.70 (64-bit) (основан на CLang 5.0) Желаю всем хорошего дня 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4599
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.07.24 16:16. Заголовок: gfilatov2002 Работа..
gfilatov2002 Работа с цветом, в :DrawHeaders() с :lSelector := .T., на мой взгляд, не корректна, т.е. отключен метод :SetColor() и стандартные задания цветов в заголовках SELECTOR и добавка DATA nClrSelectorFtBack // special selector footer background color мало что решает, заполняем лишние переменные, когда есть переменные самой колонки + при установке цвета есть неточность кода IF ::lDrawSpecHd ... IF nI == nBegin .AND. ::lSelector nClrBacks := iif( ::lDrawSpecHd, ::nClrSpcHdBack, nClrHeadBack ) ... мы уже в ::lDrawSpecHd. Предлагаю вернуться к варианту DATA nClrSelectorHdBack // special selector header background color DATA nClrSelectorFtBack // special selector footer background color если не убирать эту строку DATA lClrSelectorHdBack AS LOGICAL INIT .T. // special selector header background color ... METHOD DrawHeaders( lFooters, lDrawCell ) CLASS TSBrowse ... IF !( nJ == 1 .AND. ::lSelector ) IF ( nClrBack := iif( ::nColOrder == nI, oColumn:nClrOrdeBack, oColumn:nClrHeadBack ) ) == NIL nClrBack := iif( ::nColOrder == nI, nClrOrdeBack, nClrHeadBack ) ENDIF ELSEIF ! ::lClrSelectorHdBack nClrBack := oColumn:nClrHeadBack ELSEIF ::nClrSelectorHdBack != NIL nClrBack := ::nClrSelectorHdBack ELSE nClrBack := ATail( ::aColumns ):nClrHeadBack ENDIF ... IF ::lDrawSpecHd ... IF nI == nBegin .AND. ::lSelector //!!! nClrBacks := iif( ::lDrawSpecHd, ::nClrSpcHdBack, nClrHeadBack ) IF ! ::lClrSelectorHdBack nClrBacks := oColumn:nClrSpcHdBack ELSEIF ::nClrSelectorHdBack != NIL nClrBacks := ::nClrSelectorHdBack ELSE nClrBacks := nClrHeadBack ENDIF ELSE nClrBacks := iif( ::nPhantom == -1, ATail( ::aColumns ):nClrSpcHdBack, nClrPane ) ENDIF ... IF ::lFooting .AND. ::lDrawFooters ... IF !( nJ == 1 .AND. ::lSelector ) // JP nClrBack := iif( oColumn:nClrFootBack != NIL, oColumn:nClrFootBack, nClrFootBack ) ELSEIF ! ::lClrSelectorHdBack nClrBack := oColumn:nClrFootBack ELSEIF ::nClrSelectorFtBack != NIL nClrBack := ::nClrSelectorFtBack ELSEIF ::nClrSelectorHdBack != NIL nClrBack := ::nClrSelectorHdBack ELSE nClrBack := ATail( ::aColumns ):nClrFootBack ENDIF nClrBack := ::GetValProp( nClrBack, nClrBack, nJ ) ... Где oBrw:lClrSelectorHdBack := .F. - вкл. работу от параметров цветов из объекта колонки Еще правка в _Tbrowse(...) FUNCTION _TBrowse( oParam, uAlias, cBrw, nY, nX, nW, nH ) LOCAL oBrw, aTmp, aBrush, aHead, aField, aFoot, aColor LOCAL cForm, lSpecHd, bInit, bEnd LOCAL hForm LOCAL i, j DEFAULT oParam := oHmgData() DEFAULT oParam:cForm := oParam:cFormName DEFAULT oParam:cForm := _HMG_ThisFormName cForm := oParam:cForm hForm := GetFormHandle( cForm ) DEFAULT oParam:lRowPosAtRec := .T. ... DEFINE TBROWSE &cBrw OBJ oBrw AT nY,nX WIDTH nW HEIGHT nH CELL ; PARENT &(cForm) ; ... Еще маленькая добавка CLASS TWndData ... METHOD Maximize() INLINE ShowWindow( ::nHandle, SW_MAXIMIZE ) METHOD Minimize() INLINE ShowWindow( ::nHandle, SW_MINIMIZE ) METHOD Restore() INLINE ShowWindow( ::nHandle, SW_RESTORE ) ...
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2337
Зарегистрирован: 11.02.10
|
|
Отправлено: 25.07.24 17:09. Заголовок: SergKis пишет: Рабо..
SergKis пишет: | цитата: | Работа с цветом правка в _Tbrowse(...) |
| SergKis пишет: Все правки приняты. Благодарю за помощь 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4600
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.07.24 21:40. Заголовок: gfilatov2002 Как то..
gfilatov2002 Как то много букв с ::nDataType, может упростить ACCESS IsArr INLINE AND( ::nDataType, DATATYPE_ARRAY ) != 0 ACCESS IsDbf INLINE AND( ::nDataType, DATATYPE_RDD ) != 0 ACCESS IsAdo INLINE AND( ::nDataType, DATATYPE_ADO ) != 0 ACCESS IsText INLINE AND( ::nDataType, DATATYPE_TEXT ) != 0 ACCESS IsEdit INLINE ! Empty( ::aColumns[ ::nCell ]:oEdit ) ACCESS Tsb INLINE ::oWnd ACCESS nAtPos INLINE iif( ::IsDbf, ( ::cAlias )->( RecNo() ), ::nAt ) //ACCESS nAtPos INLINE iif( ::nDataType == DATATYPE_RDD, ( ::cAlias )->( RecNo() ), ::nAt ) ACCESS IsRowPosAtRec INLINE ; и далее по тексту где есть конструкции типа ::nDataType == DATATYPE_RDD или такие IF ! EmptyAlias( ::cAlias ) .AND. AND( ::nDataType, DATATYPE_ARRAY ) == 0 .AND. ; AND( ::nDataType, DATATYPE_TEXT ) == 0 .AND. AND( ::nDataType, DATATYPE_ADO ) == 0 ::lIsDbf := .T. ENDIF заменить
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4611
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.07.24 09:27. Заголовок: gfilatov2002 Правка..
gfilatov2002 Правка _TBrowse(...) Скрытый текст
FUNCTION _TBrowse( oParam, uAlias, cBrw, nY, nX, nW, nH ) ... DEFAULT lSpecHd := .F. DEFAULT oParam:bDblClick := oParam:bOnDblClick DEFAULT oParam:bGotFocus := oParam:bOnGotFocus DEFAULT oParam:bLostFocus := oParam:bOnLostFocus DEFAULT oParam:bChange := oParam:bOnChange IF HB_ISCHAR( uAlias ) .and. ! "." $ uAlias ; dbSelectArea( uAlias ) ENDIF IF HB_ISARRAY( oParam:aFont ) ... DEFINE TBROWSE &cBrw OBJ oBrw AT nY,nX WIDTH nW HEIGHT nH CELL ; ... ON GOTFOCUS oParam:bOnGotFocus ; ON CHANGE oParam:bOnChange ; ON LOSTFOCUS oParam:bOnLostFocus ; ON DBLCLICK oParam:bOnDblClick ; ... перенес IF HB_ISBLOCK( oParam:bGotFocus ) :bGotFocus := oParam:bGotFocus // :bGotFocus := {|ob,hCtlLost| ... } ENDIF IF HB_ISBLOCK( oParam:bLostFocus ) :bGotFocus := oParam:bLostFocus // :bLostFocus := {|hCtlFocus,ob| ... } ENDIF IF HB_ISBLOCK( oParam:bChange ) :bChange := oParam:bChange // :bChange := {|ob| ... } ENDIF после END TBROWSE IF HB_ISBLOCK( oParam:bGotFocus ) oBrw:bGotFocus := oParam:bGotFocus // :bGotFocus := {|ob,hCtlLost| ... } ENDIF IF HB_ISBLOCK( oParam:bLostFocus ) oBrw:bGotFocus := oParam:bLostFocus // :bLostFocus := {|hCtlFocus,ob| ... } ENDIF IF HB_ISBLOCK( oParam:bChange ) oBrw:bChange := oParam:bChange // :bChange := {|ob| ... } ENDIF добавил, что бы работал внутренний oParam:bEnd без изменений IF HB_ISBLOCK( oParam:bAfter ) ; EVal( oParam:bAfter, oBrw, oParam ) ENDIF IF HB_ISBLOCK( bEnd ) ; EVal( bEnd, oBrw, oParam ) ...
| PS В TsBrowse пропустили ? FUNCTION _DefineTBrowse( ControlName, ParentFormName, nCol, nRow, nWidth, nHeight, ; ... IF ISCHAR ( ControlName ) .AND. ControlName == "0" ControlName := HMG_GetUniqueName() ENDIF IF _IsControlDefined( ControlName, ParentFormName ) .AND. .NOT. _HMG_DialogInMemory PS2 Добавил i_timer.ch #command DEFINE TIMER <name> ; [ <dummy1: OF, PARENT> <parent> ] ; [ INTERVAL <interval> ] ; [ ACTION <action> ] [ <lOnce: ONCE> ] [ ON INIT <bInit> ] ; => ; _DefineTimer ( <(name)>, <(parent)>, <interval>, <{action}>, <.lOnce.>, <bInit> ) ... h_timer.prg FUNCTION _DefineTimer ( ControlName , ParentForm , Interval , ProcedureName , Once , bInit ) ... Do_ControlEventProcedure ( bInit, k ) RETURN lSuccess использовать DEFINE TIMER &(cN) INTERVAL 700 ON INIT {|| This.Enabled := .F. } ; ACTION {|| ... } PS3 h_objects.prg FUNCTION oDlu4Font( nFontSize, lDlu2Pix, nPrcW, nPrcH ) ... IF HB_ISCHAR( nFontSize ) nFontSize := _GetFontSize(nFontSize, "Main") ENDIF DEFAULT lDlu2Pix := .T., nFontSize := 11 //, nPrcW := 100, nPrcH := 100 ... использовать oDlu := oDlu4Font( "Normal" )
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2338
Зарегистрирован: 11.02.10
|
|
Отправлено: 30.07.24 16:53. Заголовок: SergKis пишет: Прав..
SergKis пишет: Все поправки приняты с благодарностью По ходу, исправил опечатку SergKis пишет: | цитата: | IF HB_ISBLOCK( oParam:bLostFocus ) oBrw:bGotFocus := oParam:bLostFocus // :bLostFocus := {|hCtlFocus,ob| ... } ENDIF |
| на IF HB_ISBLOCK( oParam:bLostFocus ) oBrw: bLostFocus := oParam:bLostFocus // :bLostFocus := {|hCtlFocus,ob| ... } ENDIF
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4613
Зарегистрирован: 17.02.12
|
|
Отправлено: 30.07.24 18:44. Заголовок: gfilatov2002 пишет и..
gfilatov2002 пишет Спасибо  , пропустил такую бяку 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7822
Зарегистрирован: 12.09.06
|
|
Отправлено: 17.08.24 15:42. Заголовок: Собираю проект Tsb_A..
Собираю проект Tsb_Access2 в версии 23.12.5 - всё работает. Если собираю последней версией 24.07 - вылетает с такой ошибкой: Error BASE/1005 Message not found: TSBROWSE:_LCLRSELECTORHDBACK Args: [1] = O TSBROWSE Called from __ERRRT_SBASE(0) Called from TSBROWSE:ERROR(0) Called from (b)HBOBJECT(0) Called from TSBROWSE:MSGNOTFOUND(0) Called from TSBROWSE:_LCLRSELECTORHDBACK(0) <<-- наверное нет в версии 24.07 Called from MYTSBEND(744) in module: tsb_ViewAccess.prg Called from DRAW_RECORDSET(351) in module: tsb_ViewAccess.prg
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7827
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.08.24 15:29. Заголовок: Не работает мой прое..
Не работает мой проект Tsb_dbf(0.74).7z на версии 24.07 Ошибка на версии 24.07 такая: Error BASE/1081 Неверный аргумент: + Args: [1] = C Window: [2] = U --------------------------------- Stack Trace --------------------------------- Called from _DEFINETBROWSE(249) in module: h_tbrowse.prg Called from _TBROWSE(558) in module: h_controlmisc2.prg Called from TSB_VIEWDBF(63) in module: tsb_ViewDbf.prg Called from MENU2OPENFILE(171) in module: 2file.prg Called from (b)SETS_EVENT2WINDOWSTANDART(211) in module: 0main.prg Called from DO_WINDOWEVENTPROCEDURE(82) in module: h_objmisc.prg Called from TWNDDATA:DOEVENT(1435) in module: h_objects.prg Called from DO_ONWNDLAUNCH(668) in module: h_objmisc.prg Called from (b)INIT(127) in module: h_init.prg Если собираю на версии Сергея - 23.12.5 то работает Нет правки для случая когда объект ТСБ определяется на другом окне. Мой код: // ------ вариант 2 oTsb:cForm := oWnd:Name // <--- обязательно так !!! oTsb:cFormName := oWnd:Name // или так ? ProcNL(), cAls, ALIAS(), "cBrw=",cBrw // функция в библиотеке \MiniGUI\SOURCE\TsBrowse\h_controlmisc2.prg oBrw := _TBrowse( oTsb, cAls, cBrw, oTsb:nY, oTsb:nX, oTsb:nW, oTsb:nH ) <<<----- строка 63 Наверное в версии 24.07 нет изменений для назначения oTsb:cForm и oTsb:cFormName Проект отправил на почту.
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4620
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.08.24 19:13. Заголовок: Andrey Будь внимате..
Andrey Будь внимательнее gfilatov2002 22.07.24 09:50. | цитата: | | Опубликована финальная сборка 24.07 |
| После этого ... SergKis => предложения ... gfilatov2002
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4621
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.08.24 16:43. Заголовок: gfilatov2002 Предло..
gfilatov2002 Предложение по Alert*, добавить смену фонта, т.е. STATIC aBackColor, aFontColor, cFontNameAlert := "DlgFont" *-----------------------------------------------------------------------------* FUNCTION HMG_Alert( cMsg, aOptions, cTitle, nType, cIcoFile, nIcoSize, aBtnColors, bInit, lClosable, cFontName ) *-----------------------------------------------------------------------------* ... hb_default( @lClosable, .F. ) hb_default( @cFontName, cFontNameAlert ) ... *-----------------------------------------------------------------------------* FUNCTION _SetMsgAlertFontName( cFontName ) *-----------------------------------------------------------------------------* LOCAL cOldFont := cFontNameAlert IF cFontName != NIL cFontNameAlert := cFontName ENDIF RETURN cOldFont Применение ... // Alert* font _DefineFont("DlgFont" , o:cDlgFont , o:nDlgSize , .F., .F. ) _DefineFont("DlgFont2", "Courier New" , o:nDlgSize , .F., .F. ) ... cOld := _SetMsgAlertFontName("DlgFont2") AlertInfo(cMsg) _SetMsgAlertFontName(cOld)
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2344
Зарегистрирован: 11.02.10
|
|
Отправлено: 24.08.24 16:00. Заголовок: SergKis пишет: Пред..
SergKis пишет: | цитата: | | Предложение по Alert*, добавить смену фонта |
| Благодарю за помощь Добавил такое описание в файл changelog.txt | цитата: | * Enhanced: Added the auxiliary function HMG_Alert_FontName() for managing of a font name in the function HMG_Alert(). Usage: // Alert* font _DefineFont( "DlgFont" , o:cDlgFont , o:nDlgSize, .F., .F. ) _DefineFont( "DlgFont2", "Courier New", o:nDlgSize, .F., .F. ) ... cOld := HMG_Alert_FontName( "DlgFont2" ) AlertInfo( cMsg ) HMG_Alert_FontName( cOld ) |
|
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2345
Зарегистрирован: 11.02.10
|
|
Отправлено: 02.09.24 09:58. Заголовок: Всем кому это интересно...
Опубликована финальная сборка 24.08 Стандартная сборка Профессиональная сборка (под паролем) Также были подготовлены дополнительные сборки для следующих компиляторов: - MinGW GNU C 14.2.0 (packaged on 2024-08-06) - BCC 7.70 (32-bit) (основан на коде Борланда) - BCC 7.70 (64-bit) (основан на CLang 5.0) Желаю всем хорошего дня 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4627
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.09.24 18:46. Заголовок: gfilatov2002 Пример..
gfilatov2002 Примеры Tsb_SBrowse. При вкл. корректировки колонки Notes формируются файлы checkres.txt, строки C:\MiniGuiBcc58\SAMPLES\Advanced\Tsb_sbrowse\demo.exe -- BRUSH,1141904083,TSMULTI:NEW(76)->TSBROWSE:EDIT(5559)->TSBROWSE:KEYDOWN(8761)->TSBROWSE:HANDLEEVENT(9669)->EVENTS(141)->DOMESSAGELOOP(0)->_ACTIVATEWINDOW(1648)->SBROWSE(308)->(b)MAIN(37)->_PROCESSINITPROCEDURE(1824)->_ACTIVATEWINDOW(1635)->DOMETHOD(5909)->MAIN(51) C:\MiniGuiBcc58\SAMPLES\Advanced\Tsb_sbrowse\demo2.exe -- BRUSH,-2146429614,TSMULTI:NEW(76)->TSBROWSE:EDIT(5559)->TSBROWSE:KEYDOWN(8761)->TSBROWSE:HANDLEEVENT(9669)->EVENTS(141)->DOMESSAGELOOP(0)->_ACTIVATEWINDOW(1648)->SBROWSE(308)->MY_SBROWSE(82)->(b)MAIN(48)->DO_WINDOWEVENTPROCEDURE(82)->TWNDDATA:DOEVENT(1441)->DO_ONWNDLAUNCH(668)->(b)INIT(127)->EVENTS(1179)->DOMESSAGELOOP(0)->_ACTIVATEWINDOW(1648)->DOMETHOD(5909)->MAIN(69)
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2346
Зарегистрирован: 11.02.10
|
|
Отправлено: 03.09.24 19:34. Заголовок: SergKis пишет: При ..
SergKis пишет: | цитата: | | При вкл. корректировки колонки Notes формируются файлы checkres.txt |
| Благодарю за сообщение! Поправил код в методе End() следующим образом METHOD End() CLASS TControl LOCAL ix LOCAL nAt := If( ! Empty( ::oWnd:aControls ), ; AScan( ::oWnd:aControls, {| hCtrl | hCtrl == Self:hWnd } ), 0 ) IF nAt != 0 ADel( ::oWnd:aControls, nAt ) ASize( ::oWnd:aControls, Len( ::oWnd:aControls ) - 1 ) ENDIF IF ::hBrush != NIL DeleteObject( ::hBrush ) ENDIF ::DelVars( Self:hWnd ) ... и теперь этот файл НЕ создается. P.S. SergKis пишет: Строку 76 в файле TSMULTI.PRG я закомментировал...
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4628
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.09.24 17:48. Заголовок: gfilatov2002 Неболь..
gfilatov2002 Небольшое предложение h_alert.prg STATIC aBackColor, aFontColor, cLineSeparator := ";|" ... IF Set( _SET_DELIMITERS ) .and. !Empty(cLineSeparator) cOldDelim := Set( _SET_DELIMCHARS ) Set( _SET_DELIMCHARS, cLineSeparator ) #ifdef __XHARBOUR__ ... *-----------------------------------------------------------------------------* FUNCTION HMG_Alert_Separator( cSeparator ) *-----------------------------------------------------------------------------* LOCAL cOldSep := cLineSeparator IF HB_ISCHAR( cSeparator ) cLineSeparator := cSeparator ENDIF RETURN cOldSep ... тогда ini файлы и т.д. можно показывать как ест, т.е. ... cOSep := HMG_Alert_Separator("") cText := hb_memoread(cFile) AlertInfo(cText, , , , , , , .T.) HMG_Alert_Separator(cOSep) ...
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2347
Зарегистрирован: 11.02.10
|
|
Отправлено: 05.09.24 20:37. Заголовок: SergKis пишет: Небо..
SergKis пишет: | цитата: | | Небольшое предложение h_alert.prg |
| Добавил такую возможность. Благодарю за помощь! 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7846
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.09.24 20:43. Заголовок: https://i.postimg.cc..
Иконки 96х96 не помещаются. И наверное на нужно ещё сделать 128х128, экраны у юзеров большие !!!
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2348
Зарегистрирован: 11.02.10
|
|
Отправлено: 06.09.24 14:57. Заголовок: Andrey пишет: нужно..
Andrey пишет: | цитата: | | нужно ещё сделать 128х128 |
| Попробуй переопределить следующую константу в файле h_alert.prg | цитата: | #define MARGIN_ICON 130 // 70 |
|
и затем пересобрать библиотеку, конечно. 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2349
Зарегистрирован: 11.02.10
|
|
Отправлено: 13.09.24 11:37. Заголовок: Всем кому это интересно...
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4632
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.09.24 13:10. Заголовок: gfilatov2002 Неболь..
gfilatov2002 Небольшая правка LetoDbf. server\letofunc.c /* leto_udf() */ HB_FUNC( LETO_GETAPPOPTIONS ) { HB_USHORT uiNum; if( HB_ISNUM( 1 ) ) uiNum = ( HB_USHORT ) hb_parni( 1 ); else uiNum = 0; switch( uiNum ) { case LETOOPT_DATAPATH: hb_retc( s_pDataPath ); break; case LETOOPT_INDEXTYPE: hb_retni( s_uiDriverDef ); break; case LETOOPT_FILEFUNC: hb_retl( s_bFileFunc ); break; case LETOOPT_ANYEXT: ... server\server.prg ... REQUEST WaitRunTerm REQUEST hb_hrbRun, hb_hrbLoad, hb_hrbDo, hb_hrbUnLoad, hb_hrbGetFunsym, hb_hrbGetFunList REQUEST CompressFiles, UnCompressFiles REQUEST HB_ZIPFILE, HB_UNZIPFILE REQUEST HB_DIRECTORY, HB_ISARRAY, HB_ISCHAR, HB_ISLOGICAL, HB_ISBLOCK, ; HB_ISNUMERIC, HB_ISOBJECT, HB_ISNIL, hb_Default, hb_ExecFromArray, ; hb_jsonDecode, hb_jsonEncode, hb_DirSepAdd, hb_DirBuild, hb_DirExists, ; hb_DefaultValue, hb_DirTemp, hb_DirUnbuild, hb_FileExists, hb_ForNext, ; hb_FNameDir, hb_FNameExt, hb_FNameExtSet, hb_FNameExtSetDef, hb_FNameMerge, ; hb_FNameName, hb_FNameNameExt, hb_FNameSplit, hb_eol, hb_ps, ; HB_Crypt, HB_DeCrypt, hb_CRC32, hb_memoread, hb_memowrit, Seconds ... и добавка в letoudf.prg /* leto_AppGetOptions() of this HRB */ FUNCTION UDF_AppGetOptions Local aOptions := {} AAdd( aOptions, { "DataPath" , leto_GetAppOptions( 1 ) } ) // LETOOPT_DATAPATH AAdd( aOptions, { "IndexType" , leto_GetAppOptions( 2 ) } ) // LETOOPT_INDEXTYPE AAdd( aOptions, { "FileFunc" , leto_GetAppOptions( 3 ) } ) // LETOOPT_FILEFUNC AAdd( aOptions, { "AnyExt" , leto_GetAppOptions( 4 ) } ) // LETOOPT_ANYEXT AAdd( aOptions, { "ShareTables" , leto_GetAppOptions( 10 ) } ) // LETOOPT_SHARETABLES AAdd( aOptions, { "NoSaveWA" , leto_GetAppOptions( 11 ) } ) // LETOOPT_NOSAVEWA AAdd( aOptions, { "DebugLevel" , leto_GetAppOptions( 17 ) } ) // LETOOPT_DEBUGLEVEL AAdd( aOptions, { "Optimize" , leto_GetAppOptions( 18 ) } ) // LETOOPT_OPTIMIZE AAdd( aOptions, { "AutoOrder" , leto_GetAppOptions( 19 ) } ) // LETOOPT_AUTOORDER AAdd( aOptions, { "MemoType" , leto_GetAppOptions( 20 ) } ) // LETOOPT_MEMOTYPE AAdd( aOptions, { "LockCheme" , leto_GetAppOptions( 22 ) } ) // LETOOPT_LOCKCHEME AAdd( aOptions, { "UdfEnabled" , leto_GetAppOptions( 23 ) } ) // LETOOPT_UDFENABLED AAdd( aOptions, { "MemoSize" , leto_GetAppOptions( 24 ) } ) // LETOOPT_MEMOSIZE AAdd( aOptions, { "LowerPath" , leto_GetAppOptions( 25 ) } ) // LETOOPT_LOWERPATH AAdd( aOptions, { "Trigger" , leto_GetAppOptions( 26 ) } ) // LETOOPT_TRIGGER AAdd( aOptions, { "HardCommit" , leto_GetAppOptions( 27 ) } ) // LETOOPT_HARDCOMMIT AAdd( aOptions, { "VersionServer", "3.01" } ) AAdd( aOptions, { "VersionUDF" , UDF_Version() } ) AAdd( aOptions, { "VersionOS" , OS() } ) AAdd( aOptions, { "SepatorPath" , hb_ps() } ) AAdd( aOptions, { "SepatorLine" , hb_eol() } ) RETURN aOptions ... использование aOpt := leto_Udf("UDF_AppGetOptions") ; Default aOpt := {{"Error", "UDF not found"}} ?v aOpt ; ? oOpt := oHmgData() oOpt:Set(aOpt) ?v oOpt:GetAll() ; ? ? oOpt:FileFunc, oOpt:UdfEnabled, oOpt:DataPath PS. можно и такую udf добавить /* leto_Directory() of this HRB */ FUNCTION UDF_GetFiles( cPath, cMask, cAttr, aFiles ) LOCAL aDir, aFil, nLen Local cDataPath := hb_DirSepAdd( leto_GetAppOptions( 1 ) ) IF aFiles == NIL ; aFiles := {} ENDIF IF cPath == NIL ; cPath := "" ENDIF IF cMask == NIL ; cMask := "*" ENDIF IF cAttr == NIL ; cAttr := "AD" ENDIF IF !Empty(cPath) ; cPath := hb_DirSepAdd(cPath) ENDIF aDir := hb_Directory( cDataPath + cPath + cMask, cAttr ) IF hb_IsArray(aDir) .and. Len(aDir) > 0 IF !Empty(cPath) nLen := Len(aDir) aFil := { cPath, nLen - 2, hb_CtoT(""), "", "D" } aAdd(aFiles, aClone(aFil)) ENDIF FOR EACH aFil IN aDir IF left(aFil[1], 1) != "." IF aFil[5] == "D" UDF_GetFiles( cPath + aFil[1], cMask, cAttr, aFiles ) ELSE aFil[1] := upper(cPath) + lower(aFil[1]) aAdd(aFiles, aClone(aFil)) ENDIF ENDIF NEXT ENDIF RETURN aFiles использование aFil := leto_UDF("UDF_GetFiles") ?v aFil ; ? aFil := leto_UDF("UDF_GetFiles", "TRANSFER") ?v aFil ; ?
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2350
Зарегистрирован: 11.02.10
|
|
Отправлено: 20.09.24 16:23. Заголовок: SergKis пишет: Небо..
SergKis пишет: Добавил эти изменения, но убрал из кода сервера функции, которые зависят от Минигуи. Также увеличил версию сервера до 3.01 | цитата: | //REQUEST WaitRunTerm REQUEST hb_hrbRun, hb_hrbLoad, hb_hrbDo, hb_hrbUnLoad, hb_hrbGetFunsym, hb_hrbGetFunList //REQUEST CompressFiles, UnCompressFiles REQUEST HB_ZIPFILE, HB_UNZIPFILE REQUEST HB_DIRECTORY, HB_ISARRAY, HB_ISCHAR, HB_ISLOGICAL, HB_ISBLOCK, ; HB_ISNUMERIC, HB_ISOBJECT, HB_ISNIL, hb_Default, hb_ExecFromArray, ; hb_jsonDecode, hb_jsonEncode, hb_DirSepAdd, hb_DirBuild, hb_DirExists, ; hb_DefaultValue, hb_DirTemp, hb_DirUnbuild, hb_FileExists, hb_ForNext, ; hb_FNameDir, hb_FNameExt, hb_FNameExtSet, hb_FNameExtSetDef, hb_FNameMerge, ; hb_FNameName, hb_FNameNameExt, hb_FNameSplit, hb_eol, hb_ps, ; HB_Crypt, HB_DeCrypt, hb_CRC32, hb_memoread, hb_memowrit, Seconds |
| SergKis пишет: Оставил в поставке стандартный файл l etoudf.prg, любые дополнительные функции можно добавить в этот файл или в свою программу по желанию. Благодарю за помощь 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7862
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.09.24 16:29. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Также увеличил версию сервера до 3.01 |
| Где эта циферка сидит ? Не могу у себя исправить, всегда показывает 3.0 вот по этой функции Leto_GetServerVersion()
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4633
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.09.24 17:50. Заголовок: Andrey пишет Не могу..
Andrey пишет | цитата: | | Не могу у себя исправить, всегда показывает 3.0 вот по этой функции Leto_GetServerVersion() |
| версия сидит в include\funcleto.h #define LETO_VERSION_STRING "3.0" надо править тут, но главное, после сборки заменить клиента полученного в MiniGui, потому и предлагал UDF_AppGetOptions, что бы не заморачиваться с этим и за одно обращение к серверу иметь все доступные режимы работ его.
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4634
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.09.24 18:05. Заголовок: gfilatov2002 пишет Д..
gfilatov2002 пишет | цитата: | | Добавил эти изменения, но убрал из кода сервера функции, которые зависят от Минигуи. |
| сборка лежит в hmg и сервер для windows, так что вполне может быть привязан к MiniGui, но отпадают мелькающие черные экраны с использованием leto_ProcessRun(...), она хороша, но ... не всегда. Я беру и в каталог Advanced\LetoDbf кладу каталог Letodbf-master, в нем делаю _Build.bat с одной строкой call ..\..\..\..\batch\hbmk2.bat /n %* letodb.hbp и _Build_udf.bat (letoudf.prg кладу в SOURCE) со строками @echo off SET UDF=.\SOURCE if exist letoudf.hrb del letoudf.hrb > nul call ..\..\..\..\batch\hbmk2.bat letoudf.hbp if exist letoudf.hrb move letoudf.hrb %UDF%\letoudf.hrb для windows daemon сборки (как в версии hmg) все ok!, но получается, все таки, это лишнее, на мой взгляд. Можно включить ShellExecuteEx вместо WaitRunTerm (тут вариантов больше). Будет размер exe немного больше Зато в сборке hmg нормальная сборка сервера и не надо каждый раз его пересобирать, после новой версии hmg
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2351
Зарегистрирован: 11.02.10
|
|
Отправлено: 20.09.24 18:32. Заголовок: SergKis пишет: Можн..
SergKis пишет: | цитата: | | Можно включить ShellExecuteEx вместо WaitRunTerm |
| Тогда добавлю функцию WAPI_SHELLEXECUTE_WAIT() из библиотеки hbwin для замены WaitRunTerm 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4635
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.09.24 19:13. Заголовок: gfilatov2002 пишет Т..
gfilatov2002 пишет | цитата: | | Тогда добавлю функцию WAPI_SHELLEXECUTE_WAIT() из библиотеки hbwin для замены WaitRunTerm |
| Она без ожидания запускает ? Это важно иметь обе возможности, без ожидания и с ожиданием и кодом возврата. В linuks эти строки для windows, комментируются в коде, остальное остается, Андрей проверил.
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4636
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.09.24 14:08. Заголовок: gfilatov2002 Вынеси..
gfilatov2002 Вынесите _o2log(...) ( вместе с STATIC FUNCTION TR0( cTxt, nLen, cSim ) ) за скобку #ifdef _OBJECT_ она к oHmgData() подходит в пару
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7864
Зарегистрирован: 12.09.06
|
|
Отправлено: 21.09.24 22:03. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Тогда добавлю функцию WAPI_SHELLEXECUTE_WAIT() из библиотеки hbwin для замены WaitRunTerm |
| Как это использовать ? Как различать какой сервер запущен: на Windows или на Linux ? Я конечно могу предложить своё решение, но хотелось бы иметь СТАНДАРТНОЕ решение. Это нужно для запуска внешних программ, пока архиваторов. Для Linux работает запуск Rar и Zip без .exe Уже проверял, работает. Встроенный hb_ZipFile() работает в 3 раза быстрей. // Здесь два бегунка - на стороне сервера LetoDbf НЕ БУДУТ работать bBlock := {|| Nil } // показ общего бегунка bBlock2 := {|| Nil } // показ для каждого файла tStart := hb_DateTime() // запуск функции на сервере hb_ZipFile() lScs := Leto_Udf("hb_ZipFile", cZipFile, aZip, nLZip, bBlock, NIL, cPsw, .T., , bBlock2) cTime := "Time spent archiving - " + HMG_TimeMS( tStart ) + "!;;"
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4638
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.09.24 23:05. Заголовок: Andrey пишет Как это..
Andrey пишет Это для windows сборки (которая в hmg), запуски exe на сервере без черных окон leto_ProcessRun WAPI_SHELLEXECUTE_WAIT() - с ожиданием и кодом возврата WAPI_SHELLEXECUTE() - ты знаешь exe работает на сервере, например, VWT без экранных команд или даже hmg сборка без окон для разных операций с базой (выступать может автономным модулем или как клиент сервера к localhost), в том числе и 7za.exe
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2352
Зарегистрирован: 11.02.10
|
|
Отправлено: 22.09.24 11:19. Заголовок: SergKis пишет: Выне..
SergKis пишет: | цитата: | | Вынесите _o2log(...) ( вместе с STATIC FUNCTION TR0( cTxt, nLen, cSim ) ) за скобку |
| OK Благодарю за все ваши предложения - всегда "по делу". 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2353
Зарегистрирован: 11.02.10
|
|
Отправлено: 23.09.24 12:55. Заголовок: Всем кому это интересно...
Подготовил вторую бета версию новой сборки библиотеки Минигуи. Что нового: Скрытый текст
* Fixed: StatusItem, ProgressItem, KeyBoard, Clock items: program crashes when these controls were defined after END WINDOW command. Example: // Define the main window DEFINE WINDOW Form_1 ... ... END WINDOW // Define a status bar DEFINE STATUSBAR OF Form_1 STATUSITEM "Ready" KEYBOARD CLOCK END STATUSBAR Contributed by Grigory Filatov * Enhanced: The StatusBar command supports now the optional PROMPT clause. This message will be used to display in the 1st status item when the status bar has been defined like this DEFINE STATUSBAR PROMPT "Ready" END STATUSBAR Contributed by Grigory Filatov (see demo in folder \samples\Basic\ChatGPT\template) * Enhanced: Added the auxiliary function HMG_Alert_Separator() for managing of a delimiter in the function HMG_Alert(). Usage: // Set empty Alert* separator cOldSep := HMG_Alert_Separator( "" ) cText := hb_MemoRead( cFile ) AlertInfo( cText, , , , , , , .T. ) HMG_Alert_Separator( cOldSep ) Suggested and contributed by Sergej Kiselev * New: The SPLITTER library source code (see in folder \Source\Splitter). Don't miss this very interesting expansion! Contributed by Kamil Kalus <kamilkalus0[at]gmail.com> Revised by Grigory Filatov (see demo in folder \samples\Advanced\Splitter) * Updated: Adaptation FiveWin Class TSBrowse 9.0 in HMG: - fixed a resource leakage in the TSMulti class. Reported by Sergej Kiselev on the Russian HMG forum. Contributed by Grigory Filatov (see demo in folder \samples\Advanced\Tsb_SBrowse) * Updated: Harbour Compiler 3.2.0dev (SVN 2024-08-17 17:37). Contributed by Grigory Filatov <gfilatov@gmail.com> (look at ReadMe.txt in folder \harbour) [STANDARD VERSION] * New: 'Minigui Basic examples generated by ChatGPT AI' samples: - added 'Quick Start Guide' by ChatGPT; - added 'Unlocking the Power of Harbour MiniGUI' by ChatGPT; - added 'Key Differences from DOS Programming' by ChatGPT; - added 'Commented some of the core functions' by ChatGPT. Revised for Minigui Extended by Grigory Filatov (see in folder \samples\Basic\ChatGPT) * New: 'Database RollBack testing in DBF' sample. Based upon a contribution of G. N. Rao for FiveWin. Adapted for Minigui Extended by Grigory Filatov (see in folder \samples\Advanced\DBROLLBACK) * New: 'Remove Drive By Letter Safely' utility. Based upon a code by Uwe Sieber - www.uwe-sieber.de Adapted for Minigui Extended by Grigory Filatov (see in folder \Utils\RemoveDriveByLetter) [PRO VERSION] * Updated: 'Simple app for creating backup of source files' utility: - updated for compatibility with the last Minigui changes. Contributed by Grigory Filatov (see in folder \Utils\SOURCE_ARCHIVER) [PRO VERSION] * Updated: 'LetoDBf server&client testing' sample: - added directory and zip compress functions to LetoDBf server code. Suggested and contributed by Sergej Kiselev (see in folder \samples\Advanced\LetoDBf\SERVER\SOURCE) - updated LetoDBf server to version 3.01. Contributed by Grigory Filatov (see in folder \samples\Advanced\LetoDBf\SERVER) [PRO VERSION] * Updated: 'HMG Achoice' sample: added new possibilities. Contributed by Pierpaolo Martinello (see in folder \samples\Advanced\ACHOICE_2) * Updated: 'Five GUI libraries for testing' sample: - changed GUI functions to a class. Contribution of Jose Quintas. Revised for Minigui Extended by Grigory Filatov (see in folder \samples\Advanced\FiveLibsTest)
| Если у вас есть предложения или вопросы, я готов их рассмотреть... 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4639
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.09.24 17:49. Заголовок: gfilatov2002 в Leto..
gfilatov2002 в LetoDbf добавить REQUEST hb_NtoC, hb_EnumIndex
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2354
Зарегистрирован: 11.02.10
|
|
Отправлено: 23.09.24 18:00. Заголовок: SergKis пишет: REQU..
SergKis пишет: | цитата: | | REQUEST hb_NtoC, hb_EnumIndex |
| Видимо, имелась ввиду функция hb_NtoS, так она уже линкуется вместе с сервером | цитата: | REQUEST HB_HEXTONUM, HB_NUMTOHEX, HB_NTOS |
|
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4640
Зарегистрирован: 17.02.12
|
|
Отправлено: 23.09.24 20:56. Заголовок: gfilatov2002 пишет В..
gfilatov2002 пишет | цитата: | | Видимо, имелась ввиду функция hb_NtoS |
| Имел ввиду hb_NtoC, такая используется оч. давно, если переносишь код приходится править, но в целом, не принципиально
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2355
Зарегистрирован: 11.02.10
|
|
Отправлено: 24.09.24 09:47. Заголовок: SergKis пишет: Имел..
SergKis пишет: Не нашел такую функцию в поставке Харбора. Есть только функция NtoC() в библиотеке hbct, но она уже не актуальна с тех пор, как появилась hb_ntos(). 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4641
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.09.24 10:04. Заголовок: gfilatov2002 пишет Н..
gfilatov2002 пишет | цитата: | | Не нашел такую функцию в поставке Харбора. |
| Advanced\ErrorView\ErrorSys hError[ cDateTime ][ "StackTrace" ][ hb_ntoc( n - 1 ) ] := ProcName( n ) + "(" + hb_ntos( ProcLine( n ) ) + ")" + iif( ProcLine( n ) > 0, " in module: " + ProcFile( n ), "" ) ... и др. добавка REQUST hb_ntoc вопросы снимает, где то лежит, значит | цитата: | | но она уже не актуальна с тех пор, как появилась hb_ntos() |
| hb_ntos() никогда не использовал, но в целом не оч. важно, можно #xcommand сделать в udf
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2356
Зарегистрирован: 11.02.10
|
|
Отправлено: 24.09.24 11:24. Заголовок: SergKis пишет: доба..
SergKis пишет: | цитата: | | добавка REQUST hb_ntoc вопросы снимает, где то лежит |
| Нашел эту функцию в ядре Харбора Вот ее описание: | цитата: | $AUTHOR$ 2017 Pete D. <pete_westg@yahoo.gr> $TEMPLATE$ Function $NAME$ hb_ntoc() $CATEGORY$ API $SUBCATEGORY$ Strings $ONELINER$ Converts a numeric value to string $SYNTAX$ hb_ntoc( <nValue>, [<nDecs>] ) --> cValue $ARGUMENTS$ <nValue> is the numeric value to convert. <nDecs> decimal digits to retain (if any). $RETURNS$ <cValue> A string representation of <nValue> $DESCRIPTION$ This function converts the given <nValue> numeric value to a string value, while (trying to) keep all or at least `nDecs` significant digits in double numbers, unless `<nDecs>` is lesser than actual decimal digits of <nValue>, in which case the result will be rounded. SET DECIMAL setting has no effect on the returned value (ignored), which means that, unlike f.e. Str(), all non-significant digits (e.g.: trailing decimal zeros) will be removed. Likewise, all leading empty spaces will be trimmed. Returns stringified value of `<nValue>`, preserving all (or at least `<nDecs>`) significant digits, if any. Interestingly, if `<nValue>` is NIL or not numeric, this function will return a null string and, unlike Str(), will NOT cause an RTE. NOTE: new function, available after 2016-06-20 21:59 UTC+0200 commit, (it is not available in earlier versions). $EXAMPLES$ LOCAL n := ( 5 / 2 ) + 0.009 ? hb_ntoc( n ) // --> 2.509 ? Str( n ) // --> 2.51 ? hb_ntoc( n, 2 ) // --> 2.51 ? Str( n, 5, 2 ) // --> 2.51 ? hb_ntos( n ) // --> 2.51 ? "--- decimals set to 7 ----" SET DECIMALS TO 7 ? Str( n ) // --> 2.51 ? hb_ntoc( n ) // --> 2.509 ? Str( n, 10, 7 ) // --> 2.5090000 ? hb_ntoc( n, 7 ) // --> 2.509 ? "--- pass non numeric / NIL value ----" ? Str( "42" ) // --> RTE $STATUS$ R $COMPLIANCE$ H $FILES$ Library is core $SEEALSO$ Str(), hb_ntos() $END$ |
| Век живи - век учись 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7876
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.09.24 08:32. Заголовок: Григорий, можно сдел..
Григорий, можно сделать правку в коде ? Ошибку хотя бы выводить... @ nY, nX FRAME Frame_1 ... BACKCOLOR aBackColor Если aBackColor - строка, то программа падает 2 раза и понять какой объект на форме привел к падению НЕЛЬЗЯ ! Только ручной перебор, комменты ставить и компилировать. Если вытащил форму из другого проекта - то развлечение ещё то... 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2358
Зарегистрирован: 11.02.10
|
|
Отправлено: 30.09.24 11:27. Заголовок: Andrey пишет: сли a..
Andrey пишет: | цитата: | | сли aBackColor - строка, то программа падает 2 раза |
| Добавил проверку - теперь такая ошибка игнорируется, и программа не падает. Благодарю за подсказку 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2360
Зарегистрирован: 11.02.10
|
|
Отправлено: 04.10.24 13:15. Заголовок: SergKis Положил на ..
SergKis Положил на ваш ftp модифицированные исходники tsbrowse для проверки. Буду использовать их в следующей сборке, если все нормально работает. 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4643
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.10.24 16:36. Заголовок: gfilatov2002 пишет П..
gfilatov2002 пишет | цитата: | | Положил на ваш ftp модифицированные исходники tsbrowse для проверки |
| В чем суть изменений ? На что обратить внимание
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2361
Зарегистрирован: 11.02.10
|
|
Отправлено: 04.10.24 17:12. Заголовок: SergKis пишет: На ч..
SergKis пишет: Для корректной работы редактирования строки по правому клику (второго диалога) в функции SBrowse() cделал такое изменение: | цитата: | IF _HMG_lOOPEnabled DEFAULT uParam := oHmgData() ELSE uParam := oHmgData() ENDIF |
| Это нужно сделать, если объект oTsb НЕ передается во втором параметре при вызове функции, иначе будет вылет программы. Также постарался синхронизировать другие мелкие изменения и уточнения кода...
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4644
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.10.24 17:18. Заголовок: gfilatov2002 пишет ..
gfilatov2002 пишет | цитата: | | в функции SBrowse() cделал такое изменение: |
| это я видел | цитата: | | Также постарался синхронизировать другие мелкие изменения и уточнения кода... |
| посмотрю на своих примерах
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2362
Зарегистрирован: 11.02.10
|
|
Отправлено: 04.10.24 17:24. Заголовок: SergKis пишет: посм..
SergKis пишет: | цитата: | | посмотрю на своих примерах |
| Заранее большое спасибо за помощь Сейчас завершается подготовка новой сборки. Самая интересная новинка: | цитата: | * New: The SPLITTER library source code (see in folder \Source\Splitter). Don't miss this very interesting expansion! Contributed by Kamil Kalus <kamilkalus0[at]gmail.com> SYNTAX: DEFINE SPLITTER <ControlName> [ ID <nId> ] [ OF, PARENT, DIALOG> <ParentWindowName> ] [ AT <nRow> ,<nCol> ] [ WIDTH <nWidth> ] [ HEIGHT <nHeight> ] [ VERTICAL ] [ HORIZONTAL ] [ HIDEARROW ] [ NOHOVER ] [ USEGRADIENT ] [ ROUNDED ] [ COLOR <color> ] [ BACKCOLOR <backColor> ] [ COLORHOVER <hoverColor> ] [ BACKCOLORHOVER <hoverBackColor> ] [ GRADIENT <leftColor>, <middleColor> [, <rightColor> ] ] [ GRADIENTHOVER <hoverLeftColor>, <hoverMiddleColor> [, <hoverRightColor> ] ] [ SPLIT <aLeftControls> FROM <aRightControls> ] [ LIMITS <aLimits> ] |
| Так выглядит самый простой пример использования: 
|
 |
|
|
Alex_Cher
|
| |
Пост N: 95
Зарегистрирован: 18.06.15
|
|
Отправлено: 05.10.24 07:10. Заголовок: gfilatov2002 Прошу ..
gfilatov2002 Прошу прощения за не профессионализм, просьба - где можно почитать расшифровку параметров по данной функции (ВПРОЧЕМ КАК ПО ДРУГИМ). [ GRADIENT <leftColor>, <middleColor> [, <rightColor> ] ] [ GRADIENTHOVER <hoverLeftColor>, <hoverMiddleColor> [, <hoverRightColor> ] ] [ SPLIT <aLeftControls> FROM <aRightControls> ] [ LIMITS <aLimits> ] Подробной документации нет.
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4645
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.10.24 09:22. Заголовок: gfilatov2002 пишет П..
gfilatov2002 пишет | цитата: | Положил на ваш ftp модифицированные исходники tsbrowse для проверки. Буду использовать их в следующей сборке, если все нормально работает. |
| Покрутил примеры с tsbrowse, полет нормальный, прикрутил к версии 23.12 тоже ok!, кину эту версию Андрею, у него на ней реал. задача, проверит
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4646
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.10.24 09:35. Заголовок: gfilatov2002 добавь..
gfilatov2002 добавьте в сервер REQUEST hb_NtoC, hb_EnumIndex, hb_cwd, LtoN
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2363
Зарегистрирован: 11.02.10
|
|
Отправлено: 05.10.24 11:30. Заголовок: SergKis пишет: доба..
SergKis пишет: | цитата: | | добавьте в сервер REQUEST hb_NtoC, hb_EnumIndex, hb_cwd, LtoN |
| Добавил, конечно. 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2364
Зарегистрирован: 11.02.10
|
|
Отправлено: 05.10.24 11:34. Заголовок: Alex_Cher пишет: По..
Alex_Cher пишет: | цитата: | | Подробной документации нет |
| Да, вы правы. Но в папке с исходниками этой библиотеки будет лежать файл doc.txt и, конечно, текст рабочих примеров прояснит смысл передаваемых параметров. | цитата: | // Define a VERTICAL SPLITTER between the two EditBoxes DEFINE SPLITTER VerticalSplitter ; AT 50, 370 ; // Position the splitter between controls WIDTH 10 ; // Width of the splitter HEIGHT 250 ; // Height of the splitter VERTICAL ; // Vertical splitter SPLIT {"LeftEditBox"} FROM {"RightEditBox"} ; // Split the two controls COLOR {0, 128, 255} ; // Set the color of the splitter BACKCOLOR {230, 230, 230} ; // Background color USEGRADIENT ; // Enable gradient effect GRADIENT {255, 255, 255}, {0, 128, 255}, {0, 0, 128} ; // Gradient colors GRADIENTHOVER {255, 200, 200}, {200, 50, 50}, {100, 0, 0} ; // Hover gradient colors HIDEARROW ; // Hide the arrow icon LIMITS {5, 10} // Define the minimum and maximum limits for each section |
|
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2365
Зарегистрирован: 11.02.10
|
|
Отправлено: 09.10.24 09:48. Заголовок: Всем кому это интересно...
Опубликована финальная MiniGUI сборка 24.10 Стандартная сборка Профессиональная сборка (под паролем) Также были подготовлены дополнительные сборки для следующих компиляторов: - MinGW GNU C 14.2.0 (packaged on 2024-10-05) - BCC 7.70 (32-bit) (основан на коде Борланда) - BCC 7.70 (64-bit) (основан на CLang 5.0) Желаю всем хорошего дня 
|
 |
|
|
Alex_Cher
|
| |
Пост N: 96
Зарегистрирован: 18.06.15
|
|
Отправлено: 09.10.24 12:09. Заголовок: gfilatov2002 Со сбо..
gfilatov2002 Со сборки 24.07 в наименование версии появилось (DEBUG) Можете пояснить что то значит и на что то влияет.
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2366
Зарегистрирован: 11.02.10
|
|
Отправлено: 09.10.24 12:31. Заголовок: Alex_Cher пишет: чт..
Alex_Cher пишет: | цитата: | | что то значит и на что то влияет |
| Благодарю за вопрос Это означает, что эта сборка предназначена для отладки программ: - компилятор Харбор собран без использования оптимизационных параметров для GUI приложений; - библиотека Минигуи собрана с сохранением отладочной информации (+100 кБ к размеру программы); - на выходе из программы создается отладочный файл с информацией о статических переменных. Если в программе есть утечка ресурсов, то на выходе создается файл с информацией об этих ресурсах и где в программе они были созданы. 
|
 |
|
|
Alex_Cher
|
| |
Пост N: 97
Зарегистрирован: 18.06.15
|
|
Отправлено: 10.10.24 07:37. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Это означает, что эта сборка предназначена для отладки программ: |
| Спасибо за ответ, прошу уточнить - я так понимаю что за обычную рабочую сборку надо платить. | цитата: | | Если в программе есть утечка ресурсов, то |
| Пожалуста уточните - что такое утечка ресурсов .....
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2367
Зарегистрирован: 11.02.10
|
|
Отправлено: 10.10.24 10:45. Заголовок: Alex_Cher пишет: пр..
Alex_Cher пишет: | цитата: | | прошу уточнить - ... надо платить |
| Платить НЕ обязательно. Вы можете собрать свою сборку на базе исходных текстов тестовой версии, либо отказаться от обновления и использовать Вашу старую "рабочую" версию. Кстати, дополнительно платная версия предлагает различные продвинутые утилиты и примеры готовых приложений, а также исправленную и оптимизированную библиотеку SQLRDD, которая была портирована из xHarbour в среду Харбора. Alex_Cher пишет: | цитата: | | что такое утечка ресурсов |
| По-простому, это когда в программе объявлены некоторые графические объекты (картинки, курсоры, звук или анимация), а на выходе из программы память, которая была для них выделена, НЕ освобождена программой. Дело в том, что в библиотеку встроена система контроля объявления и освобождения ресурсов, которая в случае несовпадения (объявлено <> освобождено) сообщает об этом на выходе из программы. 
|
 |
|
|
leo
|
| постоянный участник
|
Пост N: 58
Зарегистрирован: 13.09.07
|
|
Отправлено: 14.10.24 09:54. Заголовок: gfilatov2002 А как..
gfilatov2002 А как можно приобрести платную версию?
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2368
Зарегистрирован: 11.02.10
|
|
Отправлено: 14.10.24 10:37. Заголовок: leo пишет: как можн..
leo пишет: | цитата: | | как можно приобрести платную версию? |
| Есть два пути: 1. перевод с помощью платежного сервиса PayPal 2. если Вы резидент Украины - перевод на карточку Приватбанка Вопрос суммы перевода решается в Л.С (личном сообщении) с учетом возможности плательщика 
|
 |
|
|
Haz
|
| |
Пост N: 1974
Зарегистрирован: 20.02.11
|
|
Отправлено: 14.10.24 13:28. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | 1. перевод с помощью платежного сервиса PayPal |
| а нет варианта через частное лицо в РФ , закинуть через СБП по телефону ? Просто нет желания с пейпалом заморачиваться т.к. тут с ним не все просто.
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2369
Зарегистрирован: 11.02.10
|
|
Отправлено: 14.10.24 13:42. Заголовок: Haz пишет: а нет ва..
Haz пишет: | цитата: | | а нет варианта через частное лицо в РФ |
| У меня нет представительства в РФ. Разве что Андрей согласится помочь 
|
 |
|
|
leo
|
| постоянный участник
|
Пост N: 59
Зарегистрирован: 13.09.07
|
|
Отправлено: 16.10.24 15:54. Заголовок: gfilatov2002 Я с У..
gfilatov2002 Я с Украины. Какая сумма платежа и номер карты? Можно ответить на почту
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2370
Зарегистрирован: 11.02.10
|
|
Отправлено: 16.10.24 18:19. Заголовок: leo пишет: Можно от..
leo пишет: Отправил письмо с личными данными. 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2375
Зарегистрирован: 11.02.10
|
|
Отправлено: 25.10.24 10:00. Заголовок: Всем кому это интересно...
Завершена подготовка следующей (ноябрьской) сборки библиотеки. Что нового: - исправление обнаруженных ошибок в ядре и в коде библиотеки TSBrowse; - добавлена документация для основных классов, используемых в коде: GraphPlus, HMG_Get, TCDOMail, TGif, TReg32, T7zip, TSimpleTaskDialog и TTaskDialog; - добавлены подробные комментарии к коду некоторых библиотек и примеров; - обновлен компилятор Харбор до свежей версии, которая наконец-то определяет Win 11, вышедшую уже три года назад; - обновлена библиотека SQLITE3 до свежей версии 3.47.0; - в ПРО-версию добавлены сырцы моего приложения Photo Resizer v.1.5 (это было запланировано сделать еще в апреле 2022). Благодарю за ваше внимание Желаю всем отличной пятницы 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4654
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.10.24 16:46. Заголовок: gfilatov2002 Неточн..
gfilatov2002 Неточность в методе METHOD GetCellInfo( nRowPos, nCell, lColSpecHd ) CLASS TSBrowse ... IF lColSpecHd nRow := ::nHeightHead + ::nHeightSuper + iif( oCol:l3DLook, 2, 0 ) nCol := nStartX + iif( oCol:l3DLook, 2, 0 ) nWidth := ::GetColSizes()[ nCell ] - iif( oCol:l3DLook, 2, 1 ) nHeight := ::nHeightSpecHd - iif( oCol:l3DLook, 1, -1 ) ELSE nRow := nRowPos //- 1 nRow := ( nRow * ::nHeightCell ) + ::nHeightHead + ; ::nHeightSuper + ::nHeightSpecHd + iif( oCol:l3DLook, 2, 0 ) nCol := nStartX + iif( oCol:l3DLook, 2, 0 ) nWidth := ::GetColSizes()[ nCell ] - iif( oCol:l3DLook, 2, 0 ) nHeight := ::nHeightCell - iif( oCol:l3DLook, 1, -1 ) ENDIF ... тогда oCel := oBrw:GetCellInfo( oBrw:nRowCount(), oBrw:nColumn('FNAME') ) nY := oCel:nRow попадаем правильно и nY := oCel:nRow + oCel:nHeight тоже
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2378
Зарегистрирован: 11.02.10
|
|
Отправлено: 28.10.24 17:14. Заголовок: SergKis пишет: nRow..
SergKis пишет: После этого исправления перестал работать пример Андрея Tsb_EditFields - позиция окна редактирования для типа DT смещена на строку ниже. 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7907
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.10.24 17:54. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | После этого исправления перестал работать пример Андрея Tsb_EditFields - позиция окна редактирования для типа DT смещена на строку ниже. |
| Да я там наверное ручками подгонял. Исправить наверное нужно... 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4655
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.10.24 17:57. Заголовок: gfilatov2002 пишет П..
gfilatov2002 пишет | цитата: | | После этого исправления перестал работать пример |
| Так будет, к сожалению. Можно правку не делать, но тогда, для правильной работы, надо делать добавку oCel := oBrw:GetCellInfo( oBrw:nRowCount(), oBrw:nColumn('FNAME') ) nY := oCel:nRow + oBrw:nHeightSpecHd // попасть в последнюю строку tbrowse nY := oCel:nRow + oCel:nHeight + oBrw:nHeightSpecHd // попасть в Footer хотя в методе :GetCellInfo oBrw:nHeightSpecHd уже учтена в расчете
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2381
Зарегистрирован: 11.02.10
|
|
Отправлено: 30.10.24 11:27. Заголовок: Опубликована финальн..
Опубликована финальная MiniGUI сборка 24.11 Стандартная сборка Профессиональная сборка (под паролем) Также были подготовлены дополнительные сборки для следующих компиляторов: - MinGW GNU C 14.2.0 (packaged on 2024-10-05) - BCC 7.70 (32-bit) (основан на коде Борланда) - BCC 7.70 (64-bit) (основан на CLang 5.0) Желаю всем хорошего дня 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2388
Зарегистрирован: 11.02.10
|
|
Отправлено: 02.12.24 11:45. Заголовок: Всем кому это интересно
Опубликована финальная MiniGUI сборка 24.12 Стандартная сборка Профессиональная сборка (под паролем) | цитата: | The Pro version offers: * Optimized Harbour binaries for enhanced performance. * A release build of the MiniGUI library, improving application speed and stability. * A wider range of sample applications, utilities, and tools. * SQLRDD libraries for seamless SQL database integration. |
| Также были подготовлены дополнительные сборки для следующих компиляторов: - MinGW GNU C 14.2.0 (32-bit и 64-bit) - BCC 7.70 (32-bit и 64-bit) - MS Visual C++ CE (32-bit и 64-bit) Желаю всем хорошего дня 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4657
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.12.24 18:50. Заголовок: gfilatov2002 В прим..
gfilatov2002 В примере Tsb_filter_3 demo.prg добавьте oBrw1:nClrLine := CLR_ORANGE IF IsArray(oBrw1:aCheck) AEval(oBrw1:aCheck, {|h| iif( Empty(h), , DeleteObject(h) ) }) ENDIF oBrw1:aCheck := { LoadImage("bCheckT24"), LoadImage("bCheckF24") } // заменяем колонку CHECKBOX на свои картинки
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2389
Зарегистрирован: 11.02.10
|
|
Отправлено: 03.12.24 11:35. Заголовок: SergKis пишет: ..
SergKis пишет: | цитата: | IF IsArray(oBrw1:aCheck) AEval(oBrw1:aCheck, {|h| iif( Empty(h), , DeleteObject(h) ) }) ENDIF |
| Спасибо за поправку 
|
 |
|
|
krutoff
|
| |
Пост N: 242
Зарегистрирован: 17.10.05
|
|
Отправлено: 11.12.24 16:02. Заголовок: TSBrowse: методы Excel2 и ExcelOle
Если изменить в реестре Windows параметр "Разделитель целой и дробной части" с "," на "." то методы Excel2 и ExcelOle перестают нормально показывать цифровые поля. Если это возможно, предлагаю сделать следующее: 1. Создать переменную sDecimal и в начале присвоить ей значение: oReg := TReg32():New(HKEY_CURRENT_USER,'Control Panel\International',.F.) sDecimal := oReg:Get('sDecimal',',') oReg:Close() 2. METHOD Excel2: Строка 6159 меняем ',' на sDecimal Строки 6168 - 6171 меняем ',' на sDecimal 3. METHOD ExcelOle: Строка 6702 меняем ',' на sDecimal
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4659
Зарегистрирован: 17.02.12
|
|
Отправлено: 11.12.24 16:46. Заголовок: krutoff пишет предла..
krutoff пишет | цитата: | | предлагаю сделать следующее |
| Вроде, хватало ф-ии HB_FUNC( GET_SDECIMAL ) // Из региональных настроек дает разделитель дробной части { char sDec[2]; GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL, (LPTSTR) sDec, 2 ); hb_retclen( sDec, 1 ); }
|
 |
|
|
Dima
|
| |
Пост N: 8014
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.12.24 17:47. Заголовок: SergKis пишет: Врод..
SergKis пишет: До кучи и можно переделать под себя Func GetActualSeparator(Oxl) return If(Oxl:UseSystemSeparators,{GET_STHOUSAND(),GET_SDECIMAL()},{Oxl:ThousandsSeparator,Oxl:DecimalSeparator}) HB_FUNC( GET_STHOUSAND ) { char sDec[2]; GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND, (LPTSTR) sDec, 2 ); hb_retclen( sDec, 1 ); }
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2390
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.12.24 16:01. Заголовок: Всем кому это интересно...
Через 10 лет после выхода этой утилиты от Клаудио удалось собрать его программу для HMG с помощью Минигуи. Для этого пришлось повозится с добавлением отсутствующих в библиотеке возможностей. Эти изменения будут включены в следующую сборку в новом году. Главное окно программы имитирует Эксплорер Винды и выглядит так: Если нужна дополнительная информация об этой утилите, пишите...
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2391
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.12.24 17:05. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Если нужна дополнительная информация об этой утилите |
| Выложил эту утилиту по адресу Скачать HMG Easy Build 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2392
Зарегистрирован: 11.02.10
|
|
Отправлено: 22.12.24 19:51. Заголовок: Всем, кому это интересно...
Завершена подготовка следующей (январской) сборки библиотеки. Что нового: - исправление обнаруженных ошибок в ядре библиотеки; - расширен функционал элементов управления Tree и Grid; - обновлена Bos Taurus Graphics Library; - добавлены подробные комментарии к коду некоторых примеров; - добавлена HMG Easy Build Utility, собранная с помощью BCC 7.70; - обновлен компилятор Харбор до крайней версии; - обновлена библиотека SQLITE3 до свежей версии 3.47.2; - добавлено новое свойство HIcon для StatusBar элемента управления. Благодарю за ваше внимание 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2394
Зарегистрирован: 11.02.10
|
|
Отправлено: 09.01.25 17:24. Заголовок: Всем, кому это интересно
gfilatov2002 пишет: | цитата: | Завершена подготовка следующей (январской) сборки библиотеки. |
| Краткое описание: что нового в сборке 25.01. Скрытый текст
Fixes: - Corrected handling of Unicode strings in the SetWindowTheme() function. - Resolved bugs in numeric textboxes and toolbar button image offsets. - Fixed getting the field type in the Browse control when fields were defined using an alias. This change allows SQLMIX rdd to be used correctly to display a MySQL table in the EDIT EXTENDED command (especially for the HB_FT_DOUBLE field type). Enhancements: - Grid Header Images: Assign header images dynamically using the new SetHeaderImages method. - StatusBar Icons: Add icon handles to status bar items with the new HICON property. New Features: - RichEditBox with Keyword Highlighting: Improved editing features for advanced text manipulation. - HMG Easy Build: An intuitive tool for building and managing projects. - HMG EasySQL: Simplifies database interactions for MySQL/MariaDB. - Harbour IDE: A console-based source editor with syntax highlighting. Updates: - Synchronized Extended HMG for compatibility with Official HMG. - Harbour Compiler (3.2.0dev) was updated to the latest version. - Support for SQLite3 version 3.47.2 in the updated HbSQLite3 library. - Additional tools and samples to inspire and accelerate development.
| Желаю всем хорошего дня. 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7937
Зарегистрирован: 12.09.06
|
|
Отправлено: 11.01.25 21:02. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | - Additional tools and samples to inspire and accelerate development. |
| А что это такое ? 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2395
Зарегистрирован: 11.02.10
|
|
Отправлено: 11.01.25 21:30. Заголовок: Andrey пишет: что э..
Andrey пишет: Это новые примеры из PRO-версии. | цитата: | - HMG Easy Build: A GUI-based utility for managing .PRG and .HBP projects. - HMG EasySQL: A simple library for seamless interaction with MySQL/MariaDB. - ButtonEx Builder: An application for designing custom buttons. |
| HMG EasySQL - это новая библиотека, представленная основателем HMG Роберто Лопесом в конце ноября прошлого года, которая основана на использовании SQLMIX rdd. Я ее адаптировал для использования со свежим Харбором 3.2, поскольку Роберто использует старый Харбор версии 3.1 Пример кода, который тестирует производительность сервера MySQL на различных операциях: *---------------------------------------------------------------------------------------------* PROCEDURE main_create_test_action *---------------------------------------------------------------------------------------------* LOCAL oSql := SQL():New() LOCAL rowCount := 100 LOCAL t, i, lResult LOCAL lError := .F. WITH OBJECT oSql // Testing MySQL... IF ! :Connect( _MYSQL_SERVER_, _MYSQL_USER_, _MYSQL_PASSWORD_, _MYSQL_DATABASE_ ) RETURN ENDIF IF ! IsExistTable( oSql, "test_table" ) IF ! :Exec( "DROP TABLE IF EXISTS test_table" ) RETURN ENDIF IF ! :Exec( "CREATE TABLE test_table (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), value INT)" ) RETURN ENDIF ENDIF :lShowMsgs := .F. // Individual Inserts t := Seconds() FOR i := 1 TO rowCount IF ! :Exec( "INSERT INTO test_table (name, value) VALUES ('Name"+hb_ntos(i) + "'," + hb_ntos(i) + ")" ) RETURN ENDIF NEXT :lShowMsgs := .T. MsgInfo( Seconds() - t, "Individual Inserts" ) // Bulk Inserts IF ! :Exec( "TRUNCATE TABLE test_table" ) RETURN ENDIF t := Seconds() // Begin the transaction IF ! :Exec( "START TRANSACTION" ) RETURN ENDIF :lShowMsgs := .F. FOR i := 1 TO rowCount lResult := :Exec( "INSERT INTO test_table (name, value) VALUES (" + ; "'Name" + LTrim( Str( i ) ) + "', " + ; LTrim( Str( i ) ) + ")" ) IF ! lResult lError := .T. EXIT ENDIF NEXT i :lShowMsgs := .T. // If no error occurred, commit the transaction IF ! lError IF ! :Exec( "COMMIT" ) RETURN ENDIF ENDIF MsgInfo( Seconds() - t, "Bulk Inserts" ) // Select Test t := Seconds() IF ! :Select( "SELECT * FROM test_table", "Temp" ) RETURN ENDIF MsgInfo( Seconds() - t, "Select Test" ) EDIT EXTENDED dbCloseArea( "Temp" ) // Delete Test t := Seconds() IF ! :Exec( "DELETE FROM test_table" ) RETURN ENDIF MsgInfo( Seconds() - t, "Delete Test" ) IF ! :Exec( "DROP TABLE IF EXISTS test_table" ) RETURN ENDIF :Disconnect() END WITH RETURN
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4669
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.01.25 14:06. Заголовок: gfilatov2002 Поправ..
gfilatov2002 Поправил немного SBrowse (ширину колонок, uParam, ...) Скрытый текст
FUNCTION SBrowse( uAlias, cTitle, bSetUp, aCols, nWidth, nHeight, lSql, lModal, lNumber, lCenter ) LOCAL cFormName, oBrw, nSaveSelect, cDbf, cAlias, lEdit, cTable //, o LOCAL lbSetUp := ! Empty( bSetUp ), lRec, nY, nX, bAfter, lCellBrw := .F. LOCAL oApp := oDlu4Font( _HMG_DefaultFontSize ) LOCAL nGw := oApp:GapsWidth LOCAL nGh := oApp:GapsHeight LOCAL uParam, bRecord, nClr, oCol, nWrec, nHrec LOCAL aWinType := { "M", "C", "S" }, nWinType, cWinType LOCAL lParam, cNam, nW, nH IF HB_ISARRAY( nWidth ) nWrec := nWidth[ 2 ] nWidth := nWidth[ 1 ] ENDIF IF HB_ISARRAY( nHeight ) nHrec := nHeight[ 2 ] nHeight := nHeight[ 1 ] ENDIF IF HB_ISARRAY( cTitle ) uParam := cTitle[ 2 ] cTitle := cTitle[ 1 ] ENDIF IF HB_ISARRAY( bSetUp ) bRecord := iif( Len( bSetUp ) > 2, bSetUp[ 3 ], NIL ) bAfter := bSetUp[ 2 ] bSetUp := bSetUp[ 1 ] ENDIF IF HB_ISLOGICAL( bSetUp ) lCellBrw := bSetUp bSetUp := NIL ENDIF DEFAULT uAlias := Alias(), ; cTitle := iif( ValType( uAlias ) == "C", uAlias, "SBrowse" ), ; bSetUp := {|| .F. }, ; aCols := {}, ; nWidth := GetSysMetrics( 0 ) * .75, ; nHeight := GetSysMetrics( 1 ) / 2, ; lSql := .F., ; lModal := .F., ; lCenter := .T. DEFAULT uParam := oHmgData() IF ( lParam := uParam:ClassName != "TSBROWSE" ) DEFAULT uParam:uSelector := 20, uParam:cBrw := "oBrw" ENDIF SWITCH ValType( lModal ) CASE 'L' nWinType := iif( lModal, 1, 2 ) EXIT CASE 'N' nWinType := iif( lModal > Len( aWinType ), Len( aWinType ), lModal ) EXIT CASE 'C' lModal := Upper( Left( lModal, 1 ) ) nWinType := AScan( aWinType, lModal ) nWinType := iif( nWinType == 0, 2, nWinType ) EXIT DEFAULT nWinType := 2 END cWinType := aWinType[ nWinType ] lModal := ( cWinType == "M" ) IF ValType( uAlias ) == 'C' .AND. Select( uAlias ) == 0 nSaveSelect := Select() IF lSql cTable := HMG_GetUniqueName( "SqlTable" ) dbUseArea( .T.,, "SELECT * FROM " + uAlias, cTable,,, "UTF8" ) SELECT &cTable cAlias := cTable uAlias := cAlias ELSE cDbf := uAlias cAlias := uAlias TRY dbUseArea( .T., NIL, cDbf, cAlias, .T. ) uAlias := cAlias CATCH uAlias := { { uAlias } } END ENDIF ELSEIF ValType( uAlias ) == 'N' IF ! Empty( Alias( uAlias ) ) uAlias := Alias( uAlias ) ELSE uAlias := { { uAlias } } ENDIF ELSEIF ValType( uAlias ) $ 'BDLP' uAlias := { { uAlias } } #ifdef __XHARBOUR__ ELSEIF ValType( uAlias ) == "H" uAlias := aHash2Array( uAlias ) #endif ENDIF cFormName := HMG_GetUniqueName( "SBrowse" ) lRec := HB_ISARRAY( uAlias ) .AND. ; Len( uAlias[ 1 ] ) == 2 .AND. Len( aCols ) == 2 .AND. ; aCols[ 1 ] == "Key" .AND. aCols[ 2 ] == "Value" IF lRec .OR. lModal _HMG_InplaceParentHandle := GetActiveWindow() IF lRec nWidth *= .67 ENDIF DEFINE WINDOW &cFormName AT 0, 0 WIDTH nWidth HEIGHT nHeight TITLE cTitle ; MODAL ; BACKCOLOR RGB( 191, 219, 255 ) ELSEIF cWinType == 'S' DEFINE WINDOW &cFormName AT 0, 0 WIDTH nWidth HEIGHT nHeight TITLE cTitle ; WINDOWTYPE STANDARD TOPMOST ; BACKCOLOR RGB( 191, 219, 255 ) ; ON INIT {|| This.Topmost := .F. } ELSE DEFINE WINDOW &cFormName AT 0, 0 WIDTH nWidth HEIGHT nHeight TITLE cTitle ; CHILD TOPMOST ; BACKCOLOR RGB( 191, 219, 255 ) ; ON INIT {|| This.Topmost := .F. } ENDIF This.Cargo := iif( lParam, uParam, oHmgData() ) nY := nGh nX := nGw nWidth := This.ClientWidth - nX * 2 nHeight := This.ClientHeight - nY * 2 - oApp:H1 - nGh IF lParam .and. IsBlock(uParam:bWindow) ; EVal( uParam:bWindow ) ENDIF DEFINE TBROWSE oBrw AT nY, nX Alias ( uAlias ) WIDTH nWidth HEIGHT nHeight ; HEADER aCols ; AUTOCOLS SELECTOR 20 ; ON INIT {| ob | ob:nColOrder := 0, ; ob:lNoGrayBar := .F., ; ob:lNoLiteBar := .F., ; ob:lNoResetPos := .F., ; ob:nStatusItem := 0, ; ob:lNoKeyChar := .T., ; ob:nWheelLines := 1, ; ob:nCellMarginLR := 1, ; ob:nLineStyle := LINES_ALL, ; ob:nClrLine := COLOR_GRID, ; ob:lCheckBoxAllReturn := .T. } oBrw:Cargo := uParam lEdit := Eval( bSetUp, oBrw ) lEdit := iif( ValType( lEdit ) == "L", lEdit, .F. ) WITH OBJECT oBrw :lEditable := lEdit :lCellBrw := ( lEdit .OR. lCellBrw ) :lUpdate := .T. :bRClicked := {|| _SetThisFormInfo( oBrw:cParentWnd ), ; SBrowse_Record( oBrw, , bRecord, , nWrec, nHrec ), ; _SetThisFormInfo() } :lRecLockArea := .T. IF lEdit AEval( :aColumns, {| o | o:lEdit := !( o:cFieldTyp $ "+=^" ) } ) ENDIF nClr := :GetColumn( 1 ):nClrHeadBack IF lRec :lNoHScroll := .T. ELSEIF ! Empty( lNumber ) :lFooting := .T. :lDrawFooters := .T. :nHeightFoot := :nHeightHead :InsColNumber() cNam := iif( :lIsArr, "ARRAYNO", "ORDKEYNO" ) :GetColumn( cNam ):cFooting := hb_ntos( :nLen ) :GetColumn( cNam ):lNoHilite := .T. :nFreeze := :nColumn( cNam ) :lLockFreeze := .T. ENDIF :nCell := :nFreeze + 1 nH := iif( :hFontHead == NIL, :hFont, :hFontHead ) FOR EACH oCol IN :aColumns nH := iif( oCol:hFontHead == NIL, nH, oCol:hFontHead ) nW := GetTextWidth( NIL, oCol:cHeading, nH ) IF nW > oCol:nWidth ; oCol:nWidth := nW + 8 ENDIF NEXT END WITH END TBROWSE This.Cargo:oBrw := oBrw cNam := iif( oBrw:lIsArr, "ARRAYNO", "ORDKEYNO" ) IF oBrw:nColumn( cNam, .T. ) > 0 oBrw:GetColumn( cNam ):nClrBack := nClr oBrw:GetColumn( cNam ):nClrHeadBack := nClr oBrw:GetColumn( cNam ):nClrFocuBack := oBrw:nClrPane ENDIF nY := This.ClientHeight - nGh - oApp:H1 nX := nGw @ nY, nX BUTTON Btn_1 CAPTION oBrw:aMsg[ 44 ] WIDTH oApp:W1 HEIGHT oApp:H1 ; ACTION {|| oBrw:Report( cTitle,,,, .T. ), oBrw:GoTop() } nX += oApp:W1 + nGw @ nY, nX BUTTON Btn_2 CAPTION "Excel" WIDTH oApp:W1 HEIGHT oApp:H1 ; ACTION oBrw:ExcelOle() nX := This.ClientWidth - ( oApp:W1 + nGw ) @ nY, nX BUTTON Btn_3 CAPTION oBrw:aMsg[ 45 ] WIDTH oApp:W1 HEIGHT oApp:H1 ; ACTION {|| iif( oBrw:IsEdit, oBrw:SetFocus(), ThisWindow.RELEASE ) } ON KEY ESCAPE ACTION {|| iif( oBrw:IsEdit, oBrw:SetFocus(), ThisWindow.RELEASE ) } IF lRec nY := Len( oBrw:aColumns ) oBrw:aColumns[ nY - 1 ]:nWidth += 50 oBrw:aColumns[ nY - 1 ]:cName := "KEY" oBrw:aColumns[ nY - 1 ]:lEdit := .F. oBrw:aColumns[ nY ]:lEdit := .F. oBrw:aColumns[ nY ]:cName := "VALUE" oBrw:lPickerMode := .T. nW := 16 FOR EACH oCol IN oBrw:aColumns oCol:cPicture := NIL oCol:nAlign := iif( oCol:cName == "KEY", DT_CENTER, DT_LEFT ) nW += iif( hb_enumindex(oCol) == nY, 0, oCol:nWidth ) NEXT oBrw:aColumns[ nY ]:nWidth := _GetClientRect( oBrw:hWnd )[3] - nW //oBrw:AdjColumns( nY ) IF HB_ISOBJECT( oBrw:Cargo ) .AND. oBrw:ClassName == "TSBROWSE" .AND. oBrw:Cargo:lIsDbf oBrw:Cargo:lRecLockArea := .T. oCol := oBrw:GetColumn( "VALUE" ) oCol:lEdit := .T. oCol:bPrevEdit := ; < | uv, obr | LOCAL lRet := .T., cn, oc, ob, xv LOCAL oDlu := oDlu4Font( _HMG_DefaultFontSize ) LOCAL nLen := oDlu:W( 1.5 ) cn := obr:GetValue( "KEY" ) xv := obr:GetValue( "VALUE" ) obr:GetColumn( "VALUE" ):Cargo := NIL ob := obr:Cargo IF ! HB_ISOBJECT( ob ) .OR. ! ob:lIsDbf RETURN .F. ENDIF oc := ob:GetColumn( cn ) IF Empty( oc:cFieldTyp ) .OR. oc:cName == "SELECTOR" .OR. oc:cName == "ORDKEYNO" lRet := .F. ELSEIF oc:cFieldTyp $ "T=@+^" lRet := .F. ENDIF IF lRet IF ValType( xv ) $ "DNL" obr:GetColumn( "VALUE" ):nEditWidth := nLen ENDIF obr:GetColumn( "VALUE" ):Cargo := uv ENDIF RETURN lRet > oCol:bPostEdit := ; < | uv, obr | LOCAL cn, oc, ob, uo, nm cn := obr:GetValue( obr:nColumn( "KEY" ) ) uo := obr:GetColumn( "VALUE" ):Cargo obr:GetColumn( "VALUE" ):nEditWidth := 0 IF uo != NIL .AND. uo == uv RETURN NIL ENDIF ob := obr:Cargo IF ! HB_ISOBJECT( ob ) .OR. ! ob:lIsDbf RETURN NIL ENDIF oc := ob:GetColumn( cn ) nm := oc:nEditMove oc:nEditMove := 0 ob:PostEdit( uv, ob:nColumn( oc:cName ) ) oc:nEditMove := nm RETURN NIL > ENDIF ENDIF IF ! lbSetUp .OR. lRec oBrw:SetNoHoles() oBrw:SetFocus() IF lRec oBrw:GoRight() ENDIF ENDIF IF HB_ISBLOCK( bAfter ) ; Eval( bAfter, oBrw, .T. ) ELSE ; Eval( bSetUp, oBrw, .T. ) ENDIF IF lParam .and. IsBlock(uParam:bWindow) ; EVal( uParam:bWindow, .T. ) ENDIF END WINDOW IF lCenter CENTER WINDOW &cFormName ENDIF ACTIVATE WINDOW &cFormName _HMG_InplaceParentHandle := 0 IF ! Empty( cAlias ) ( cAlias )->( dbCloseArea() ) ENDIF IF ! Empty( nSaveSelect ) Select( nSaveSelect ) ENDIF RETURN NIL
|
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2396
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.01.25 15:43. Заголовок: SergKis пишет: Попр..
SergKis пишет: Благодарю за помощь 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2397
Зарегистрирован: 11.02.10
|
|
Отправлено: 14.01.25 11:34. Заголовок: Опубликована финальн..
Опубликована финальная MiniGUI сборка 25.01 Стандартная сборка (zip архив) Профессиональная сборка (архив под паролем) | цитата: | The Pro version offers: * Optimized Harbour binaries for enhanced performance. * A release build of the MiniGUI library, improving application speed and stability. * A wider range of sample applications, utilities, and tools. * SQLRDD libraries for seamless SQL database integration. |
| Также были подготовлены дополнительные сборки для следующих компиляторов: - MinGW GNU C 14.2.0 (32-bit и 64-bit) - BCC 7.70 (32-bit и 64-bit) - MS Visual C++ CE (32-bit и 64-bit) Желаю всем хорошего дня 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2398
Зарегистрирован: 11.02.10
|
|
Отправлено: 26.01.25 22:03. Заголовок: Всем кому это интересно
Привет всем! В этот особенный для меня день хотел бы поблагодарить Андрея Верченко за многолетнюю поддержку проекта МиниГуи, и пожелать ему скорейшего восстановления после тяжелой болезни. Желаю тебе доброго здоровья и благополучия, мой друг! Если бы не твоя настойчивость и упорство в постановке вопросов, многие интересные идеи НЕ были бы реализованы в библиотеке. Благодарю также за твой неподдельный интерес в продвижении МиниГуи в сети, чтобы все могли получить новые знания от твоих примеров, созданных вместе с Сергеем!
|
 |
|
|
Dima
|
| |
Пост N: 8026
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.01.25 19:39. Заголовок: Андрюха выздоравлива..
Андрюха выздоравливай !
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7938
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.02.25 15:35. Заголовок: Спасибо большое за п..
Спасибо большое за приятные слова ! gfilatov2002 пишет: | цитата: | | - BCC 7.70 (32-bit и 64-bit) |
| Чем отличается от 5.82 ? В чём различие BCC 7.70 от BCC 5.82 ? Может и писали об этом ранее, но я не нашёл.
|
 |
|
|
Dima
|
| |
Пост N: 8027
Зарегистрирован: 17.05.05
|
|
Отправлено: 01.02.25 19:32. Заголовок: Andrey пишет: В чём..
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7939
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.02.25 22:00. Заголовок: Там не написано об о..
Там не написано об отличиях. Я понимаю что новая версия компилятора лучше старой, но хотелось бы знать в чём отличия. Какая лицензия на него ?
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2399
Зарегистрирован: 11.02.10
|
|
Отправлено: 01.02.25 22:12. Заголовок: Andrey пишет: хотел..
Andrey пишет: | цитата: | | хотелось бы знать в чём отличия |
| Я писал об этом на английском форуме библиотеки: | цитата: | Here’s a comparison of Borland C++ 5.8.2 and the latest 7.70 version in a 32-bit Windows environment: Borland C++ 5.8.2 (2003) Advantages: - Legacy Compatibility: Better suited for older Windows (e.g., XP) applications and existing Borland libraries. - Lightweight: Simpler setup and fewer dependencies, making it suitable for basic GUI and console applications. - Fast Compilation: Known for fast compile times on smaller projects. Disadvantages: - Outdated C++ Standards: Limited C++11+ support. - Lacks Modern Features: Incomplete support for modern Windows API features and debugging. Borland C++ 7.70 (Latest Embarcadero) Advantages: - Modern C++ Standards: Supports C++11/14, improving compatibility with contemporary libraries. - Enhanced Windows API Support: Better integration with newer Windows features. - Improved Optimization and Toolchain: Enhanced executable efficiency and debugging tools. Disadvantages: - Higher System Requirements: Resource-intensive, with a larger footprint. - Complexity: More complex setup, potentially overkill for legacy or simple 32-bit applications. In essence, BCC 5.8.2 is better for legacy, lightweight projects, while BCC 7.70 offers more robustness and compatibility for modern applications. Borland C++ 5.8.2 (32-bit only) does not support 64-bit architectures, making it limited in modern 64-bit Windows environments. In contrast, the latest Embarcadero C++ Compiler (BCC 7.7) offers native 64-bit support, optimizing for modern processors and memory capacities. Borland C++ 5.8.2 Advantages: Suitable for 32-bit applications on older Windows; efficient on smaller projects. Limitations: No 64-bit support; limited to older Windows versions. Borland C++ 7.7 Advantages: 64-bit support, C++11+ standards, modern Windows API integration. Limitations: Higher system demands; complex setup. The Borland C++ 64-bit Compiler 7.7 is indeed based on the LLVM/Clang framework and not on the original Borland C++ codebase. Embarcadero shifted to the LLVM backend to modernize their compiler suite, enabling support for the latest C++ standards (C++11 and beyond) and improved compatibility across platforms, including 64-bit support. This LLVM integration allows BCC 7.7 to leverage Clang’s optimization capabilities and cross-platform flexibility. Although branded as "BCC," it represents a significant departure from Borland’s original compiler architecture, focusing on modern development needs. For 64-bit applications, BCC 7.7 is essential, while 5.8.2 is outdated in this environment. |
| Andrey пишет: Лицензия на него похожа на лицензию для MSVC 2022: - бесплатно для индивидуальных разработчиков или команд разработчиков до 5-ти человек и с ежегодным доходом до 5000 долларов. - лицензия дается на один год, но для версии компилятора для командной строки такой проверки нет.
|
 |
|
|
krutoff
|
| |
Пост N: 252
Зарегистрирован: 17.10.05
|
|
Отправлено: 02.02.25 16:25. Заголовок: METHOD AdjColumns TSBrowse
METHOD AdjColumns TSBrowse работает только на расширение размера колонок бровса на постоянную величину. А если форма по ON SIZE или ON RESTORE уменьшается - то колонки размер не меняют (не влезают в окно). Предлагаю внести изменения в h_tbrowse.prg увеличения/уменьшения размера колонок по средневзвешенной величине: Скрытый текст Блок со строки 7340 поменять на IF w != 0 k := Len( aVisible ) // n := Int( w / k ) s := 0 FOR i := 1 TO k c := aVisible[ i ] IF i == 1 .AND. ::lSelector LOOP ELSEIF i == k ::aColumns[ c ]:nWidth += ( w - s ) ELSE n := INT(w * ::aColumns[ c ]:nWidth / nVisible) s += n ::aColumns[ c ]:nWidth += n ENDIF NEXT ENDIF
|
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4672
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.02.25 17:47. Заголовок: krutoff пишет METHOD..
krutoff пишет | цитата: | | METHOD AdjColumns TSBrowse работает только на расширение размера колонок бровса на постоянную величину |
| Этот метод не предусмотрен для исп. в ON SIZE или ON RESTORE, его назначение именно пропорционально "приталить" колонки к ширине окна TBrowse и к реальным размерам колонки (в pixel) не имеет отношения - это могут быть просто пропорции в условных единицах. Т.е. окно всегда шире колонок и они все помещаются в него. Ваш вариант уже работает к конкретным размерам колонок при дальнейшем применении AdjColumns, возможно, параметрами можно совместить ваше предложение в методе
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4676
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.02.25 13:12. Заголовок: gfilatov2002 В прим..
gfilatov2002 В примере Tsb_2tsb\demo3.prg надо убрать строки (это уже учтено в _TBrowse(...)) FUNCTION Tbrowse_Customization( oBrw, oTsb ) // донастройка таблицы ... NEXT // правим Super Header //IF oBrw:lSelector .and. oBrw:nColumn( "ORDKEYNO", .T. ) > 0 // FOR nI := 1 TO Len( oBrw:aSuperHead ) // с первой или со 2-ой колонки менять // oBrw:aSuperHead[ nI ][2] += 1 // NEXT //ENDIF RETURN NIL PS В сборке BCC 7.70 нет hbodbc.lib
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2401
Зарегистрирован: 11.02.10
|
|
Отправлено: 07.02.25 13:21. Заголовок: SergKis пишет: В пр..
SergKis пишет: | цитата: | | В примере Tsb_2tsb\demo3.prg надо убрать строки |
| Поправил, конечно. Благодарю за помощь 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2402
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.02.25 10:31. Заголовок: Всем кому это интересно...
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2403
Зарегистрирован: 11.02.10
|
|
Отправлено: 01.03.25 20:36. Заголовок: Всем кому это интересно...
Завершена подготовка следующей сборки библиотеки. Что нового: - исправление обнаруженных ошибок в ядре библиотеки; - добавлена возможность вносить комментарии в файлы JPG; - добавлена возможность собирать библиотеку со свежим компилятором xHarbour с помощью BCC 7.70; - обновлен компилятор Харбор до крайней версии (r 2502211016); - обновлена библиотека SQLITE3 до свежей версии 3.49.1; - добавлено 5 (пять) новых интересных примеров. Благодарю за ваше внимание 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4682
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.03.25 12:57. Заголовок: gfilatov2002 Предло..
gfilatov2002 Предложение добавить FUNCTION _TBrowse( oParam, uAlias, cBrw, nY, nX, nW, nH ) ... IF HB_ISOBJECT( uAlias ) .and. "TODBC" $ uAlias:ClassName oParam:oTODBC := uAlias oParam:aHead := {} IF HB_ISARRAY( oParam:oTODBC:Fields ) .and. Len( oParam:oTODBC:Fields ) > 0 FOR EACH o IN oParam:oTODBC:Fields AAdd( oParam:aHead, o:FieldName ) NEXT ELSE AAdd( oParam:aHead, "Fields not found !" ) ENDIF o := oParam:oTODBC IF HB_ISARRAY( o:aRecordset ) .and. Len( o:aRecordset ) > 0 uAlias := o:aRecordset ELSE uAlias := { Array( Len( oParam:aHead ) ) } ENDIF ELSEIF HB_ISCHAR( uAlias ) .AND. ! "." $ uAlias dbSelectArea( uAlias ) ... Пример BASIC\ODBC может быть такой Скрытый текст
/* * MiniGUI ODBC Demo * Based upon code from: * ODBCDEMO - ODBC Access Class Demonstration * Felipe G. Coury <fcoury@flexsys-ci.com> * MiniGUI Version: * Roberto Lopez * * Updated for HMG Extended Edition by MiniGUI Team */ #define _HMG_OUTLOG #include "minigui.ch" #xcommand WITH <oObject> DO => Self := <oObject> #xcommand ENDWITH => Self := NIL Memvar Self PROCEDURE Main LOCAL cConStr := "DBQ=" + GetStartupFolder() + "\bd1.mdb;" + ; "Driver={Microsoft Access Driver (*.mdb)}" LOCAL oo := TODBC():New( cConStr ) LOCAL cFont := "Arial", nSize := 12 SET FONT TO cFont, nSize // TsBrowse bold italic _DefineFont("Normal" , cFont, nSize , .F., .F. ) _DefineFont("Bold" , cFont, nSize , .T., .F. ) _DefineFont("Italic" , cFont, nSize-2, .F., .T. ) DEFINE WINDOW Form_1 AT 0,0 WIDTH 400 HEIGHT 400 ; TITLE 'MiniGUI ODBC Demo' ; MAIN TOPMOST ; ON INIT {|| This.Topmost := .F. } ; ON RELEASE {|| This.Hide, oo:Destroy() } DEFINE MAIN MENU DEFINE POPUP 'File' MENUITEM 'Test' ACTION Test (oo) MENUITEM 'Test 2' ACTION Test2(oo, "table1") SEPARATOR MENUITEM 'Exit' ACTION Form_1.Release END POPUP END MENU END WINDOW ACTIVATE WINDOW Form_1 RETURN Function TEST2(oo, cTbl) LOCAL cForm := "Form_2", oBrw, oTsb := oHmgData() LOCAL y := ThisWindow.Row, ; x := ThisWindow.Col, ; w := ThisWindow.Width, ; h := ThisWindow.Height, ; t := ThisWindow.Title + " _TBrowse(...)" oo:SetSQL( "SELECT * FROM " + cTbl ) IF !oo:Open() MsgStop("SELECT * FROM " + cTbl + " NOT OPEN !") RETURN Nil ENDIF oTsb:uSelector := 20 oTsb:aNumber := { 1, 30 } oTsb:aFoot := .T. oTsb:lZebra := .T. DEFINE WINDOW &cForm AT y,x WIDTH w HEIGHT h TITLE t ; CHILD BACKCOLOR YELLOW This.Cargo := oHmgData() y := x := 0 w := This.ClientWidth h := This.ClientHeight oBrw := _TBrowse( oTsb, oo, , y, x, w, h ) oBrw:SetFocus() END WINDOW ACTIVATE WINDOW &cForm oo:Close() RETURN Nil Function TEST(dsFunctions) WITH dsFunctions DO ::SetSQL( "SELECT * FROM table1" ) if ::Open() // Put data in fields array ::LoadData( ::nRecNo ) MsgInfo( ::FieldByName( "field1" ):Value ) ::Skip() MsgInfo ( ::FieldByName( "field1" ):Value ) ::GoTo( 1 ) MsgInfo ( ::FieldByName( "field1" ):Value ) ::Prior() MsgInfo ( ::FieldByName( "field1" ):Value ) ::First() MsgInfo ( ::FieldByName( "field1" ):Value ) ::Last() MsgInfo ( ::FieldByName( "field1" ):Value ) ::Close() endif ENDWITH Return NIL
|
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2404
Зарегистрирован: 11.02.10
|
|
Отправлено: 03.03.25 13:19. Заголовок: SergKis пишет: Пред..
SergKis пишет: Добавил эти изменения Благодарю за помощь 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4683
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.03.25 16:57. Заголовок: gfilatov2002 Если д..
gfilatov2002 Если добавить в пример (выше) строки ... oTsb:lZebra := .T. oTsb:cSuperHd := "Table name: " + cTbl oTsb:lSuperHd := .T. oTsb:aSuperHdColor := {CLR_YELLOW, CLR_BLUE} // {CLR_BLUE} ... таблица будет иметь более законченный вид
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2405
Зарегистрирован: 11.02.10
|
|
Отправлено: 03.03.25 17:27. Заголовок: SergKis пишет: доба..
SergKis пишет: | цитата: | | добавить в пример (выше) строки |
| OK 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7945
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.03.25 19:06. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | - добавлена возможность вносить комментарии в файлы JPG; |
| А это как делать и для чего ? 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2406
Зарегистрирован: 11.02.10
|
|
Отправлено: 03.03.25 20:19. Заголовок: Andrey пишет: для ч..
Andrey пишет: Файлы формата JPEG поддерживают создание текстового комментария, в который можно записать данные о создателе файла или любую другую информацию. Теперь доступна возможность записи или удаления такого комментария из файла. Примечание. Для использования этой возможности потребуется подключение бесплатной freeimage.dll 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2407
Зарегистрирован: 11.02.10
|
|
Отправлено: 05.03.25 10:51. Заголовок: Опубликована финальн..
|
 |
|
|
Haz
|
| |
Пост N: 1988
Зарегистрирован: 20.02.11
|
|
Отправлено: 07.03.25 18:43. Заголовок: Завис последней строки в Tsb
в методе ::Paint() Замена строки WHILE nI <= nLines .AND. nSkipped == 1 на WHILE nI <= ::nRowCount() .AND. nSkipped == 1 Решает вопрос. Почему nLines получает некорректное значение не разбирался
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2409
Зарегистрирован: 11.02.10
|
|
Отправлено: 07.03.25 20:00. Заголовок: Haz пишет: в методе..
Haz пишет: Поправил Благодарю за помощь 
|
 |
|
|
Haz
|
| |
Пост N: 1989
Зарегистрирован: 20.02.11
|
|
Отправлено: 07.03.25 22:46. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: Григорий, это заплатка, показывающая в каком месте проблема. Поскольку, я ::lAppendMode не пользую, меня устраивает, но скорее-всего перед циклом нужно тупо повторить строчку инициализации nLines и использовать эту переменную в условиях цикла. В общем у себя оставлю так пока.
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4684
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.03.25 12:31. Заголовок: Haz пишет скорее-все..
Haz пишет | цитата: | | скорее-всего перед циклом нужно тупо повторить строчку инициализации nLines и использовать эту переменную в условиях цикла |
| Возможно, надо значение переменной получать в цикле, т.к. прорисовка процесс длительный и появление новой строки в этот момент вносит разницу nLine и ::nRowCount(), что приводит к завису. Но нужна стабильная ситуация для проверки - у меня такого не происходит (::lAppendMode не пользую)
|
 |
|
|
Haz
|
| |
Пост N: 1990
Зарегистрирован: 20.02.11
|
|
Отправлено: 09.03.25 13:40. Заголовок: SergKis пишет: Но ..
SergKis пишет: | цитата: | | Но нужна стабильная ситуация для проверки |
| Поймать завис последней строки легко , просто нужно чтоб совпало , что под последнюю строку осталось места чуть меньше ( на пару пикселей ) чем высота строки. И не используется метод динамичекого подбора высоты ::SetNoHoles() В методе ::Paint() расчёт nLines правильный, происходит до ::DrawHeading() и возможно это влияет на результат возврата ::nRowCount() в последующем Это явно видно если сравнивать значение nLines и ::nRowCount() перед циклом - к примеру nLines = 29 а ::nRowCount() = 28. Отсюда и попытка норисова лишнюю строку. Разбираться в трёх строчках кода я не вижу смысла, тк ::nRowCount() в условии цикла WHILE меня полностью устраивает
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4685
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.03.25 14:39. Заголовок: Игорь, спасибо, за р..
Игорь, спасибо, за разъяснение ситуации ошибки  . У меня не происходит такого по причине использования всегда ::SetNoHoles(), даже, если все высоты строк заданы и от них размера высоту тсб (клиентской области) считаю (от кол-ва row)
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2410
Зарегистрирован: 11.02.10
|
|
Отправлено: 09.03.25 17:57. Заголовок: SergKis пишет: надо..
SergKis пишет: | цитата: | | надо значение переменной получать в цикле |
| Так и сделал. Поигрался с высотой строк в примере SAMPLES\Advanced\Tsb_lastrow, пример отработал нормально - залипания последнего ряда не было. Благодарю за помощь 
|
 |
|
|
Haz
|
| |
Пост N: 1991
Зарегистрирован: 20.02.11
|
|
Отправлено: 10.03.25 15:11. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | Так и сделал. Поигрался с высотой строк в примере SAMPLES\Advanced\Tsb_lastrow, пример отработал нормально - залипания последнего ряда не было |
| Пересчет переменной внутри цикла рабочая , но не эффективная идея Это приведет к увеличению времени прорисовки бровса, не значительно но все же. Что делает этот пересчет - вызывает метод ::nRowCount(), который вызывает С-функцию CountRows(). Функция арифметически считает сколько целых строк при заданной высоте строки поместится в клиентском окне бровса между хидингами и футингами. Если хидинги и футинги инициализированы и заданы их высоты, то никакие новые строки не влияют на эту арифметику. А вот что реально влияет на арифметику , так это изменение размера клиентской области окна ::hWnd GetClientRect( ::hWnd, @aRect ) после вызова ::oHScroll:SetRange( 1, Len( ::aColumns ) ) После прорисовки горизонтального скролбара происходит уменьшение клиентской области окна бровса и соответственно ::nRowCount() уже выдаст другое значение Тоже поигрался - работает Вывод - 1 убрать расчет из тела цикла 2 Вернуть nLines в параметр цикла WHILE nI <= nLines .AND. nSkipped == 1 3 Иницилизировать nLines после строки ::oHScroll:SetRange( 1, Len( ::aColumns ) )
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2411
Зарегистрирован: 11.02.10
|
|
Отправлено: 10.03.25 16:15. Заголовок: Haz пишет: Haz пише..
Haz пишет: | цитата: | | После прорисовки горизонтального скролбара происходит уменьшение клиентской области окна бровса |
| Понял Haz пишет: | цитата: | Вывод - 1 убрать расчет из тела цикла |
| Убрал. Haz пишет: | цитата: | | 3 Иницилизировать nLines после строки |
| Рассчитываю значение nLines прямо перед циклом WHILE nI <= nLines .AND. nSkipped == 1 Благодарю за помощь 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4703
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.03.25 20:50. Заголовок: gfilatov2002 Поправ..
gfilatov2002 Поправьте FUNCTION _TBrowse(...) :ResetVScroll( .T. ) IF !Empty( :oHScroll ) :oHScroll:SetRange( 0, 0 ) ENDIF END TBROWSE
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2413
Зарегистрирован: 11.02.10
|
|
Отправлено: 25.03.25 22:39. Заголовок: SergKis пишет: Попр..
SergKis пишет: | цитата: | | Поправьте FUNCTION _TBrowse(...) |
| ОК Благодарю за помощь 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2414
Зарегистрирован: 11.02.10
|
|
Отправлено: 04.04.25 11:30. Заголовок: Опубликована финальн..
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4704
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.04.25 12:42. Заголовок: gfilatov2002 Правка..
gfilatov2002 Правка не большая в ZipToMem ON RELEASE _wSend(90) // Send event 90 on release При Post, в завершении, окно с данными может destroy сделать раньше, чем выполнится код event 90 и других вызовов, если они есть в :Event(90,...), тут все события должны работать по Send В Tsb_MergeRowCells WITH OBJECT This.Object :Event( 0, {|ow,ob| ob := ow:Cargo:oTbl, ob:SetFocus(), ob:DrawSelect(), ob:Show(), DoEvents() }) ... STATIC FUNCTION TablePatam(...) ... oTsb:bInit := {|ob| ob:Hide() } oTsb:bAfter := {|ob| ... мелькания будет меньше
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2415
Зарегистрирован: 11.02.10
|
|
Отправлено: 05.04.25 11:35. Заголовок: SergKis пишет: Прав..
SergKis пишет: Поправил, конечно. Благодарю за помощь 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4706
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.04.25 13:48. Заголовок: gfilatov2002 Предло..
gfilatov2002 Предложение для WaitWindow(...) иметь значения в базе _HMG_NAMESLIST FUNCTION WaitWindow ( cMessage, lNoWait, nWidth, nSize, cFont, aFontColor, aBackColor ) ... LOCAL nY, nX, nW, nI, nK, oo, lo ... IF PCount() == 0 ... ELSE #ifdef _NAMES_LIST_ IF HB_ISNUMERIC( lNoWait ) oo := _SetGetNamesList():Get( cFormName ) IF ( lo := Empty( oo ) ) ; oo := oHmgData() ENDIF IF HB_ISCHAR( cMessage ) .and. !Empty( cMessage ) oo:cMessage := cMessage ENDIF IF HB_ISCHAR( cFont ) .and. !Empty( cFont ) oo:cFontName := cFont ENDIF IF HB_ISARRAY( aFontColor ) .and. Len( aFontColor ) == 3 oo:aFontColor := aFontColor ENDIF IF HB_ISARRAY( aBackColor ) .and. Len( aBackColor ) == 3 oo:aBackColor := aBackColor ENDIF IF lo ; _SetGetNamesList():Set( cFormName, oo ) ENDIF RETURN oo ENDIF #endif IF HB_ISLOGICAL( cMessage ) lNoWait := cMessage cMessage := NIL #ifdef _NAMES_LIST_ oo := _SetGetNamesList( cFormName ) IF HB_ISOBJECT( oo ) DEFAULT aFontColor := oo:aFontColor, cMessage := oo:cMessage, ; aBackColor := oo:aBackColor, cFont := oo:cFontName ENDIF #endif DEFAULT cMessage := "... Wait for the preparation to complete ..." ENDIF hb_default( @lNoWait, .F. ) hb_default( @cFont, _HMG_DefaultFontName ) ... Тогда задание default значений можно делать вызовом (можно сделать команду на установку\замену данных) WaitWindow ( "... WAIT FOR COMPLETION ...", 0,,, "DlgFont", YELLOW, RED ) WaitWindow ( , 0,,, , , BLUE ) ... добавляется простое применение (при работе без #ifdef _NAMES_LIST_ такде вызов ниже работает) WaitWindow(.T.) ... WaitWindow() старые вызовы остаются в работе, как были + WaitWindow ( .T., ,,, "DlgFont", YELLOW, RED ) тоже
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4707
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.04.25 15:14. Заголовок: PS Возможно, надо сд..
PS Возможно, надо сделать так в строке IF ( HB_ISCHAR( cMessage ) .or. HB_ISARRAY( cMessage ) ) .and. !Empty( cMessage ) oo:cMessage := cMessage ENDIF
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2416
Зарегистрирован: 11.02.10
|
|
Отправлено: 09.04.25 16:21. Заголовок: SergKis пишет: Пред..
SergKis пишет: | цитата: | | Предложение для WaitWindow(...) |
| Принято. Как обычно, благодарю за помощь 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4708
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.04.25 16:57. Заголовок: gfilatov2002 пишет П..
gfilatov2002 пишет Тогда еще немного добавки, она скорее относится к MODAL окну, выполнение на нем блока кода в ON INIT ... FUNCTION WaitWindow ( cMessage, lNoWait, nWidth, nSize, cFont, aFontColor, aBackColor ) ... LOCAL hFont, cTmp, nTmp, cLbl, bOnInit, l_No_Wait := .T. #ifdef _NAMES_LIST_ LOCAL oo, lo #endif ... ELSE IF HB_ISBLOCK( lNoWait ) bOnInit := lNoWait lNoWait := NIL ENDIF #ifdef _NAMES_LIST_ ... ELSE DEFINE WINDOW _HMG_CHILDWAITWINDOW MODAL IF HB_ISBLOCK( bOnInit ) l_No_Wait := .F. ENDIF ENDIF ... IF HB_ISBLOCK( bOnInit ) nK := GetFormIndex( cFormName ) _HMG_aFormInitProcedure [ nK ] := bOnInit ENDIF END WINDOW ... _ActivateWindow ( { cFormName }, l_No_Wait ) _HMG_IsModalActive := lIsModal IF ! lNoWait IF _IsWindowDefined( cFormName ) InkeyGUI( 0 ) IF _IsControlDefined ( "Timer", cFormName ) nCtEfeito := 0 cDescEfeito := "" ENDIF DoMethod ( cFormName, "Release" ) ENDIF ENDIF ...
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2417
Зарегистрирован: 11.02.10
|
|
Отправлено: 09.04.25 18:14. Заголовок: SergKis пишет: еще ..
SergKis пишет: OK 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2418
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.04.25 12:11. Заголовок: SergKis пишет: можн..
SergKis пишет: | цитата: | | можно сделать команду на установку\замену данных |
| Добавил такую команду: | цитата: | SET WAITWINDOW [ PROMPT TO <cMessage> ] [ FONT <cFont> ] ; [ FONTCOLOR <fontcolor> ] [ BACKCOLOR <backcolor> ] |
|
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2421
Зарегистрирован: 11.02.10
|
|
Отправлено: 24.04.25 15:18. Заголовок: Всем кому это интересно...
Завершается подготовка следующей (майской) сборки библиотеки. Что нового: Скрытый текст
* Modified: Adaptation of MiniGUI core has been revized to be compatible with Embarcadero C++ 7.70 and Visual C++ 2022 Community Edition compilers: - fixed the definition of the width and height values of the borders of all window types; - revised MiniPrint and MiniPrint2 source code to be compatible with the above modifications. Based upon a contribution of Grzegorz Wojnarowski. Many thanks to Grzegorz for his great help to improve BCC 7.7 build. Contributed by Grigory Filatov (see demo in folder \samples\Basic\MAINDEMO_(SYNTAX_I)) * Enhanced: Added the ability to use the bOnInit code block and global parameters in the WaitWindow() function. Added a new command for managing of the WAIT WINDOW properties at runtime: SET WAITWINDOW [ PROMPT TO <cMessage> ] [ FONT <cFont> ] ; [ FONTCOLOR <fontcolor> ] [ BACKCOLOR <backcolor> ] Suggested and contributed by Sergej Kiselev (see demo.prg in folder \samples\Basic\WAIT_WINDOW) * Modified: The IsArrayRGB() internal check-function has been improved to more accurate detection of valid RGB color values. Contributed by Grigory Filatov (see demo in folder \samples\Applications\ButtonBuilder) * Updated: The Alert* family functions: - minor refactoring of input parameters processing; - added comments describing the purpose of each function. Contributed by Grigory Filatov (see demo in folder \samples\Basic\AlertBoxes) * Updated: The DBF network functions: - modified NetLock() internal function; - added comments describing the purpose and parameters of each function. Contributed by Grigory Filatov (see demo in folder \samples\Basic\DATA_BOUND) * Updated: The drawing functions in the MiniGUI core: - added detailed comments to the code. Contributed by Grigory Filatov (see demo in folder \samples\Basic\DRAW) * Updated: MiniGUI Resources control system in the MiniGUI core: - added detailed comments to the code. Contributed by Grigory Filatov * Updated: The CheckStatic() function in the MiniGUI core: - added detailed comments to the code. Contributed by Grigory Filatov * Updated: TCDOMail class in the MiniGUI core: - added detailed comments to the code. Contributed by Grigory Filatov * Updated: TSimpleTaskDialog and TTaskDialog classes in the MiniGUI core: - added detailed comments to the code. Contributed by Grigory Filatov * Updated: Harbour Compiler 3.2.0dev (SVN 2025-03-25 13:54): * Updated: HbCurl library by Przemyslaw Czerpak. Contributed by Grigory Filatov (look at ReadMe.txt in folder \harbour) * New: 'Merge and aggregate datasets via SQLRDD' sample: - added a SUMMARIZE command for Harbour, inspired by Rosetta Code. Based upon a contribution of Mark Clements. Adapted for Minigui Extended by Grigory Filatov (see in folder \samples\Advanced\SQLRDD\Summarize) [PRO VERSION] * Updated: 'Multi-colored Tab Control with using of a Tab Cargo' sample: - added helper function GetTabHeaderHeight() instead of using global internal core variable. Contributed by Grigory Filatov (see in folder \samples\Basic\COLORED_TAB) * Updated: 'Merge cells of a row into one row using _TBrowse() function' sample. Contributed by Sergej Kiselev (see in folder \samples\Advanced\Tsb_MergeRowCells) * Updated: 'WebCam preview and capture' sample: - added detailed comments to the code. Contributed by Grigory Filatov (see in folder \samples\Advanced\WebCam_2)
| Если у вас есть собственные дополнения в библиотеку, то еще не поздно предложить их к рассмотрению. Благодарю за ваше внимание Желаю всем хорошего дня 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4713
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.04.25 09:14. Заголовок: gfilatov2002 Предло..
gfilatov2002 Предложение. Поправить и перенести в h_objmisc.prg ф-ии _wPost(), _wSend() до #ifdef _OBJECT_ Скрытый текст
*-----------------------------------------------------------------------------* FUNCTION _wPost( nEvent, nIndex, xParam ) *-----------------------------------------------------------------------------* LOCAL oWnd, cForm IF HB_ISOBJECT( nIndex ) IF nIndex:ClassName == 'TSBROWSE' cForm := nIndex:cParentWnd nIndex := GetControlIndex( cForm, nIndex:cControlName ) ELSE cForm := _HMG_THISFORMNAME IF __objHasData( nIndex, "Name" ) ; cForm := nIndex:Name ENDIF nIndex := NIL ENDIF ELSEIF HB_ISCHAR( nIndex ) cForm := nIndex nIndex := NIL ELSE cForm := _HMG_THISFORMNAME ENDIF IF _HMG_lOOPEnabled #ifdef _OBJECT_ IF !Empty( cForm ) .and. HB_ISCHAR( cForm ) oWnd := _WindowObj( cForm ) IF HB_ISOBJECT( oWnd ) IF HB_ISCHAR( nEvent ) nEvent := oWnd:oEvents:Get( nEvent, nEvent ) ENDIF IF HB_ISNUMERIC( nEvent ) DoEvents() ; oWnd:PostMsg( nEvent, nIndex, xParam ) ENDIF ENDIF ENDIF #else HB_SYMBOL_UNUSED(nEvent) HB_SYMBOL_UNUSED(nIndex) HB_SYMBOL_UNUSED(xParam) HB_SYMBOL_UNUSED(cForm) HB_SYMBOL_UNUSED(oWnd) #endif ENDIF RETURN NIL *-----------------------------------------------------------------------------* FUNCTION _wSend( nEvent, nIndex, xParam ) *-----------------------------------------------------------------------------* LOCAL oWnd, cForm IF HB_ISOBJECT( nIndex ) IF nIndex:ClassName == 'TSBROWSE' cForm := nIndex:cParentWnd nIndex := GetControlIndex( cForm, nIndex:cControlName ) ELSE cForm := _HMG_THISFORMNAME IF __objHasData( nIndex, "Name" ) ; cForm := nIndex:Name ENDIF nIndex := NIL ENDIF ELSEIF HB_ISCHAR( nIndex ) cForm := nIndex nIndex := NIL ELSE cForm := _HMG_THISFORMNAME ENDIF IF _HMG_lOOPEnabled #ifdef _OBJECT_ IF !Empty( cForm ) .and. HB_ISCHAR( cForm ) oWnd := _WindowObj( cForm ) IF HB_ISOBJECT( oWnd ) IF HB_ISCHAR( nEvent ) nEvent := oWnd:oEvents:Get( nEvent, nEvent ) ENDIF IF HB_ISNUMERIC( nEvent ) DoEvents() ; oWnd:SendMsg( nEvent, nIndex, xParam ) ENDIF ENDIF ENDIF #else HB_SYMBOL_UNUSED(nEvent) HB_SYMBOL_UNUSED(nIndex) HB_SYMBOL_UNUSED(xParam) HB_SYMBOL_UNUSED(cForm) HB_SYMBOL_UNUSED(oWnd) #endif ENDIF RETURN NIL #ifdef _OBJECT_ *-----------------------------------------------------------------------------* FUNCTION _WindowObj( FormName ) *-----------------------------------------------------------------------------* ...
| При SET OOP OFF использовать как пустышки в таких местах ON INIT {|| This.Topmost := .F., _wPost(0) } ON RELEASE {|| This.Hide, _wSend(90) }
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2422
Зарегистрирован: 11.02.10
|
|
Отправлено: 25.04.25 10:04. Заголовок: SergKis пишет: Попр..
SergKis пишет: | цитата: | | Поправить и перенести в h_objmisc.prg ф-ии _wPost(), _wSend() |
| Поправил, конечно. Благодарю за помощь P.S. Пока не определился с датой публикации этой сборки... 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4714
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.04.25 11:04. Заголовок: gfilatov2002 Валитс..
gfilatov2002 Валится This.SplitBox.Height Called from VERIFYCONTROLDEFINED(6714) in module: h_controlmisc.prg Called from GETPROPERTY(5248) in module: h_controlmisc.prg пример App_OopColumns DEFINE SPLITBOX OF &cWnd HANDLE hSpl DEFINE TOOLBAR ToolBar_1 CAPTION "REPORT" BUTTONSIZE 72,32 FLAT ... END SPLITBOX _logfile(.T., _HMG_aFormReBarHandle [ This.Index ], hSpl, ; GetWindowHeight(hSpl) /*, This.SplitBox.Height*/) ...
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4715
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.04.25 11:50. Заголовок: PS Как узнать куда п..
PS Как узнать куда прицеплен ToolBar, т.е. параметр [ <bottom: BOTTOM> ] ? Чтобы сделать IF This.ToolBar.Bottom ... ENDIF
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2423
Зарегистрирован: 11.02.10
|
|
Отправлено: 25.04.25 12:01. Заголовок: SergKis пишет: Вали..
SergKis пишет: | цитата: | | Валится This.SplitBox.Height |
| Это нормально В этой записи SplitBox трактуется как имя контрола, а это - окно-контейнер. Поэтому, если нужно определить высоту окна SplitBox, можно использовать такой вызов | цитата: | | h := GetWindowHeight ( hSpl ) |
| 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4716
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.04.25 12:36. Заголовок: gfilatov2002 пишет Э..
gfilatov2002 пишет Не уверен. Мы применили нормальную команду, которой должно быть все равно контрол или контейнер в обработке. Получается много лишних телодвижений, надо - запоминать где то hSpl и потом применять - или помнить переменную окна _HMG_aFormReBarHandle и через индекс с анализом handle получать 0 или высоту GetWindowHeight(_HMG_aFormReBarHandle[GetFormIndex(cForm)]) Эту канитель в GetProperty(...) обработать проще, если не контрол и параметр "Height" выдать высоту или 0 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2424
Зарегистрирован: 11.02.10
|
|
Отправлено: 25.04.25 14:58. Заголовок: SergKis пишет: GetW..
SergKis пишет: | цитата: | | GetWindowHeight(_HMG_aFormReBarHandle[GetFormIndex(cForm)]) |
| Сделал, конечно. Благодарю за настойчивость 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2425
Зарегистрирован: 11.02.10
|
|
Отправлено: 25.04.25 15:02. Заголовок: SergKis пишет: Как ..
SergKis пишет: | цитата: | | Как узнать куда прицеплен ToolBar |
| Попробуй Bottom := And ( GetWindowLong ( hToolbar , GWL_STYLE ), CCS_BOTTOM ) == CCS_BOTTOM 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4717
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.04.25 16:07. Заголовок: gfilatov2002 Так ра..
gfilatov2002 Так работает ? "ToolBar BOTTOM:", GetWindowRow( This.ToolBar.Handle ), ; And( GetWindowLong( This.ToolBar.Handle, GWL_STYLE ), CCS_BOTTOM ) == CCS_BOTTOM но надо тащить #define CCS_BOTTOM 3 хотелось бы по красивее команду
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2426
Зарегистрирован: 11.02.10
|
|
Отправлено: 25.04.25 18:21. Заголовок: SergKis пишет: хоте..
SergKis пишет: | цитата: | | хотелось бы по красивее команду |
| Как вариант, можно написать эквивалентную функцию на Си, тогда эта константа будет скрыта в .obj файле. 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4718
Зарегистрирован: 17.02.12
|
|
Отправлено: 25.04.25 19:12. Заголовок: gfilatov2002 пишет м..
gfilatov2002 пишет | цитата: | | можно написать эквивалентную функцию на Си |
| В h_controlmisc.prg есть #include "i_winuser.ch", можно и GetProperty() написать, как "Enabled" к контролу, возвращает .T.\.F.
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2427
Зарегистрирован: 11.02.10
|
|
Отправлено: 26.04.25 11:16. Заголовок: SergKis пишет: можн..
SergKis пишет: | цитата: | | можно и GetProperty() написать |
| Добавил свойство Alignment с таким описанием: | цитата: | * Enhanced: 'Alignment' property is supported for TOOLBAR control. You can get this property at runtime: - function syntax: GetProperty ( FormName, ToolBarName, 'Alignment' ) --> cAlignment - pseudo-OOP syntax: FormName.ToolBarName.Alignment --> cAlignment where cAlignment may be 'TOP' or 'BOTTOM'. Requested by Sergej Kiselev. Contributed by Grigory Filatov |
| Использовать: IsTBbottom := (FormName.ToolBarName.Alignment == 'BOTTOM') // возвращает .T.\.F. Благодарю за помощь 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7970
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.05.25 13:24. Заголовок: Небольшой глюк по ок..
Небольшой глюк по окнам. В проге стоит SET WINDOW MODAL PARENT HANDLE ON // окна Modal получают родителя MAIN окно, далее вызываю STANDART, делаю MAIN.Minimize. В окне первый же вызов MODAL окна (типа Alert* или MsgDebug) после закрытия этого окна, на экран лезет MAIN окно !!! Потом после этого не лезет. Выходим в MAIN окно, заново делаем ... и опять тоже самое, первый раз ВСЕГДА на экран лезет MAIN окно на передний план ! Юзеру ОЧЕНЬ некомфортно.... Как исправить ? 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4719
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.05.25 14:42. Заголовок: Andrey пишет Как исп..
Andrey пишет Повторю FUNC Modal2(cParent, ...) // cParent - имя Modal(1) ... ACTIVATE WINDOW &cForm IF _IsWindowDefined(cParent) DoMethod(cParent, "SetFocus") ENDIF RETURN aRet PS Вопрос такой ты уже задавал давно
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7971
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.05.25 16:17. Заголовок: Я использую стандарт..
Я использую стандартные функции Alert****() ! Как я могу заблокировать показ MAIN окна в них ??? При повторном использовании функции Alert****() такого уже не происходит, т.е. первый вызов Alert****() и после него показывается MAIN окно. Можно это исправить в ядре МиниГуи ??? 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2429
Зарегистрирован: 11.02.10
|
|
Отправлено: 01.05.25 21:21. Заголовок: Andrey пишет: Можно..
Andrey пишет: | цитата: | | Можно это исправить в ядре МиниГуи ? |
| Благодарю за сообщение Поправил возврат из функции Alert****() в вызвавшее эту функцию дочернее немодальное окно. В первый раз заметно небольшое мигание при переключении фокуса на вызвавшее окно, при повторном возврате этого мигания нет.
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7972
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.05.25 23:29. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Поправил возврат из функции Alert****() в |
| Можно исправленный исходник прислать мне на почту ? Я попробую у себя в проекте.
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2430
Зарегистрирован: 11.02.10
|
|
Отправлено: 02.05.25 10:45. Заголовок: Andrey пишет: исход..
Andrey пишет: | цитата: | | исходник прислать мне на почту |
| Отправил, конечно... 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2431
Зарегистрирован: 11.02.10
|
|
Отправлено: 05.05.25 11:23. Заголовок: Всем кому это интересно
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4720
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.05.25 08:46. Заголовок: gfilatov2002 У себя ..
gfilatov2002 У себя сделал немного по другому для SPLITBOX IF Upper( Arg2 ) == "SPLITBOX" .and. Upper( Arg3 ) $ "HEIGHT,WIDTH" ; .and. GetControlIndex( Arg2, Arg1 ) == 0 RetVal := 0 IF ( ix := GetFormIndex( Arg1 ) ) > 0 IF IsWindowHandle ( Arg8 := _HMG_aFormReBarHandle [ ix ] ) IF Upper( Arg3 ) == "WIDTH" ; RetVal := GetWindowWidth ( Arg8 ) ELSEIF Upper( Arg3 ) == "HEIGHT" ; RetVal := GetWindowHeight( Arg8 ) ENDIF ENDIF ENDIF RETURN RetVal ELSEIF ( Upper( Arg2 ) == "VSCROLLBAR" .OR. Upper( Arg2 ) == "HSCROLLBAR" ) IF .NOT. _IsWindowDefined ( Arg1 ) MsgMiniGuiError ( "Window: " + Arg1 + " is not defined." ) ENDIF ELSE VerifyControlDefined ( Arg1 , Arg2 ) ENDIF т.к. используется для вычисления клиентской области окна, то 0 тоже надо возвращать, если нет SPLITBOX, т.е. nCliH := This.ClientHeight - This.SplitBox.Height - This.StatusBar.Height
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2432
Зарегистрирован: 11.02.10
|
|
Отправлено: 06.05.25 09:43. Заголовок: SergKis пишет: 0 то..
SergKis пишет: | цитата: | | 0 тоже надо возвращать, если нет SPLITBOX |
| Благодарю за предложение Как обычно, это очень практичное предложение, которое упрощает работу. 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4721
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.05.25 16:09. Заголовок: gfilatov2002 Неболь..
gfilatov2002 Небольшая правка, Андрей нашел METHOD RButtonDown( nRowPix, nColPix, nFlags ) CLASS TSBrowse ... IF ! ::lNoVScroll .and. !Empty( ::oVScroll ) ::oVScroll:SetPos( ::RelPos( ::nLogicPos() ) ) ENDIF IF ! ::lNoHScroll .and. !Empty( ::oHScroll ) ::oHScroll:SetPos( ::nCell ) ENDIF ...
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2433
Зарегистрирован: 11.02.10
|
|
Отправлено: 06.05.25 16:26. Заголовок: SergKis пишет: Небо..
SergKis пишет: Спасибо, но такие проверки отсутствуют и в других методах, не только в RButtonDown(). | цитата: | IF ! ::lNoVScroll .AND. ::oVScroll != NIL ... |
|
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4722
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.05.25 19:10. Заголовок: gfilatov2002 пишет т..
gfilatov2002 пишет | цитата: | | такие проверки отсутствуют и в других методах |
| По идее, надо чистить. У Андрея задача с основным экраном тсб (колонки помещаются во окно) и второй экран, где правые колонки появляются по CheckBox и колонок больше чем 2-а окна тсб, но при этом oHScroll := NIL, нет горизонтального scroll, попытка установить правый клик, привели к сбою
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2434
Зарегистрирован: 11.02.10
|
|
Отправлено: 06.05.25 19:16. Заголовок: SergKis пишет: попы..
SergKis пишет: | цитата: | | попытка установить правый клик, привели к сбою |
| Поправил, конечно. Благодарю за помощь 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4723
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.05.25 20:09. Заголовок: gfilatov2002 Сканир..
gfilatov2002 Сканировал в h_tbrowse.prg "::oHScroll", мест где надо добавлять проверку немного, самое сложное место это где надо отделить значение ::Cell := ... METHOD HThumbDrag( nPos ) CLASS TSBrowse ... IF ::lIsTxt IF ::oHScroll != NIL ::oHScroll:SetPos( ::nAt := nPos ) ENDIF ELSE IF ::lLockFreeze .AND. nPos <= ::nFreeze // watch out for frozen columns ::nCell := ::nFreeze + 1 IF ::oHScroll != NIL ::oHScroll:SetPos( ::nCell ) ENDIF ELSE ::nCell := Min( nPos, Len( ::aColumns ) ) IF ::oHScroll != NIL ::oHScroll:SetPos( ::nCell ) ENDIF ENDIF ... цветом выделенное можно вынести за ENDIF, т.е. IF ::lIsTxt ::nAt := nPos IF ::oHScroll != NIL ::oHScroll:SetPos( ::nAt ) ENDIF ELSE IF ::lLockFreeze .AND. nPos <= ::nFreeze // watch out for frozen columns ::nCell := ::nFreeze + 1 ELSE ::nCell := Min( nPos, Len( ::aColumns ) ) ENDIF IF ::oHScroll != NIL ::oHScroll:SetPos( ::nCell ) ENDIF ...
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2435
Зарегистрирован: 11.02.10
|
|
Отправлено: 06.05.25 21:21. Заголовок: SergKis пишет: METH..
SergKis пишет: | цитата: | | METHOD HThumbDrag( nPos ) CLASS TSBrowse |
| В этом методе чуть выше уже есть проверка условия | цитата: | IF ::oHScroll != NIL .AND. ! Empty( nPos ) ... |
| так что дополнительные проверки излишни. 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4724
Зарегистрирован: 17.02.12
|
|
Отправлено: 06.05.25 22:50. Заголовок: gfilatov2002 :sm36:..
gfilatov2002  Не увидел
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4728
Зарегистрирован: 17.02.12
|
|
Отправлено: 11.05.25 14:41. Заголовок: gfilatov2002 Предло..
gfilatov2002 Предложение добавить в _TBrowse к oTsb:lZebra вариант oTsb:lChess раскраска строк шахматкой FUNCTION _TBrowse( oParam, uAlias, cBrw, nY, nX, nW, nH ) ... LOCAL i, j, o, lChess, aChess ... .OR. !Empty( oParam:lZebraRow ) lChess := !Empty( oParam:lChess ) .OR. !Empty( oParam:lChessLine ) ; .OR. !Empty( oParam:lChessRow ) ... IF lZebra aZebra := oParam:aZebra ; DEFAULT aZebra := oParam:aZebraColor DEFAULT aZebra := { GetSysColor( COLOR_WINDOW ), GetSysColor( COLOR_BTNFACE ) } IF IsArray( aZebra ) .AND. Len( aZebra ) > 1 IF IsArray( aZebra[1] ) .and. IsArrayRGB( aZebra[1] ) aZebra[1] := HMG_RGB2n( aZebra[1] ) ENDIF IF IsArray( aZebra[2] ) .and. IsArrayRGB( aZebra[2] ) aZebra[2] := HMG_RGB2n( aZebra[2] ) ENDIF IF IsNumeric( aZebra[1] ) .AND. IsNumeric( aZebra[2] ) AAdd( aColor, { CLR_PANE, {|c,n,b| c := aZebra[2], n := aZebra[1], ; iif( b:nAt % 2 == 0, c, n ) } } ) ENDIF ENDIF ELSEIF lChess aChess := oParam:aChess ; DEFAULT aChess := oParam:aChessColor DEFAULT aChess := { GetSysColor( COLOR_WINDOW ), GetSysColor( COLOR_BTNFACE ) } IF IsArray( aChess ) .AND. Len( aChess ) > 1 IF IsArray( aChess[1] ) .and. IsArrayRGB( aChess[1] ) aChess[1] := HMG_RGB2n( aChess[1] ) ENDIF IF IsArray( aChess[2] ) .and. IsArrayRGB( aChess[2] ) aChess[2] := HMG_RGB2n( aChess[2] ) ENDIF AAdd( aColor, { CLR_PANE, {|nr,nc,nn| IF nr % 2 == 0 ; nn := iif( nc % 2 == 0, 1, 2 ) ELSE ; nn := iif( nc % 2 == 0, 2, 1 ) ENDIF Return aChess[ nn ] } } ) ENDIF ENDIF ... Применять oTsb:lChess := .T. oTsb:aChess := { CLR_HGRAY, CLR_WHITE } по умолчанию будет DEFAULT aChess := { GetSysColor( COLOR_WINDOW ), GetSysColor( COLOR_BTNFACE ) }
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2441
Зарегистрирован: 11.02.10
|
|
Отправлено: 11.05.25 18:56. Заголовок: SergKis пишет: Пред..
SergKis пишет: | цитата: | | Предложение добавить в _TBrowse вариант oTsb:lChess |
| Принято с благодарностью Порадовало использование встроенной функции IsArrayRGB() 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4733
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.05.25 11:41. Заголовок: gfilatov2002 Неболь..
gfilatov2002 Небольшая правка h_objects.prg CLASS TWndData ... VAR oEvents AS OBJECT ... METHOD Def( nIndex, cName, nHandle, nParent, cType, cVar ) INLINE ( ; ::nIndex := nIndex, ::cName := cName, ::nHandle := nHandle, ; ::nParent := nParent, ::cType := cType, ::cVar := cVar, ; ::oCargo := oHmgData(), ::oOnEventBlock := oKeyData( Self, .T. ), ; ::oEvent := oKeyData( Self ), ::oUserKeys := oHmgData(), ; ::oName := oHmgData(), ::oHand := oHmgData(), ; ::oProp := oHmgData(), ::oParam := oHmgData(), ; ::oEvents := oHmgData(), ; hmg_SetWindowObject( ::nHandle, Self ), ; ::nLeft := ::oApp:Left, ::nRight := ::oApp:Right, ; ::nTop := ::oApp:Top, ::nBottom := ::oApp:Bottom, ; ::nGapWidth := ::oApp:GapsWidth, ; ::nGapHeight := ::oApp:GapsHeight, ; Self ) ...
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2442
Зарегистрирован: 11.02.10
|
|
Отправлено: 16.05.25 12:21. Заголовок: SergKis пишет: Небо..
SergKis пишет: Поправил, конечно. Благодарю за помощь 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4737
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.05.25 20:12. Заголовок: gfilatov2002 Предло..
gfilatov2002 Предложение\правка _TBrowse(...), h_controlmisc2.prg в примерах (новые demo4., demo5.prg) https://TransFiles.ru/75j4e на ftp так же положил архив
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2444
Зарегистрирован: 11.02.10
|
|
Отправлено: 27.05.25 10:08. Заголовок: SergKis пишет: на f..
SergKis пишет: | цитата: | | на ftp так же положил архив |
| Забрал... SergKis пишет: Принято с благодарностью SergKis пишет: Как всегда, просто и лаконично  Одним словом - профессионально!
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4738
Зарегистрирован: 17.02.12
|
|
Отправлено: 27.05.25 17:12. Заголовок: gfilatov2002 Положи..
gfilatov2002 Положил на ftp demo6, добавил немного дизайна и показ удаленных записей
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2445
Зарегистрирован: 11.02.10
|
|
Отправлено: 27.05.25 21:22. Заголовок: SergKis пишет: доба..
SergKis пишет: | цитата: | | добавил немного дизайна и показ удаленных записей |
| Спасибо 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4739
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.05.25 11:49. Заголовок: gfilatov2002 Поправ..
gfilatov2002 Поправьте в demo7.prg MAIN NOSIZE TOPMOST ; ON INIT _wPost( 0) ; ON RELEASE _wSend(90) _wPost(90) в примере будет тоже нормально работать, т.к. событие быстрое, но правильнее писать всегда _wSend(90)
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2446
Зарегистрирован: 11.02.10
|
|
Отправлено: 28.05.25 12:13. Заголовок: SergKis пишет: Попр..
SergKis пишет: OK 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7993
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.05.25 17:50. Заголовок: Не работает закрытие..
Может в маленьких прогах это работает, но на больших - НЕ работает закрытие окна, прога тупо ВЕШАЕТСЯ !!! IF !Empty( _HMG_MainHandle ) ; _HMG_InplaceParentHandle := GetActiveWindow() ENDIF DEFINE WINDOW &cForm .... ; MODAL NOSIZE ; ON INIT _wPost( 0) ; ON RELEASE _wSend(98) ... :Event(98, {|ow,ky,cn| // ON Release Local ah := ow:Cargo:ahIcoDel ? ProcNL() ?? "---[ "+ow:Name+":Event("+hb_ntos(ky)+") ]---",cn ? Repl(".", 5), "=> RELEASE WINDOW <=", ow:Name ? Repl(".", 5),"Delete handle icon - ow:Cargo:ahIcoDel=" ?? ah, HB_ValToExp(ah) IF IsArray(ah) AEval(ah, {|h| DestroyIcon(h) }) // удалить хендлы иконок ENDIF (ow:Cargo:cAls)->( dbCloseArea() ) DbSelectArea(ow:Cargo:cAlsParent) // база с родительского окна ? Repl(".", 5),"Alias()=", ALIAS() ?v HMG_GetForms() ? "------------" Return Nil } ) Вот что в логе: ..... => RELEASE WINDOW <= FORM_ZAIVKA_F7Filter ..... Delete handle icon - ow:Cargo:ahIcoDel= ARRAY[1] {2949589} ..... Alias()= ZAIVKA 1 Form_Main 2 FORM_ZAIVKA 3 FORM_ZAIVKA_F7Filter <<<---------- окно не закрывается ------------ Куда копать ? 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4740
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.05.25 18:26. Заголовок: Andrey пишет Куда ко..
Andrey пишет Надо понимать, как это работает, ставя в ON RELEASE ... ?v HMG_GetForms() окно еще есть, т.к. RELEASE НЕ закончил работу  работает блок кода заданный, т.е. твой
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7994
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.05.25 21:39. Заголовок: SergKis пишет: Надо..
SergKis пишет: | цитата: | Надо понимать, как это работает, ставя в ON RELEASE ... ?v HMG_GetForms() окно еще есть, т.к. RELEASE НЕ закончил работу работает блок кода заданный, т.е. твой |
| Там минимум кода. В других местах работает этот код. А в этом коде на этом и ВИСИТ програ, значит не завершается... Почему не завершается, что мешает ??? Хочу понять что неправильно делаю.
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4741
Зарегистрирован: 17.02.12
|
|
Отправлено: 31.05.25 03:16. Заголовок: gfilatov2002 Положи..
gfilatov2002 Положил на ftp пример по вопросу Андрея "ВИСИТ програ" + readme.txt
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2447
Зарегистрирован: 11.02.10
|
|
Отправлено: 31.05.25 12:58. Заголовок: SergKis пишет: прим..
SergKis пишет: | цитата: | | пример по вопросу Андрея "ВИСИТ програ" + readme.txt |
| Благодарю за пример и пояснения к нему. Поправил код библиотеки для возврата фокуса на модальное окно из функции AlertInfo(). Убрал из примера строку EnableWindow( ky := ow:Handle ), и он отработал нормально. Благодарю за помощь!
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7996
Зарегистрирован: 12.09.06
|
|
Отправлено: 31.05.25 15:58. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Поправил код библиотеки для возврата фокуса на модальное окно из функции AlertInfo(). |
| У меня нет в коде вызова Alert*(), но прога всё равно вешается ДАЖЕ просто при выходе из окна. Но при добавлении 4 строк - перестаёт вешаться: // --------- работает !!! :Event({88,"_F7Cancel"}, {|ow,ky,cn| //Отмена ?? "---[ "+ow:Name+":Event("+hb_ntos(ky)+") ]---",cn App.Cargo:aRetFltr := {} // ОБЯЗАТЕЛЬНО ! добавка для возврата на родит.окно EnableWindow( ky := ow:Handle ) ow:Enabler(cn, .T.) ow:SetFocus(ow:Cargo:cFocus) DO EVENTS // ОБЯЗАТЕЛЬНО ! добавка для возврата на родит.окно _wSend(99, ow:Name) //ThisWindow.Release Return Nil } ) Надо проверить возврат в модальном окне Пример могу выслать, если нужно.
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4743
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.06.25 10:41. Заголовок: gfilatov2002 Может ..
gfilatov2002 Может стоит добавить в GetProperty(...) получение height, width или 0 для StatusBar, без исп. _IsControlDefined(...), для вычисления клиентской области окна ? nH := This.ClientHeight - This.SplitBox.Height - This.StatusBar.Height IF ( Upper( Arg2 ) == "VSCROLLBAR" .OR. Upper( Arg2 ) == "HSCROLLBAR" ) IF .NOT. _IsWindowDefined ( Arg1 ) MsgMiniGuiError ( "Window: " + Arg1 + " is not defined." ) ENDIF ELSEIF Upper( Arg2 ) == "SPLITBOX" IF ( ix := GetFormIndex ( Arg1 ) ) > 0 .AND. IsWindowHandle ( Arg8 := _HMG_aFormReBarHandle [ix] ) IF Arg3 == "WIDTH" RETURN GetWindowWidth ( Arg8 ) ELSEIF Arg3 == "HEIGHT" RETURN GetWindowHeight ( Arg8 ) ENDIF ENDIF ELSEIF Upper( Arg2 ) == "STATUSBAR" .and. ( Arg3 == "WIDTH" .or. Arg3 == "HEIGHT" ) RetVal := 0 IF ( ix := GetControlIndex( Arg2, Arg1 ) ) > 0 IF Arg3 == "HEIGHT" RetVal := _HMG_aControlHeight[ ix ] ELSEIF Arg3 == "WIDTH" RetVal := _HMG_aControlWidth [ ix ] ENDIF ENDIF RETURN RetVal ELSE VerifyControlDefined ( Arg1 , Arg2 ) ENDIF PS. По мне, это многое упростило бы, все запросы на width, height к контролам\окнам, если их нет, возвращали бы 0
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2448
Зарегистрирован: 11.02.10
|
|
Отправлено: 01.06.25 14:39. Заголовок: SergKis пишет: Може..
SergKis пишет: | цитата: | | Может стоит добавить в GetProperty(...) получение height, width или 0 для StatusBar |
| Благодарю за предложение, но уже сейчас это возможно, если напрямую использовать вызов этой функции | цитата: | | _getcontrolHeight("STATUSBAR","Form_1") |
| Она вернет 0, если статусбара нет на форме.
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4744
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.06.25 15:07. Заголовок: Тогда, может быть, н..
Тогда, может быть, надо выделить в i_this.ch из общего списка #xtranslate This . <c> . <p:Width> => _GetControlWidth ( <(c)>, _HMG_THISFORMNAME ) #xtranslate This . <c> . <p:Height> => _GetControlHeight ( <(c)>, _HMG_THISFORMNAME ) и в h_objects.prg CLASS TWndData добавить METHOD Enabler( cName, xVal ) INLINE SetProperty( ::cName, cName, "Enabled", ! Empty( xVal ) ) METHOD GetWidth ( cName ) INLINE iif( Empty( cName ), ::Width , _GetControlWidth ( cName, ::cName ) ) METHOD GetHeight( cName ) INLINE iif( Empty( cName ), ::Height, _GetControlHeight( cName, ::cName ) ) METHOD GetRow( cName ) INLINE iif( Empty( cName ), ::Row, _GetControlRow ( cName, ::cName ) ) METHOD GetCol( cName ) INLINE iif( Empty( cName ), ::Col, _GetControlCol ( cName, ::cName ) )
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2449
Зарегистрирован: 11.02.10
|
|
Отправлено: 01.06.25 16:40. Заголовок: SergKis пишет: в h_..
SergKis пишет: | цитата: | | в h_objects.prg CLASS TWndData добавить |
| Но ведь в классе TCnlData (наследнике TWndData) уже есть эти определения | цитата: | ACCESS Row INLINE _GetControlRow ( ::cName, ::oWin:Name ) ... ACCESS Col INLINE _GetControlCol ( ::cName, ::oWin:Name ) ... ACCESS Width INLINE _GetControlWidth ( ::cName, ::oWin:Name ) ... ACCESS Height INLINE _GetControlHeight( ::cName, ::oWin:Name ) |
| 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4745
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.06.25 16:51. Заголовок: gfilatov2002 пишет в..
gfilatov2002 пишет | цитата: | | в классе TCnlData (наследнике TWndData) уже есть эти определения |
| Для этого надо получать объект контрола, т.е. ( This.&(cn).Object ):Height и ..., если в событии This окна, то проще использовать переменную ow {|ow,ky,cn| _LogFile(.T., ky, ow:GetHeight(cn)) } если в событии This контрола, то тогда конечно {|obtn| _LogFile(.T., obtn:Height)} но можно обойтись, конечно и This.&(cn).Height
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2450
Зарегистрирован: 11.02.10
|
|
Отправлено: 01.06.25 17:17. Заголовок: SergKis пишет: Для ..
SergKis пишет: | цитата: | | Для этого надо получать объект контрола |
| Понял. Тогда, вероятно, имеет смысл вернутся к первому предложению. 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 7998
Зарегистрирован: 12.09.06
|
|
Отправлено: 02.06.25 15:32. Заголовок: Ещё небольшое предло..
Ещё небольшое предложение. Имеем такой синтаксис: This.&(cn).Enabled := .T. Если писать по другому, то такой - ow:Enabler(cn, .T.) Иногда ошибаешься и пишешь так - ow:Enabl ed(cn, .T.) Можно в препроцессоре добавить замену для такого случая ? 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4747
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.06.25 16:52. Заголовок: Andrey Имя Enabled у..
Andrey Имя Enabled уже занято, см. CLASS TWndDatat ACCESS Enabled INLINE IsWindowEnabled ( ::nHandle ) ASSIGN Enabled( xVal ) INLINE iif( Empty( xVal ), DisableWindow ( ::nHandle ), EnableWindow ( ::nHandle ) ) т.е. используем для состояния окна ow:Enabled := .F. ... ow:Enabled := .T.
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2451
Зарегистрирован: 11.02.10
|
|
Отправлено: 05.06.25 09:05. Заголовок: Опубликована финальн..
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4748
Зарегистрирован: 17.02.12
|
|
Отправлено: 05.06.25 14:32. Заголовок: gfilatov2002 Может ..
gfilatov2002 Может стоит, сделать, что бы все контролы, на запрос width, height выдавали 0 при отсутствии ? IF ( Upper( Arg2 ) == "VSCROLLBAR" .OR. Upper( Arg2 ) == "HSCROLLBAR" ) IF .NOT. _IsWindowDefined ( Arg1 ) MsgMiniGuiError ( "Window: " + Arg1 + " is not defined." ) ENDIF /* ELSEIF Upper( Arg2 ) == "SPLITBOX" IF ( ix := GetFormIndex ( Arg1 ) ) > 0 .AND. GetControlIndex( Arg2, Arg1 ) == 0 IF IsWindowHandle ( Arg8 := _HMG_aFormReBarHandle [ix] ) IF Arg3 == "WIDTH" RETURN GetWindowWidth ( Arg8 ) ELSEIF Arg3 == "HEIGHT" RETURN GetWindowHeight ( Arg8 ) ENDIF ELSE RETURN 0 ENDIF ENDIF ELSEIF Upper( Arg2 ) == "STATUSBAR" IF ( ix := GetControlIndex( Arg2, Arg1 ) ) > 0 IF Arg3 == "HEIGHT" RETURN _HMG_aControlHeight [ix] ELSEIF Arg3 == "WIDTH" RETURN _HMG_aControlWidth [ix] ENDIF ELSE RETURN 0 ENDIF[ */ ELSEIF ( Arg3 == "HEIGHT" .or. Arg3 == "WIDTH" ) .and. !Empty( Arg1 ) IF GetControlIndex( Arg2, Arg1 ) == 0 IF Upper( Arg2 ) == "SPLITBOX" .and. IsWindowHandle ( Arg8 := _HMG_aFormReBarHandle [ix] ) RETURN iif( Arg3 == "WIDTH", GetWindowWidth ( Arg8 ), GetWindowHeight ( Arg8 ) ) ELSE RETURN 0 ENDIF ENDIF ELSE VerifyControlDefined ( Arg1 , Arg2 ) ENDIF
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2452
Зарегистрирован: 11.02.10
|
|
Отправлено: 05.06.25 16:26. Заголовок: SergKis пишет: сдел..
SergKis пишет: | цитата: | | сделать, что бы все контролы, на запрос width, height выдавали 0 при отсутствии |
| Нет, стандартным способом определить наличие контрола на форме остается вызов функции _IsControlDefined(). Исключение было сделано для SPLITBOX и STATUSBAR для удобства расчета размеров клиентской области, как ты и предлагал. 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4749
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.06.25 20:13. Заголовок: gfilatov2002 Можно ..
gfilatov2002 Можно получить PRO версию на посмотреть
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2453
Зарегистрирован: 11.02.10
|
|
Отправлено: 09.06.25 21:25. Заголовок: SergKis пишет: Можн..
SergKis пишет: | цитата: | | Можно получить PRO версию |
| Да, конечно. Полная версия дистрибутива 25.06 есть у Андрея. 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4750
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.06.25 11:35. Заголовок: gfilatov2002 Нужен ..
gfilatov2002 Нужен пароль для архива, у Андрея его нет. Архив я взял из Пост N: 2451 этой темы
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2454
Зарегистрирован: 11.02.10
|
|
Отправлено: 10.06.25 11:45. Заголовок: SergKis пишет: Нуже..
SergKis пишет: Отправил пароль по почте bilance@bilance... 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4751
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.06.25 12:03. Заголовок: gfilatov2002 пишет О..
gfilatov2002 пишет | цитата: | | Отправил пароль по почте bilance@bilance... |
| Для меня, этой почты\фирмы уже нет, фирму купили литовцы
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2455
Зарегистрирован: 11.02.10
|
|
Отправлено: 10.06.25 12:29. Заголовок: SergKis пишет: Для ..
SergKis пишет: | цитата: | | Для меня, этой почты\фирмы уже нет |
| Тогда куда кинуть? 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4752
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.06.25 14:00. Заголовок: gfilatov2002 пишет Т..
gfilatov2002 пишет Спасибо, Андрей уже дал пароль, он отработал 
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 8001
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.06.25 00:41. Заголовок: Версия МиниГуи 25.06..
Версия МиниГуи 25.06 Что то WaitWindows() формы передергивает. При закрытии моей формы MODAL вот такое событие: :Event({98,"_1Cancel"}, {|ow,ky,cn| // выход _LogFile(.T., " -->> Button: ",cn, ow:Name, ky) _SetThisFormInfo(ow) // запись всей записи базы WaitWindow( {'Запись данных в БД-' + ow:Cargo:cAls, App.ExeName }, .T., 400, 16, NIL, WHITE, PURPLE ) .... WaitWindow() _SetThisFormInfo() aRet := {} _wSend(99,ow:Name) Return Nil } ) Появляется окно MAIN, потом WaitWindow(), после записи переход на предыдущую форму. Мелькают формы на экране... Некрасиво очень, да и юзеру тоже непонятно. Почему окно MAIN появляется, как его убрать ? 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4753
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.06.25 15:28. Заголовок: Andrey пишет Появляе..
Andrey пишет | цитата: | | Появляется окно MAIN, потом WaitWindow(), после записи переход на предыдущую форму. Мелькают формы на экране... |
| gfilatov2002 Такую ситуацию получить не удалось, но бяка нашлась. Пример https://TransFiles.ru/hvick Жмем кнопки <Test 1> => <Modal> => <Modal> => <Calculation> по завершению можем мышкой переключить фокус на main окно, а находимся на modal окне, если сразу запустить кнопку <Info>, то снова все Ok! на main окно фокус не поставить PS. Вариант WaitWindow(cMsg, bWait) так же приводит к такому результату, т.е работа ф-ии Скрытый текст
STATIC FUNCTION my_Report_1(ob) Local ct := 'Waiting ... Calculation in progress - ' + ; ob:cAlias + ";" + App.ExeName + ";" Local bw := {|| Local cww := ThisWindow.Name, nn Local alb := HMG_GetFormControls(cww, "LABEL") Local clb := ATail(alb) This.&(clb).Alignment := "Center" FOR nn := 1 TO 5 This.&(clb).Value := hb_ntos(nn) wApi_Sleep(1000) NEXT This.&(clb).Value := "" wApi_Sleep(300) ThisWindow.Release Return Nil } WaitWindow( ct, bw, 400, 16, NIL, YELLOW, BLUE ) RETURN Nil
| Примеры положил на ftp
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2456
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.06.25 21:38. Заголовок: SergKis пишет: по з..
SergKis пишет: | цитата: | | по завершению можем мышкой переключить фокус на main окно |
| Да, я подтверждаю эту проблему. Вывод: не стоит применять вызов функции WaitWindow() из модального окна, поскольку в этом случае вызывается дочернее окно, что, на самом деле, запрещено в системе. 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4754
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.06.25 22:14. Заголовок: gfilatov2002 пишет п..
gfilatov2002 пишет Для варианта WaitWindow(..., .T., ...) - это child окно, но вариант WaitWindow(..., bBlock, ...) - это modal окно (пример из архива Tsb_2tsb_a.7z), т.е. работа блока кода в окне ожидания (событие ON INIT окна) так же приводит к проблемной ситуации. В ф-ии работает цепочка, выделенная цветом IF lNoWait _HMG_IsModalActive := .F. DEFINE WINDOW _HMG_CHILDWAITWINDOW CHILD ELSE DEFINE WINDOW _HMG_CHILDWAITWINDOW MODAL IF HB_ISBLOCK( bOnInit ) l_No_Wait := .F. ENDIF ENDIF т.е. запуск модального окна ожидания под модальным окном, должно быть Ok!, а ситуация такая же как с child
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 8002
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.06.25 22:20. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Вывод: не стоит применять вызов функции WaitWindow() из модального окна, поскольку в этом случае вызывается дочернее окно, что, на самом деле, запрещено в системе. |
| Какой тогда выход из такой проблемы ? Делать своё окно, хорошее решение. НО, хочется иметь стандартную функцию в МиниГуи, которая предназначена для таких случаев !!! Может типа WaitWindowModal() с возможностью расположить ещё и иконку слева. Григорий - можно ли это сделать ? 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2457
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.06.25 22:27. Заголовок: SergKis пишет: запу..
SergKis пишет: | цитата: | | запуск модального окна ожидания под модальным окном, должно быть Ok |
| Решил эту проблему добавлением всего одной строки в код этой функции: STATIC FUNCTION my_Report_2(ob) Local ct := 'Waiting ... Calculation in progress - ' + ; ob:cAlias + ";" + App.ExeName + ";" Local bw := {|| Local cww := ThisWindow.Name, nn Local alb := HMG_GetFormControls(cww, "LABEL") Local clb := ATail(alb) This.&(clb).Alignment := "Center" FOR nn := 1 TO 5 This.&(clb).Value := hb_ntos(nn) wApi_Sleep(1000) NEXT This.&(clb).Value := "" wApi_Sleep(300) ThisWindow.Release Return Nil } _HMG_IsModalActive := .T. WaitWindow( ct, bw, 400, 16, NIL, WHITE, PURPLE ) RETURN Nil P.S. Уже поправил функцию WaitWindow() для этого случая - работает! 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4755
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.06.25 22:45. Заголовок: gfilatov2002 пишет Р..
gfilatov2002 пишет К сожалению это не совсем так, пример положил на ftp (в нем еще пробный вариант h_windows.prg, задание параметра WaitWindow(..., "M",...) для модал окна вместо child) Жмем <Test 1> => <Modal> => <Modal> => <Counting> мышкой на main окно нет доступа, жмем <Exit> и мышкой на main окно доступ есть, находимся на 1-ом modal окне
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4756
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.06.25 10:07. Заголовок: gfilatov2002 Не оч...
gfilatov2002 Не оч. понятно назначение переменной _HMG_IsModalActive ? Назначил в примере на все окна ON KEY F1 ACTION _LogFile(.T., ThisWindow.Name, ThisWindow.Type, _HMG_IsModalActive) При нажатии на всех вызванных окнах, в логе имеем значение _HMG_IsModalActive == .F. После нажатия <Calculation> тоже .F. (без добавки _HMG_IsModalActive := .T. WaitWindow( ct, bw, 400, 16, NIL, WHITE, PURPLE ) ), но после кнопки <Info>, значение, полученное по F1, _HMG_IsModalActive == .T. по выходу из окон значение, полученное по F1, _HMG_IsModalActive == .F. 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2458
Зарегистрирован: 11.02.10
|
|
Отправлено: 14.06.25 11:13. Заголовок: SergKis пишет: Не о..
SergKis пишет: | цитата: | | Не оч. понятно назначение переменной _HMG_IsModalActive ? |
| Переменная _HMG_IsModalActive используется в коде как глобальный флаг для определения, активна ли в данный момент модальная форма (или окно). Вот как она используется и какая логика стоит за её применением: --- ### 📌 Назначение _HMG_IsModalActive — логическая (boolean) переменная, которая: * Принимает значение .T. (истина), когда активна модальная форма. * Устанавливается в .F. (ложь), когда модальная форма закрыта или не используется. --- ### 🔍 Основные сценарии использования Вот ключевые моменты: 1. Проверка перед инициализацией окна: IF _HMG_IsModalActive .AND. bInit == NIL → Не разрешать открытие обычного окна, если активна модальная форма. 2. Контроль выполнения логики при показе окон: IF _HMG_IsModalActive .AND. lNoWait == .F. 3. Установка состояния: _HMG_IsModalActive := .T. _HMG_IsModalActive := .F. 4. Сохранение и восстановление статуса: lIsModal := _HMG_IsModalActive ... _HMG_IsModalActive := lIsModal → Например, при временном переключении контекста. --- ### 🧠 Логика использования 1. Обеспечение модальности: * Модальное окно блокирует доступ к другим окнам. Этот флаг гарантирует, что в это время нельзя открыть другие формы. 2. Избежание повторного запуска модальных окон: * Проверки с .AND. _HMG_IsModalActive предотвращают наложение нескольких модальных окон друг на друга. 3. Сброс флага при завершении окна: * После закрытия модального окна переменная обязательно сбрасывается в .F.. --- ### ✅ Вывод Переменная _HMG_IsModalActive — это управляющий флаг на уровне всей GUI-системы, который поддерживает корректную логику модальности окон: не позволяет открыть обычные окна или другие модальные окна, пока активна одна модальная форма, и корректно восстанавливает поведение после её закрытия. Вот функции, в которых используется переменная _HMG_IsModalActive, а также краткий разбор их ролей: --- ### 🔹 1. FUNCTION _ActivateWindow Использование: IF _HMG_IsModalActive .AND. bInit == NIL ... IF _HMG_IsModalActive .AND. lNoWait == .F. Назначение: Эта функция проверяет, активна ли модальная форма, перед тем как активировать новое окно. Если модальное окно активно, инициализация нового окна либо запрещается, либо обрабатывается особым образом. --- ### 🔹 2. FUNCTION _GenActivateId Использование: IF _HMG_IsModalActive == .F. _HMG_IsModalActive := .T. ... _HMG_IsModalActive := .F. Назначение: Функция генерирует активацию формы и устанавливает флаг модальности. После завершения действия модальность сбрасывается. Это типичная обертка для временного включения модального состояния. --- ### 🔹 3. FUNCTION _ShowWindow Использование: IF _HMG_IsModalActive _HMG_IsModalActive := .T. Назначение: При показе окна проверяется текущая модальность. Возможно, эта функция повторно устанавливает флаг, если окно уже должно быть модальным, чтобы гарантировать, что статус не будет потерян. --- ### 🔹 4. FUNCTION WaitWindow Использование: lIsModal := _HMG_IsModalActive ... _HMG_IsModalActive := .F. _HMG_IsModalActive := .T. ... _HMG_IsModalActive := lIsModal Назначение: Функция временно приостанавливает интерфейс (ждёт действия пользователя). Она сохраняет текущее состояние модальности, выключает его, выполняет действие, потом возвращает обратно. Это предотвращает "залипание" модального состояния при вложенных вызовах. --- ### 🧩 Вывод Все эти функции работают как части механизма управления модальными окнами. Поведение строится на следующей логике: * При показе или активации формы модальность устанавливается. * Перед запуском новой формы модальность проверяется. * После завершения — сбрасывается или восстанавливается предыдущее состояние.
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4757
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.06.25 11:30. Заголовок: gfilatov2002 Спасиб..
gfilatov2002 Спасибо большое за детальное объяснение Примерно так я и понял из кода, но меня смущает краткость действия этой переменной, т.е. если несколько модальных окон, то ее состояние, по мне, должно быть всегда .T. и не быть .F. (по F1 выше из примера в лог). Возможно, надо обрабатывать счетчик модальных окон в работе, т.к. добавка в пример еще одного уровня вызова простого модального окна ничего не дала, уже сразу по выходу из него, ситуация с переключением фокуса на др. окна работает, а по идее при наличии счетчика модальных окон > 0, этого не должно быть Пример положил на ftp
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4758
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.06.25 11:47. Заголовок: gfilatov2002 пишет И..
gfilatov2002 пишет | цитата: | | Избежание повторного запуска модальных окон |
| Это не оч. понятно, т.к. вызов модального окна из модального - нормальная ситуация для gui приложения
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4759
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.06.25 12:27. Заголовок: gfilatov2002 пишет *..
gfilatov2002 пишет | цитата: | | * После закрытия модального окна переменная обязательно сбрасывается в .F.. |
| Может надо установку значения делать от Len(HMG_GetForms("M")) > 0 PS Поставил в ф-ии вызова модальных окон (в примере) перед выходом ... ACTIVATE WINDOW &cForm _HMG_InplaceParentHandle := 0 _HMG_IsModalActive := Len(HMG_GetForms("M")) > 0 RETURN NIL т.е. при наличии модал окон переменная == .T., на фокус переключеня между окнами (после выхода из модал окна) это не отразилось - мышкой ставится
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4760
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.06.25 17:42. Заголовок: gfilatov2002 Немного..
gfilatov2002 Немного модифицировал WaitWindow(..., .T., ...) запуск из модального окна, вызывает окно ожидания modal Скрытый текст
FUNCTION WaitWindow ( cMessage, lNoWait, nWidth, nSize, cFont, aFontColor, aBackColor ) LOCAL lIsModal, cModal, hWnd ... nHeight += 8 IF !Empty( _HMG_MainHandle ) hWnd := iif( _HMG_BeginWindowMDIActive, GetActiveMdiHandle(), GetActiveWindow() ) IF hWnd != NIL .and. ( nI := GetFormIndexByHandle ( hWnd ) ) > 0 IF _HMG_aFormType [ nI ] == "M" cModal := "M" ENDIF ENDIF ENDIF IF lNoWait .and. Empty( cModal ) _HMG_IsModalActive := .F. DEFINE WINDOW _HMG_CHILDWAITWINDOW CHILD ELSE _HMG_IsModalActive := .T. DEFINE WINDOW _HMG_CHILDWAITWINDOW MODAL IF HB_ISBLOCK( bOnInit ) l_No_Wait := .F. ENDIF ENDIF ...
| PS. В h_alert.prg изменил hPrevious := GetActiveWindow() на hPrevious := iif( _HMG_BeginWindowMDIActive, GetActiveMdiHandle(), GetActiveWindow() )
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4761
Зарегистрирован: 17.02.12
|
|
Отправлено: 15.06.25 08:05. Заголовок: SergKis пишет ..
SergKis пишет | цитата: | IF hWnd != NIL .and. ( nI := GetFormIndexByHandle ( hWnd ) ) > 0 IF _HMG_aFormType [ nI ] == "M" cModal := "M" ENDIF ENDIF |
| Лучше так IF hWnd != NIL .and. ( nI := GetFormIndexByHandle ( hWnd ) ) > 0 IF _HMG_aFormType [ nI ] $ "MSY" cModal := "M" ENDIF ENDIF
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2459
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.06.25 14:08. Заголовок: SergKis пишет: Лучш..
SergKis пишет: Благодарю за помощь! Записал так: ... nHeight += 8 #ifdef _HMG_COMPAT_ IF ! Empty( _HMG_MainHandle ) hWnd := iif( _HMG_BeginWindowMDIActive, GetActiveMdiHandle(), GetActiveWindow() ) IF hWnd != NIL .and. ( nI := GetFormIndexByHandle( hWnd ) ) > 0 IF _HMG_aFormType [ nI ] $ "MSY" _HMG_IsModalActive := .T. ENDIF ENDIF ENDIF #endif IF lNoWait .AND. ! _HMG_IsModalActive DEFINE WINDOW _HMG_CHILDWAITWINDOW CHILD ELSE DEFINE WINDOW _HMG_CHILDWAITWINDOW MODAL IF HB_ISBLOCK( bOnInit ) l_No_Wait := .F. ENDIF ENDIF
|
 |
|
|
Andrey
|
| постоянный участник
|
Пост N: 8003
Зарегистрирован: 12.09.06
|
|
Отправлено: 15.06.25 15:32. Заголовок: Ставлю так: #include..
Ставлю так: #include "minigui.ch" .... cForm := GetFormNameByIndex( nIndex ) Не компилируется... выдаёт ошибку: Error: Unresolved external '_HB_FUN_GETFORMNAMEBYINDEX' referenced from Ставлю так: #include "hmg.ch" Нормально компилируется.
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4762
Зарегистрирован: 17.02.12
|
|
Отправлено: 15.06.25 16:45. Заголовок: gfilatov2002 пишет И..
gfilatov2002 пишет | цитата: | Использование: lIsModal := _HMG_IsModalActive ... _HMG_IsModalActive := .F. _HMG_IsModalActive := .T. ... _HMG_IsModalActive := lIsModal |
| С этим большая непонятка, пример положил на ftp. Запуск, жмем <Test 1> => <Modal> => <Modal> => <Wait> => [X] потом <Exit> => <Exit> Вышли на уровень STANDARD окна, все работает, кроме переключения фокуса с модальных окон на main окно мышкой (это было) Теперь то же самое делаем на кнопке <Test 2> => ... На ней сделано с переменной, как написано выше, т.е. работа modal окон со значением .T. :Event( 1, {|ow,ky,cn| Local lIsModal := _HMG_IsModalActive ? ow:Name+" :Event( 1 ... start", _HMG_IsModalActive SET WINDOW THIS TO ow:Name _HMG_IsModalActive := .T. ?? "===>", _HMG_IsModalActive Table_Four(ow, cn, .T.) _HMG_IsModalActive := lIsModal ? ow:Name+" :Event( 1 ... stop ", _HMG_IsModalActive SET WINDOW THIS TO ky := ow IF ow:Type == "M" ; EnableWindow( ky := ow:Handle ) ENDIF ow:Enabler(cn, .T.) ow:SetFocus(ow:Cargo:cFocus) Return Nil }) Можно сказать, что все хорошо (переключение мышкой фокуса блокировано), до возврата на окно STANDARD ... окно не в фокусе и выход только по TaskManager, т.е. полный завис
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4763
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.06.25 10:42. Заголовок: SergKis пишет полный..
SergKis пишет Причину понял, окно MAIN и STANDARD в состоянии disable, поставил в блоки кода окно MAIN :Event( 1, {|ow,ky,cn| _wSend(10,,{cn, .F.}) SET WINDOW THIS TO ow:Name Table_One(ow, cn) SET WINDOW THIS TO _wSend(10,,{cn, .T.}) ow:SetFocus( ky := ow:Cargo:cFocus ) Return Nil }) :Event( 2, {|ow,ky,cn| _wSend(10,,{cn, .F.}) SET WINDOW THIS TO ow:Name Table_Two(ow, cn) SET WINDOW THIS TO _wSend(10,,{cn, .T.}) ow:SetFocus( ky := ow:Cargo:cFocus ) Return Nil }) в окно STANDARD кнопка <Test 2> :Event( 1, {|ow,ky,cn| Local lIsModal := _HMG_IsModalActive SET WINDOW THIS TO ow:Name _HMG_IsModalActive := .T. Table_Four(ow, cn, .T.) _HMG_IsModalActive := lIsModal EnableWindow( _HMG_MainHandle ) EnableWindow( ky := ow:Handle ) ow:Enabler(cn, .T.) ow:SetFocus(ow:Cargo:cFocus) DO EVENTS Return Nil }) отработало как надо, т.е. надо, наверно, вводить команду на установку\снятие режима modal, при снятии всем оставшимся окнам делать EnableWindow( Handle )
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2460
Зарегистрирован: 11.02.10
|
|
Отправлено: 16.06.25 12:16. Заголовок: SergKis пишет: Прич..
SergKis пишет: Пример отработал нормально. Большое спасибо 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4764
Зарегистрирован: 17.02.12
|
|
Отправлено: 16.06.25 17:03. Заголовок: gfilatov2002 Почист..
gfilatov2002 Почистил пример, работает, положил на ftp
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4765
Зарегистрирован: 17.02.12
|
|
Отправлено: 17.06.25 11:12. Заголовок: gfilatov2002 Добавил..
gfilatov2002 Добавил в пример схему работы, по выборке данных, под окном кнопки <Wait>, для законченности варианта примера на событиях положил на ftp
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4766
Зарегистрирован: 17.02.12
|
|
Отправлено: 19.06.25 17:20. Заголовок: gfilatov2002 Добавил..
gfilatov2002 Добавил в пример на кнопку <Wait> иконки ожидания, положил на ftp
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2461
Зарегистрирован: 11.02.10
|
|
Отправлено: 19.06.25 20:12. Заголовок: SergKis пишет: Доба..
SergKis пишет: | цитата: | | Добавил в пример на кнопку <Wait> иконки ожидания |
| Большое спасибо! 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4767
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.06.25 13:42. Заголовок: gfilatov2002 Довел ..
gfilatov2002 Довел пример до раб. состояния (кнопки <Test 3\4>, <Wait> + в нее клавишу Esc), положил на ftp
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2462
Зарегистрирован: 11.02.10
|
|
Отправлено: 21.06.25 14:45. Заголовок: SergKis пишет: поло..
SergKis пишет: Спасибо, обязательно посмотрю... 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4768
Зарегистрирован: 17.02.12
|
|
Отправлено: 30.06.25 14:42. Заголовок: gfilatov2002 Малень..
gfilatov2002 Маленькая правка в _TBrowse(...) (перенести строки) Скрытый текст
:SetDeleteMode( .F. ) IF HB_ISBLOCK( bInit ) ; Eval( bInit, oBrw, oParam ) // 1. call your customization functions ENDIF IF oParam:lNoPicture // clear oCol:cPicture j := iif( :lIsDbf, "ORDKEYNO", "ARRAYNO" ) FOR EACH i IN :aColumns IF !Empty( i:cName ) .AND. i:cName != j i:cPicture := NIL ENDIF NEXT ENDIF IF HB_ISBLOCK( bInit ) ; Eval( bInit, oBrw, oParam ) // 1. call your customization functions ENDIF
|
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2463
Зарегистрирован: 11.02.10
|
|
Отправлено: 30.06.25 14:49. Заголовок: SergKis пишет: прав..
SergKis пишет: OK 
|
 |
|
|
gfilatov2002
|
| moderator
|
Пост N: 2464
Зарегистрирован: 11.02.10
|
|
Отправлено: 30.06.25 17:21. Заголовок: Всем кому это интересно...
Завершена подготовка новой сборки 25.07, которая будет опубликована завтра. Что нового: - исправление обнаруженных ошибок после проведенного анализа используемых Си-функций (в том числе 96+ WinAPI функций); - продолжено документирование исходного кода библиотеки, которое было начато в еще в декабре прошлого года; - добавлена полезная функция HMG_ListTimers(), которая возвращает массив активных таймеров в виде { hParentWnd, nTimerID, nInterval } - исправлена ошибка в коде функции Selector для режима OTM, добавлен тестовый пример для проверки всех основных SQL-выборок: TestBasicSelector() TestSelectorWithFilter() TestSelectorWithGroupAndSummary() TestSelectorOneToMany(); - обновлена библиотека libpng до свежей версии 1.6.49; - обновлены различные примеры, как обычно. Желаю всем хорошего дня 
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4769
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.07.25 13:39. Заголовок: gfilatov2002 Обнару..
gfilatov2002 Обнаружил, что перестала работать (не знаю с какой версии) ф-я __objHasData( oMain, "Name" ) Стал смотреть Tsb_DemoMdi пример и получаю снятие при выходе из последнего окна просмотра, добавил в пример вывод в лог Скрытый текст
(This.Object):Event( 98, {|ow| Local oBrw, oTsb := ow:GetObj("oBrw") If ISOBJECT(oTsb) oBrw := oTsb:Tsb If ow:Cargo:FocusedControl == "MyFind" // GetBox edit end oBrw:SetFocus() DO EVENTS RETURN Nil ElseIf oBrw:IsEdit oBrw:PostMsg( WM_KEYDOWN, VK_ESCAPE ) // TsBrowse edit end oBrw:SetFocus() DO EVENTS RETURN Nil EndIf // Child release EndIf _CloseActiveMdi() DO EVENTS If Len(HMG_GetForms("Y")) == 0 ? ">>> 98", oMain, oMain:Name ?? __objHasData( oMain, "Name" ), oMain:Name _wPost(99, oMain) EndIf RETURN Nil } )
| Получил >>> 98 'O' wMain .F. wMain т.е. имеем .F., в версии hmg-23.12 все работает как надо, если это так, то надо в ф-ях сделать FUNCTION _wPost( nEvent, nIndex, xParam ) ... cForm := nIndex:Name //cForm := _HMG_THISFORMNAME //IF __objHasData( nIndex, "Name" ) ; cForm := nIndex:Name //ENDIF ... FUNCTION _wSend( nEvent, nIndex, xParam ) ... cForm := nIndex:Name //cForm := _HMG_THISFORMNAME //IF __objHasData( nIndex, "Name" ) ; cForm := nIndex:Name //ENDIF ...
|
 |
|
|
SergKis
|
| постоянный участник
|
Пост N: 4770
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.07.25 15:37. Заголовок: PS Есть файл checkre..
PS Есть файл checkres.txt в примере с содержимым C:\MiniGUI\SAMPLES\Advanced\Tsb_DemoMDI\DemoMdi.exe -- BRUSH,353372758,DOMETHOD(6027)->MAIN(317) C:\MiniGUI\SAMPLES\Advanced\Tsb_DemoMDI\DemoMdi.exe -- BRUSH,-1425010468,MDICHILDOPEN(1009)->(b)MAIN(227)->DO_WINDOWEVENTPROCEDURE(84)->TWNDDATA:DOEVENT(1441)->DO_ONWNDLAUNCH(717)->(b)INIT(127)->EVENTS(1177)->DOMESSAGELOOP(0)->_ACTIVATEWINDOW(1648)->DOMETHOD(6027)->MAIN(317)
|
 |
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|