On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
модератор




Пост N: 699
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 29.01.08 13:59. Заголовок: Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)


Начало темы находится здесь, а теперь

АНОНС * АНОНС * АНОНС * АНОНС * АНОНС

Готовится к опубликованию новая сборка №48, которая выйдет в конце недели.
Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне

Кратко, что нового:

- исправление обнаруженных ошибок и неточностей кода;
- новый класс HEADERIMAGE для Grid и Browse;
- свойство Address в Hyperlink может теперь открывать папку или файл на диске;
- добавлен NOTABSTOP класс для Browse;
- поддержка пользовательских компонентов (заимствована из оффициального релиза);
- расширения и исправления в библиотеках TsBrowse и PropGrid;
- обновлены сборки Харбор и HMGS-IDE;
- новые и обновленные старые примеры (как обычно ).




Спасибо: 5 
ПрофильЦитата Ответить
Ответов - 129 , стр: 1 2 3 4 5 6 7 All [только новые]


moderator




Пост N: 2465
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 01.07.25 17:44. Заголовок: SergKis пишет: надо..


SergKis пишет:

 цитата:
надо в ф-ях сделать


Поправил, пример отработал после этого нормально.
Благодарю за помощь

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2466
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 02.07.25 12:58. Заголовок: На английском форуме..


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

Написал такую функцию и пример для проверки (см. ниже).

Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4771
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 02.07.25 13:35. Заголовок: А не проще формирова..


А не проще, формировать новый массив для комбо и помещать его новый адрес на место старого ?
Это один запрос к базе\серверу ... Когда использовал GRID (правда очень давно не пользуюсь) так и делал, записей в комбо не много, как правило

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2467
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 02.07.25 13:43. Заголовок: SergKis пишет: форм..


SergKis пишет:

 цитата:
формировать новый массив для комбо и помещать его новый адрес на место старого


Да, именно так и сделано.
Возможно, я не совсем понял, что значит помещать новый адрес на место старого.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4772
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 02.07.25 14:05. Заголовок: gfilatov2002 пишет В..


gfilatov2002 пишет
 цитата:
Возможно, я не совсем понял, что значит помещать новый адрес на место старого


Примерно так
aCBox := mySelect(...)
_HMG_aControlMiscData1[ i ][ 13 ] := aCBox
или _HMG_aControlMiscData1[ i ][ 13 ] := mySelect(...)
правда точно не помню назначения в _HMG_aControlMiscData1[ i ] для комбо

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2468
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 02.07.25 14:48. Заголовок: SergKis пишет: Прим..


SergKis пишет:

 цитата:
Примерно так


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4773
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 02.07.25 15:26. Заголовок: gfilatov2002 Пример..


gfilatov2002
Пример хороший и сделан правильно, но, по мне, это плохая схема использования комбо в жизни GRID, т.к. item-ы при вводе требуют валидности, да и замена всего массива требует проверки изменения item-ов (они были ?). Комбо в GRID это оч. редко или совсем не меняемые справочники типа {"муж.","жен."}, должности, отделы, ... +, когда комбо ячейка в фокусе, то оч. легко случайно, клавишей, сменить значение в ячейке и мышкой уйти на др. ячейку и не заметить этого.
По мне это пример, как не надо работать с комбо

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2469
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 02.07.25 15:33. Заголовок: SergKis пишет: По м..


SergKis пишет:

 цитата:
По мне это пример, как не надо работать с комбо


Поддерживаю!

SergKis пишет:

 цитата:
Комбо в GRID это оч. редко или совсем не меняемые справочники


Полностью согласен.

P.S. Я просто ответил на вопрос на форуме...

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2470
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 02.07.25 16:57. Заголовок: Всем кому это интересно...


Написал такой пример для проверки новой функции HMG_LISTTIMERS().

Скрытый текст

Вопрос: нужен ли такой пример в поставке библиотеки?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8004
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 03.07.25 02:25. Заголовок: Да пускай будет ! :..


Да пускай будет !

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2471
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 03.07.25 09:31. Заголовок: Andrey пишет: пуска..


Andrey пишет:

 цитата:
пускай будет


Спасибо за отклик!

Ниже приведена окончательная версия этого примера:
Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4775
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.07.25 10:35. Заголовок: gfilatov2002 Чем ф-..


gfilatov2002
Чем ф-я aTm := HMG_LISTTIMERS() лучше aTm := HMG_GetFormControls(ThisWindow.Name, "TIMER" ) ?
Есть ли в ней имя таймера для пакетной работы типа
cForm := ThisWindow.Name
FOR EACH cTm IN HMG_GetFormControls(cForm, "TIMER" )
? cForm, cTm, This.&(cTm).Interval, , This.&(cTm).Enabled
...

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2472
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 03.07.25 10:56. Заголовок: SergKis пишет: Чем ..


SergKis пишет:

 цитата:
Чем ф-я aTm := HMG_LISTTIMERS() лучше aTm := HMG_GetFormControls(ThisWindow.Name, "TIMER" ) ?


Дело не в том, что лучше, а что хуже. Это просто еще одна возможность для работы с таймерами.
Кстати, функция HMG_LISTTIMERS() не привязана к конкретному окну (как HMG_GetFormControls(ThisWindow.Name, "TIMER" ) ), а показывает все активные таймеры, которые установлены в данный момент в программе.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4776
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.07.25 11:40. Заголовок: gfilatov2002 пишет п..


gfilatov2002 пишет
 цитата:
показывает все активные таймеры


т.е. Enabled == .T. , а Enabled == .F. нет ?

 цитата:
функция HMG_LISTTIMERS() не привязана к конкретному окну




Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2473
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 03.07.25 11:56. Заголовок: SergKis пишет: т.е...


SergKis пишет:

 цитата:
т.е. Enabled == .T. , а Enabled == .F. - нет


Именно так

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4777
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.07.25 14:55. Заголовок: gfilatov2002 пишет И..


gfilatov2002 пишет
 цитата:
Именно так


Это мало что дает, т.е. снимок не отражает картину, особенно, если таймеры короткие (100 - 300 мс) и они на время работы блока кода ставятся Enable := .F. и потом .T. (все таймеры исп. этот механизм) Что то определить по таким данным ф-ии сложно. Возможно, надо, что бы ф-я возвращала все таймера назначенные в программе с их тек. соостоянием Enable ?

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2474
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 04.07.25 09:52. Заголовок: SergKis пишет: Что ..


SergKis пишет:

 цитата:
Что то определить по таким данным ф-ии сложно.


Так как основное использование этой функции - для отладки кода, то можно временно убрать Enable := .F. в режиме отладки.
Но это уже вопросы конкретной реализации работы таймеров...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4778
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 04.07.25 10:42. Заголовок: gfilatov2002 пишет в..


gfilatov2002 пишет
 цитата:
временно убрать Enable := .F. в режиме отладки


Зачем такая канитель, тем более, что это для отладки (ставить Enable := .T. надо для каждого таймера, его блока кода) ?
Проще получать весь список "TIMER" и иметь в массиве элемент Enabled для анализа, возможно, имя таймера и имя окна (дополнительно к handle)
PS
Такой массив можно использовать и для управления таймерами (включать\выключать их работу), а не только для отладки

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2475
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 07.07.25 17:12. Заголовок: Всем кому это интересно,,,


Выложил первое обновление для сборки 25.07 Update 1

Что нового:
- исправление обнаруженных ошибок;
- добавлены две новые функции (на уровне Си-кода) для проверки наличия секций и ключей в ини-файлах:

 цитата:

IsINISectionExists( cSection, cIniFile ) -> .T. / .F.
IsINIKeyExists( cSection, cKey, cIniFile ) -> .T. / .F.


- добавлены комментарии в код библиотеки и некоторых примеров.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4779
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.07.25 18:48. Заголовок: gfilatov2002 Положи..


gfilatov2002
Положил на ftp пример работы _TBrowse(...) с отборами\выборками из базы

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2477
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 09.07.25 18:57. Заголовок: SergKis Спасибо, по..


SergKis
Спасибо, посмотрю, конечно.

P.S. Пример очень лаконичный и насыщенный.
Вот его краткое описание, сгенерированное ИИ:

 цитата:
 
/*
* Demonstrates the use of two TBrowse objects to display data from two related DBF files.
*
* Purpose:
* This function creates a main window containing two TBrowse objects. Each TBrowse displays data from a different DBF file ("CUSTOMER2" accessed via aliases CUST1 and CUST2).
* The TBrowse objects are related through a relation set up between the DBF files.
* The function demonstrates how to use the _TBrowse() function to manage multiple TBrowse objects within a single window and how to switch focus between them using the TAB key.
* It also shows how to handle the ESCAPE key to exit edit mode or close the window.
* The function uses temporary DBF files created in memory to filter the data displayed in each TBrowse (one showing records where RecNo() % 2 != 0, the other where RecNo() % 2 == 0).
*
* Notes:
* The function relies on the Sets_TSB() function to configure the TBrowse objects.
* The CUSTOMER2.DBF file must exist in the same directory as the executable.
* The temporary DBF files are deleted when the window is closed.
*/



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8006
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.07.25 05:43. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Вот его краткое описание, сгенерированное ИИ:


Это надо поставить в начале примера !
Иначе непонятно что это за пример...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4780
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.07.25 08:08. Заголовок: gfilatov2002 Добави..


gfilatov2002
Добавил в пример более широкую информацию в Title окна и SuperHeader тсб (просьба Андрея), + почистил код немного
Положил на ftp
PS
Для понимания о чем речь (кому интересно), пример demo8.prg тут Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2478
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.07.25 13:10. Заголовок: SergKis пишет: Поло..


SergKis пишет:

 цитата:
Положил на ftp


Большое спасибо!

Andrey пишет:

 цитата:
Это надо поставить в начале примера


Добавил комментарии в код (см. ниже)
Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4781
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.07.25 14:28. Заголовок: gfilatov2002 пишет ..


gfilatov2002 пишет
 цитата:
  * STATIC FUNCTION Select2Mem(lMode, cFld)  
*
* Creates a temporary in-memory DBF file containing records from the current work area based on a filter condition.
*
* Parameters:
* lMode (LOGICAL): If .T., selects records where RecNo() % 2 == 0. If .F., selects records where RecNo() % 2 != 0.
...


Это место я поменял для индикации и более гибкого отбора на
 
STATIC FUNCTION Select2Mem(bMode, cFld)
LOCAL nOld := Select()
LOCAL aRecs := {}, cAls := Alias()
LOCAL cFile := "mem:" + cAls, nFld, aRec, nRec
Default cFld := "CUSTNO"

IF IsChar( bMode ) ; bMode := &("{|| "+bMode + " }")
ENDIF

DO EVENTS
nFld := FieldPos(cFld)
GO TOP
DO WHILE !EOF()
DO EVENTS
nRec := iif( EVal( bMode ), RecNo(), 0 )

IF nRec > 0
AAdd(aRecs, { FieldGet(nFld), Deleted() })
ENDIF
SKIP
ENDDO
...

т.е. можно задавать, например, в Main
LOCAL cSel1 := "'BOX' $ upper(ADDR1)" //"RecNo() %2 != 0"
LOCAL cSel2 := ...
получим отбор из других, заданных условий
PS
Можно задавать поля для колонок тсб, переменные
oTsb1:aSelFld := NIL // FieldNames relation, array
oTsb2:aSelFld := NIL // FieldNames relation, array
например
oTsb1:aSelFld := {"COUNTRY", "STATE", "CITY", "COMPANY", "ADDR1"}
oTsb2:aSelFld := {"COUNTRY", "STATE", "CITY", "COMPANY", "ADDR1"}

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2479
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.07.25 15:19. Заголовок: SergKis пишет: Это ..


SergKis пишет:

 цитата:
Это место я поменял


Поправил описание функции следующим образом:

 цитата:
 
/*
* STATIC FUNCTION Select2Mem(bMode, cFld)
*
* Creates a temporary in-memory DBF file containing records from the current work area based on a filter condition.
*
* Parameters:
* bMode (BLOCK): A code block (closure) that defines the filter condition. It should evaluate to .T. for records to be included in the temporary DBF.
* cFld (CHARACTER, optional): The field to copy to the new DBF. Defaults to "CUSTNO".
*
* Returns:
* CHARACTER: The alias of the newly created in-memory DBF file (e.g., "mem:ALIAS").
*
* Purpose:
* This function is used to create temporary DBF files in memory that contain a subset of the data from an existing DBF file.
* This allows for filtering and displaying specific records in TBrowse objects without modifying the original DBF file.
* The function iterates through the records in the current work area, applies the filter condition defined by the bMode code block, and copies the specified field (cFld) and deletion status to the new in-memory DBF.
* The new DBF file is created with a single field named "ROWID" of type Numeric.
* This function is crucial for creating dynamic views of data based on specific criteria.
*
* Notes:
* The function uses the dbDrop() function to delete any existing DBF file with the same alias before creating the new one.
* The function uses dbCreate() to create the new in-memory DBF file.
* The function uses dbAppend() and FieldPut() to add records to the new DBF file.
* The function uses dbDelete() to mark records as deleted in the new DBF file if they were deleted in the original DBF file.
* The function restores the original work area after creating the new DBF file.
* The bMode parameter *must* be a valid code block that can be evaluated in the context of the current work area.
*/



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4784
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.07.25 11:53. Заголовок: gfilatov2002 Положи..


gfilatov2002
Положил на ftp пример аналог demo8, но работа тсб без индексов и set relation.
Кому интересно demo9.prg тут Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2480
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 14.07.25 12:20. Заголовок: SergKis пишет: Поло..


SergKis пишет:

 цитата:
Положил на ftp пример


Большое спасибо, обязательно посмотрю...

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2481
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 15.07.25 12:01. Заголовок: SergKis Еще раз бла..


SergKis
Еще раз благодарю за новый пример.

Ниже - его прокомментированная версия:
Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 392
Зарегистрирован: 03.12.08
ссылка на сообщение  Отправлено: 16.07.25 11:56. Заголовок: Доброго дня всем фор..


Доброго дня всем форумчанам . Давно не писал на Clipper/Harbour , а вот теперь снова понадобилось кой чего автоматизировать ...
Подскажите , где сейчас находятся дистрибутивы Hаrbour и MiniGui ? Хочу установить всё для работы на новом компьютере .

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 8122
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 16.07.25 12:26. Заголовок: Softlog86 пишет: По..


Softlog86 пишет:

 цитата:
Подскажите , где сейчас находятся дистрибутивы Hаrbour и MiniGui ? Хочу установить всё для работы на новом компьютере .


http://hmgextended.com/download.html

Спасибо: 1 
ПрофильЦитата Ответить
moderator




Пост N: 2482
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 27.07.25 18:03. Заголовок: Всем, кому это интересно...


Завершена подготовка новой сборки 25.08, которая будет опубликована на следующей неделе.

Кратко, что нового:
Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2483
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 30.07.25 09:29. Заголовок: Всем, кому это интересно...


Выложил новую сборку 25.08

Стандартная версия click here

ПРО-версия (архив под паролем) click here

Желаю всем хорошего дня!

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2485
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 16.08.25 17:45. Заголовок: Обновил HMGS-IDE 1.4..


Обновил HMGS-IDE 1.4.4.8 по адресу:

http://www.hmgextended.com/files/HMGS-IDE/ide.zip

Что нового:

 цитата:

*Fixed : Incorrect double save of Tree control in TAB after modifying the form. Bug reported by Varga Zsolt


Желаю всем хороших выходных.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 256
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 17.08.25 11:01. Заголовок: Menu


Григорий, спасибо за новую версию!
Перешел с версии 25.05 и обратил внимание, что картинки в меню поменяли фон.
У меня в моих менюшках фон стал и белый и малиновый и черный..
Посмотреть пример - miniGui\SAMPLES\BASIC\MENU_Picture:


Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2486
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 17.08.25 20:21. Заголовок: krutoff пишет: карт..


krutoff пишет:

 цитата:
картинки в меню поменяли фон


Благодарю за сообщение!

Вернул прежний вид картинок в меню:

Исправление будет включено в следующую сборку.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8035
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.09.25 13:57. Заголовок: Версия МиниГуи 25.06..


Версия МиниГуи 25.06Pro
MsgDebug() портит текущий АЛИАС базы !!!
   ? ProcNL(), ALIAS()  // вернет "User2Log" 
MsgDebug("меню фильтра - { cStr, cFilter, cSort }", ALIAS() )
? ProcNL(), ALIAS() // вернет ""

Оказывается и AlertInfo() тоже портит текущий АЛИАС базы !!!
   ? ProcNL(), ALIAS(), INDEXORD()   
AlertInfo("TEST !" )
? ProcNL(), ALIAS(), INDEXORD()
Вернёт:
>>> MYTSBFILTER(941) => user2tsb.prg USER2LOG 3
>>> MYTSBFILTER(944) => user2tsb.prg '' 0

И MsgInfo("Test " + ALIAS() + " " + HB_NtoS(INDEXORD())) - аналогично портит алиас

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8036
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.09.25 11:18. Заголовок: Выяснил, что при зап..


Выяснил, что при запуске программы эти функции не портят алиас, но потом при открытии базы (стандартное открытие и создание индексов),
начинается чехарда с этим алиасом, после вывода на экран - теряется алиас.
Где и что происходит - не понимаю ?

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2487
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 12.09.25 09:35. Заголовок: Всем кому это интересно...


Выложил новую сборку 25.09

Смотрите список изменений этой версии в файле doc\changelog.txt

Стандартная версия click here

ПРО-версия (архив под паролем) click here

Желаю всем хорошего дня!


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8041
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.09.25 22:48. Заголовок: Обратите внимание на..


Обратите внимание на пример - SAMPLES\Advanced\Tsb_array_report
Проба одного расчёта разными методами.
Отчёт по базе 2 млн. записей (1404 Мб. на диске HDD) считается за:  
SCOPE - время счёта 00:00:10.711 (10 секунд) - потрясающая скорость
DoWhile -> Array - время счёта 00:00:57.393 - это тоже отличная скорость
SCOPE + FILTER - время счёта 00:02:02.459
Условная индексация - время счёта 01:08:17.608


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4798
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.09.25 12:01. Заголовок: gfilatov2002 Может ..


gfilatov2002
Может вместо
STATIC PROCEDURE AddIfUnique( aList, cName )
сделать (полезная ф-я)
 
*-----------------------------------------------------------------------------*
FUNCTION HMG_AddIfUnique( aList, cName )
*-----------------------------------------------------------------------------*
IF ! Empty( cName ) .AND. AScan( aList, cName, , , .T. ) == 0
AAdd( aList, cName )
RETURN .T.
ENDIF

RETURN .F.


Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2488
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 13.09.25 12:07. Заголовок: SergKis пишет: Може..


SergKis пишет:

 цитата:
Может вместо
STATIC PROCEDURE AddIfUnique( aList, cName )
сделать


Да, конечно.
Благодарю за предложение

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4799
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.09.25 12:12. Заголовок: и еще добавить в h_d..


и еще добавить в h_dbf_aux
*-----------------------------------------------------------------------------*
FUNCTION HMG_ConvertType( uVal, cTypeDst )
*-----------------------------------------------------------------------------*
RETURN ConvertType( uVal, cTypeDst )

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4800
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.09.25 12:33. Заголовок: gfilatov2002 На ftp..


gfilatov2002
На ftp положил предложение, комментарий в demo.prg

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4801
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.09.25 16:01. Заголовок: gfilatov2002 Можно ..


gfilatov2002
Можно сделать в ф-ях:
SetProperty( Arg1 , ... )
GetProperty( Arg1 , ... )
DoMethod ( Arg1 , ... )
Default Arg1 := _HMG_ThisFormName
Для использования в блоках кода, получаемых b := &("{|| ... }"), т.к. имя тек. формы не известно - получается динамически от FormName := HMG_GetUniqueName("..."), например

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2489
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 14.09.25 17:01. Заголовок: SergKis пишет: Defa..


SergKis пишет:

 цитата:
Default Arg1 := _HMG_ThisFormName


Думаю, это можно записать таким образом:

 цитата:

IF ! Empty( _HMG_ThisFormName )
Default Arg1 := _HMG_ThisFormName
ENDIF


Благодарю за предложение

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4802
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.09.25 17:52. Заголовок: gfilatov2002 пишет I..


gfilatov2002 пишет
 цитата:
IF ! Empty( _HMG_ThisFormName )


Это не имеет смысла, т.к. пишем SetProperty(, ...), т.е. будет прерывание при Empty( _HMG_ThisFormName ) и не заданном Arg1, надо использовать SET WINDOW THIS TO ... до исп. SetProperty(, ...). использование в оконных событиях и при _wPost(...), _wSend(...) событиях все будет ok!

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2490
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 14.09.25 18:02. Заголовок: SergKis пишет: Это ..


SergKis пишет:

 цитата:
Это не имеет смысла


Понял, спасибо за разъяснение.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4803
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.09.25 23:52. Заголовок: gfilatov2002 Внес и..


gfilatov2002
Внес изменения в hmg 25.09 (ранее на ftp давал, сейчас свежие), положил на ftp, MDI пока не трогал
В demo.prg варианты использования.
Default Arg1 := _HMG_ThisFormName сделал

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4804
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.09.25 19:39. Заголовок: gfilatov2002 Положи..


gfilatov2002
Положил расширенный вариант примера на ftp

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2491
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 15.09.25 22:25. Заголовок: SergKis пишет: Поло..


SergKis пишет:

 цитата:
Положил расширенный вариант примера


OK

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4805
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.09.25 07:21. Заголовок: gfilatov2002 Предло..


gfilatov2002
Предложение добавить
 
SetProperty( Arg1 , ... )
...
Default Arg1 := _HMG_ThisFormName

IF PCount() > 3
Default Arg2 := _HMG_ThisControlName
ENDIF

...
GetProperty( Arg1 , ... )
DoMethod ( Arg1 , ... )
...
Default Arg1 := _HMG_ThisFormName

IF PCount() > 2
Default Arg2 := _HMG_ThisControlName
ENDIF

...
для вариантов
...
ON MOUSEHOVER {|| SetProperty(,, 'Backcolor', GetProperty(,, 'Cargo', aBtnBClr2)) , SetProperty(,, 'Fontcolor', GetProperty(,, 'Cargo', aBtnFClr2)) } ;
ON MOUSELEAVE {|| SetProperty(,, 'Backcolor', GetProperty(,, 'Cargo', aBClr)), SetProperty(,, 'Fontcolor', GetProperty(,, 'Cargo', aFClr) } ;
...


Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2492
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 16.09.25 09:16. Заголовок: SergKis пишет: Пред..


SergKis пишет:

 цитата:
Предложение добавить


Принято.
Благодарю за помощь

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8042
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 16.09.25 10:59. Заголовок: Andrey пишет: Верси..


Andrey пишет:

 цитата:
Версия МиниГуи 25.06Pro
MsgDebug() портит текущий АЛИАС базы !!!


Разобрался с такой ошибкой !
Если в ТСБ назначить клавиши F3, F4, ... на не существующие события на окне, то происходит такая фигня.
Лечится только перепроверкой своего кода.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4806
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.09.25 19:31. Заголовок: gfilatov2002 Положил..


gfilatov2002
Положил на ftp вариант и для MDI с примерами

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4807
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 19.09.25 06:48. Заголовок: gfilatov2002 Предло..


gfilatov2002
Предложение отключать VerifyControlDefined(), возникающая ошибка, достаточно, понятна и без доп. контроля
 
STATIC s_lVerifyControl := .T.
...
FUNCTION GetProperty ( Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7 , Arg8 )
...
LOCAL cHeader, nAlignHeader, cFooter, nAlingFooter, nState

IF IsLogical( Arg1 ) ; RETURN s_lVerifyControl
ENDIF

Default Arg1 := _HMG_ThisFormName
...
PROCEDURE SetProperty( Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7 , Arg8 )
...
LOCAL cMacro, cProc
#endif

IF IsLogical( Arg1 ) ; s_lVerifyControl := Arg1 ; RETURN
ENDIF

Default Arg1 := _HMG_ThisFormName
...
STATIC PROCEDURE VerifyControlDefined ( cParentName , cControlName )
*-----------------------------------------------------------------------------*

IF s_lVerifyControl .AND. ! Empty ( cControlName ) ;
.AND. ! _IsControlDefined ( cControlName , cParentName )
MsgMiniGuiError ( "Control: " + cControlName + " Of " + cParentName + " Not defined." )
ENDIF

RETURN


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4808
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.09.25 08:03. Заголовок: PS. В готовом модул..


PS.
В готовом модуле, такая проверка не нужна (лишняя), в ini всегда можно иметь настройку
[COM]
...
lVerifyControl = .T. ; .T. - ON , .F. - OFF
...
и команду SetProperty(App.Cargo:oIni:COM:lVerifyControl) в INIT PROCEDURE ...

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2493
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 20.09.25 15:34. Заголовок: SergKis пишет: В го..


SergKis пишет:

 цитата:
В готовом модуле, такая проверка не нужна (лишняя)


Переписал эту функцию таким образом:

 цитата:
 
*-----------------------------------------------------------------------------*
STATIC PROCEDURE VerifyControlDefined ( cParentName , cControlName )
*-----------------------------------------------------------------------------*

IF Set( _SET_DEBUG ) .AND. !Empty ( cControlName ) .AND. !_IsControlDefined ( cControlName , cParentName )
MsgMiniGuiError ( "Control: " + cControlName + " Of " + cParentName + " Not defined." )
ENDIF

RETURN


Теперь можно управлять этой функцией с помощью установки отладочного режима в приложении:

 цитата:
AltD( 1 )



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4809
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.09.25 17:43. Заголовок: gfilatov2002 пишет A..


gfilatov2002 пишет
 цитата:
AltD(1)


Это немного не то. Если на окне ~50 LABEL+GETBOX, то будет поиск по списку контролов, как минимум, 2-а раза
1. VerifyControlDefined ( cParentName , cControlName )
2. Для запрошенного действия над контролом.
И это может быть не единственное окно и список контролов достаточно большой.
В отлаженной программе 1-ый пункт не нужен - лишний прогон поиска, по мне, это приобретение ф-ии не лучшее.
В версии hmg от 2012 года не было VerifyControlDefined (...) совсем и все OK!
сообщения будут ~ такими, достаточно однотипными, что для отлаженной программы (редкое срабатывание)
 
Error BASE/1132 Переполнение массива: Неверное количество аргументов
Args:
[1] = A { ... } length: 24
[2] = N 0


Called from _SETVALUE(287) in module: h_controlmisc.prg
Called from SETPROPERTY(4397) in module: h_controlmisc.prg
Called from (b)MAIN(124) in module: demo.prg
...

вполне читаемо

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2494
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 20.09.25 17:57. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
можно управлять этой функцией с помощью установки отладочного режима


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

 цитата:
AltD(1)



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4810
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.09.25 18:10. Заголовок: gfilatov2002 Если н..


gfilatov2002
Если нет AltD(1), то нет и проверки, я так понял, но у меня НИКОГДА нет режима AltD, команды такой в коде. И на своем PC при разработке VerifyControl удобна в отладке (есть вызов, нет его - не важно), а на PC клиента уже она лишняя.
Т.е. надо вставлять в INIT PROCEDURE ... AltD( App.Cargo:oIni:nVerifyControl ) ?
Где nVerifyControl = 0\1

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2495
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 20.09.25 18:15. Заголовок: SergKis пишет: надо..


SergKis пишет:

 цитата:
надо вставлять в INIT PROCEDURE ... AltD( App.Cargo:oIni:nVerifyControl ) Где nVerifyControl = 0\1


Да, верно.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4812
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.09.25 18:23. Заголовок: gfilatov2002 А прим..


gfilatov2002
А применение AltD(0\1) разве не тащит лишние объектники в модуль, для реализации своих решений ?
А при таком решении будет тащить всегда, раньше были рекомендации, не включать в конечную программу эти модули.
Были какие то решения о динамическом переводе режима 0 в режим 1 и получении всей информации о программе у клиента.

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2496
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 20.09.25 18:36. Заголовок: SergKis пишет: разв..


SergKis пишет:

 цитата:
разве не тащит лишние объектники в модуль


Нет, конечно.
Вот эта функция из исходников Харбора:

 цитата:
 
#define ALTD_DISABLE 0
#define ALTD_ENABLE 1

PROCEDURE AltD( nAction )

IF PCount() == 0

ELSEIF HB_ISNUMERIC( nAction )

SWITCH nAction
CASE ALTD_DISABLE
Set( _SET_DEBUG, .F. )
EXIT
CASE ALTD_ENABLE
Set( _SET_DEBUG, .T. )
EXIT
ENDSWITCH

ENDIF

RETURN



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4813
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.09.25 18:55. Заголовок: gfilatov2002 :sm36..


gfilatov2002
AltD(0)

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4814
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.25 23:50. Заголовок: gfilatov2002 Положи..


gfilatov2002
Положил вариант примера basic\mdi_2 на ftp

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2499
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 23.09.25 15:34. Заголовок: Благодарю за поправк..


Благодарю за поправки в функции _TBrowse()

P.S. Добавил пропущенный второй параметр при определении кодового блока

 цитата:
 
{|ob,op| _TBrowse_bAdjColumns(ob,op) }



Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4815
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.09.25 16:53. Заголовок: gfilatov2002 пишет Д..


gfilatov2002 пишет
 цитата:
Добавил пропущенный второй параметр



Нашел неточность в _TBrowse
 
...
IF HB_ISARRAY( oParam:aFont )
IF Len( oParam:aFont ) < 5
ASize( oParam:aFont, 5 )
ENDIF
FOR i := 1 TO Len( oParam:aFont )
IF Empty( oParam:aFont[ i ] ) ; oParam:aFont[ i ] := oParam:aFont[ 1 ]
ENDIF
NEXT
ELSE
...


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4816
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.09.25 13:51. Заголовок: gfilatov2002 Предло..


gfilatov2002
Предложение (множественное выполнение блоков кода в ::bOnDrawLine)
 
METHOD DrawLine( xRow, lDrawCell ) CLASS TSBrowse
...
IF ::bOnDrawLine != NIL
IF IsArray( ::bOnDrawLine )
FOR nI := 1 TO Len( ::bOnDrawLine )
IF IsBlock( ::bOnDrawLine[ nI ] )
IF ! Empty( Eval( ::bOnDrawLine[ nI ], Self, xRow ) )
RETURN Self
ENDIF
ENDIF
NEXT
ELSEIF ! Empty( Eval( ::bOnDrawLine, Self, xRow ) )
RETURN Self
ENDIF

ENDIF
/*
IF ::bOnDrawLine != NIL
IF ! Empty( Eval( ::bOnDrawLine, Self, xRow ) )
RETURN Self
ENDIF
ENDIF
*/
...
METHOD DrawSelect( xRow, lDrawCell ) CLASS TSBrowse
...
IF ::bOnDrawLine != NIL
IF IsArray( ::bOnDrawLine )
FOR nI := 1 TO Len( ::bOnDrawLine )
IF IsBlock( ::bOnDrawLine[ nI ] )
IF ! Empty( Eval( ::bOnDrawLine[ nI ], Self, xRow ) )
RETURN Self
ENDIF
ENDIF
NEXT
ELSEIF ! Empty( Eval( ::bOnDrawLine, Self, xRow ) )
RETURN Self
ENDIF

ENDIF
/*
IF ::bOnDrawLine != NIL
IF ! Empty( Eval( ::bOnDrawLine, Self, xRow ) )
RETURN Self
ENDIF
ENDIF
*/
...

Другие предложения и примеры положил на ftp

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2500
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 26.09.25 14:15. Заголовок: SergKis пишет: Пред..


SergKis пишет:

 цитата:
Предложение


Большое спасибо за эти дополнения.
Обязательно посмотрю новые примеры с подключением третьей базы.

P.S. Все изменения приняты, примеры 8 и 9 стали компактными.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4817
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.09.25 23:05. Заголовок: gfilatov2002 Добави..


gfilatov2002
Добавил назначение событий нажатий кнопок мышки, положил на ftp

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4818
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.09.25 11:31. Заголовок: gfilatov2002 Неболь..


gfilatov2002
Небольшая правка
 
METHOD CellMarginLeftRight( nJ, cData, oColumn, nAlign, lMultiLine, nOut ) CLASS TSBrowse
...
IF HB_ISCHAR( cBuf ) .AND. Len( cBuf ) > 0
DEFAULT cData := ""
DEFAULT lMultiLine := CRLF $ cData

IF lMultiLine
...


Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2501
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 27.09.25 15:56. Заголовок: SergKis пишет: прав..


SergKis пишет:

 цитата:
правка


OK
Благодарю за дополнения

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4819
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.09.25 22:48. Заголовок: gfilatov2002 Еще не..


gfilatov2002
Еще небольшая правка h_controlmisc2.prg
 
STATIC FUNCTION _TBrowse_bBody( ob, op )
...
IF IsArray( aCol ) .and. Len( aCol ) > 0
a := {}
FOR EACH cCol IN aCol
nCol := iif( IsChar(cCol), ob:nColumn( cCol, .T. ), cCol )
IF nCol > 0 ; AAdd(a, nCol)
ENDIF

NEXT
IF Len( a ) > 0 ; ob:HideColumns( a, .T. ) ; DO EVENTS
ENDIF
ENDIF


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4820
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.09.25 10:00. Заголовок: gfilatov2002 На ftp..


gfilatov2002
На ftp положил пример, по использованию, на основе примера от Андрея

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2502
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 28.09.25 10:39. Заголовок: SergKis пишет: поло..


SergKis пишет:

 цитата:
положил пример, по использованию


Большое спасибо

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4821
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.09.25 12:40. Заголовок: gfilatov2002 Еще пр..


gfilatov2002
Еще правка и пример с ее использованием положил
 
STATIC FUNCTION _TBrowse_Create( oParam, uAlias, cBrw, nY, nX, nW, nH )
...
IF IsArray( oParam:aSizeLen ) .and. Len( oParam:aSizeLen ) > 0
j := Len( oParam:aSizeLen )

oParam:aSize := array( j ) ; AFill( oParam:aSize, 10 )
...


Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2503
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 28.09.25 14:05. Заголовок: SergKis пишет: Еще ..


SergKis пишет:

 цитата:
Еще правка


OK

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4823
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 02.10.25 10:40. Заголовок: gfilatov2002 Предло..


gfilatov2002
Предложение добавить параметры (для вариантов работы без препроцессора в блоках кода)
 
FUNCTION _DoControlEventProcedure ( bBlock, i, cEventType, nParam, nParam2 )
...
IF _HMG_BeginWindowActive == .F. .OR. !( hb_defaultValue( cEventType, '' ) == 'CONTROL_ONCHANGE' ) .OR. _HMG_MainClientMDIHandle != 0

#ifdef _OBJECT_
i := _WindowObj( _HMG_aFormHandles[ _HMG_ThisFormIndex ] )
#endif

lRetVal := Eval ( bBlock, hb_defaultValue( nParam, 0 ), nParam2, _HMG_ThisControlName, i )
ENDIF
...
FUNCTION _DoWindowEventProcedure ( bBlock, i, cEventType )
...
#ifdef _OBJECT_
i := _WindowObj( _HMG_aFormHandles[ _HMG_ThisFormIndex ] )
#endif

lRetVal := Eval ( bBlock, _HMG_ThisFormName, i )
...

PS. Положил на ftp примеры с _TBrowse(...), возможно, будут интересны, использованы расчеты размеров от фонта, т.е. App.Object, можно менять размер фонта, переменные cFont := "Arial", nSize := 12

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2506
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 02.10.25 12:33. Заголовок: SergKis пишет: Пред..


SergKis пишет:

 цитата:
Предложение добавить параметры


Это, конечно, возможно.
Но я не понял, почему в функции _DoControlEventProcedure() использовано

 цитата:

i := _WindowObj( _HMG_aFormHandles[ _HMG_ThisFormIndex ] )


а не

 цитата:

i := _ControlObj( _HMG_ThisControlName, _HMG_ThisFormName )




Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4824
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 02.10.25 12:44. Заголовок: gfilatov2002 пишет п..


gfilatov2002 пишет
 цитата:
почему в функции _DoControlEventProcedure() использовано


Дело в том, что не все контролы имеют объект (например, CheckLabel не имеет, перекрылись по месту хранения handle), а усложнять код с объектами не оч. хотелось. Получить объект можно внутри блока кода, через объект окна, т.е. oc := ow:GetObj(cControlName), поэтому i := _ControlObj( _HMG_ThisControlName, _HMG_ThisFormName ) не использовал

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2507
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 02.10.25 12:59. Заголовок: SergKis пишет: не в..


SergKis пишет:

 цитата:
не все контролы имеют объект


Понял, принято.
Благодарю за пояснение.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4825
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 03.10.25 21:54. Заголовок: gfilatov2002 пишет п..


gfilatov2002 пишет
 цитата:
принято


С этой правкой получился простой анализ работы с фокусами контролов в блоке, т.е. проверяем на NIL
ON GOTFOCUS {|p1,p2,cnm,ind| p1 := iif( ind == NIL, "Нельзя работать", "Можно работать"), ... } ;
ON LOSTFOCUS {|p1,p2,cnm,ind| p1 := iif( ind == NIL, "Нельзя работать", "Можно работать"), ... }
так же поступаем с фокусами окон
ON GOTFOCUS {|cnm,ind,p1| p1 := iif( ind == NIL, "Нельзя работать", "Можно работать"), ... } ;
ON LOSTFOCUS {|cnm,ind,p1| p1 := iif( ind == NIL, "Нельзя работать", "Можно работать"), ... }

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8052
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 05.10.25 15:09. Заголовок: Григорий, как из сво..


Григорий, как из своей программы изменить цвета Program error ?
Я задаю свои функции Alert*() на базе твоих...



Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2508
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 05.10.25 19:50. Заголовок: Andrey пишет: как и..


Andrey пишет:

 цитата:
как из своей программы изменить цвета Program error


Сейчас эти цвета задаются в ядре без возможности их изменения извне.
Но, конечно, возможно добавить логику для их задания пользователем.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8053
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 05.10.25 22:14. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Но, конечно, возможно добавить логику для их задания пользователем.


Сделайте пожалуйста !

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4828
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.10.25 23:46. Заголовок: gfilatov2002 Положи..


gfilatov2002
Положил ftp предложение по :FilterFTS(...) для массива

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2509
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 08.10.25 10:11. Заголовок: SergKis пишет: пред..


SergKis пишет:

 цитата:
предложение по :FilterFTS(...) для массива


OK
Благодарю за помощь

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4829
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 08.10.25 20:49. Заголовок: gfilatov2002 положи..


gfilatov2002
положил yf ftp предложение и пример по :FilterFTS(...)

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4830
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 08.10.25 21:10. Заголовок: gfilatov2002 Возьми..


gfilatov2002
Возьмите пример еще раз, забыл проверить его на фонты 12, 14, 16 размера

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4831
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 08.10.25 21:26. Заголовок: gfilatov2002 Предло..


gfilatov2002
Предложение добавить в :FilterFTS() улучшить обработку логических полей
 
METHOD FilterFTS_Line( cFind, lUpper, lAll ) CLASS TSBrowse
...
IF lAll .AND. ! HB_ISCHAR( xVal )
IF HB_ISLOGICAL( xVal )
xVal := iif( xVal, ".T.", ".F." )
ELSE
xVal := cValToChar( xVal )
ENDIF

ENDIF
...
и соответственно в :CalcTotal() сделать так же
IF lAll .AND. ! HB_ISCHAR( xVal )
IF HB_ISLOGICAL( xVal )
xVal := iif( xVal, ".T.", ".F." )
ELSE
xVal := cValToChar( xVal )
ENDIF

ENDIF

тогда в примерах ловятся значения поля MARRIED на .t.\.f.

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2510
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 08.10.25 21:36. Заголовок: SergKis пишет: Calc..


SergKis пишет:

 цитата:
CalcTotal()


Увы, использование этого метода перемещает указатель на второй элемент массива при нажатии мышкой на пустой Getbox.
Если, убрать вызов :CalcTotal(), то указатель остается на первом элементе массива после отработки метода FilterFTS() .
Можно это поправить

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4832
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 08.10.25 22:15. Заголовок: gfilatov2002 пишет М..


gfilatov2002 пишет
 цитата:
Можно это поправить


Заменить ::DrawFooters() на ::Refresh()
 
METHOD CalcTotal(cTotal, cNoTotal, lDraw) CLASS TSBrowse
...
NEXT
//::DrawFooters()
::Refresh(.F.)
DO EVENTS

PS.
Положил на ftp доработанные примеры

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2511
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 09.10.25 09:23. Заголовок: SergKis пишет: Поло..


SergKis пишет:

 цитата:
Положил на ftp доработанные примеры


Большое спасибо за оперативность!
Примеры работают нормально.

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2512
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 09.10.25 10:43. Заголовок: Всем, кому это интересно...


Выложил новую сборку 25.10

Стандартная версия click here

ПРО-версия (архив под паролем) click here

В эту сборку были добавлены все последние предложения Сергея вместе с поясняющими примерами.

Желаю всем хорошего дня!

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 206
Зарегистрирован: 15.09.05
ссылка на сообщение  Отправлено: 10.10.25 11:07. Заголовок: Вопрос по ООП


Как использовать свою версию метода FilterFTS_Line не трогая библиотеку?
Я не силен в ООП. Хочу сделать поиск по несколькими словами.

У себя я не запускаю фильтр при каждом нажатии клавиши, а при наличии SPACE в конце строки или при нажатии ENTER.

Моя модификация такая:
На примере Tsb_filter помоему работает многословный поиск со знаком .and. между словами.
 
// ============================================================================
// METHOD TSBrowse:FilterFTS_Line() by SergKis
// ============================================================================

METHOD FilterFTS_Line( cFind, lUpper, lAll ) CLASS TSBrowse

LOCAL nCol, oCol, xVal, lRet := .F., n, aFind, lFind
DEFAULT lUpper := .T., lAll := .F.

FOR nCol := 1 TO Len( ::aColumns )
oCol := ::aColumns[ nCol ]
IF nCol == 1 .AND. ::lSelector ; LOOP
ELSEIF ! oCol:lVisible ; LOOP
ELSEIF oCol:lBitMap ; LOOP
ENDIF
xVal := ::bDataEval( oCol, , nCol )
IF lAll .AND. ! HB_ISCHAR( xVal )
xVal := cValToChar( xVal )
ENDIF
IF HB_ISCHAR( xVal )
aFind := hb_ATokens(cFind)
FOR n := 1 TO len(aFind)

IF lUpper
lFind := aFind[n] $ Upper( xVal )
ELSE
lFind := aFind[n] $ xVal
ENDIF
lRet := lFind
IF ! lFind
EXIT
ENDIF
NEXT

IF lRet
EXIT
ENDIF
ENDIF
NEXT

RETURN lRet


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4833
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.10.25 13:15. Заголовок: sashaBG пишет работа..


sashaBG пишет
 цитата:
работает многословный поиск со знаком .and. между словами


Работает такой вариант, но он учтет и не нужный вариант, например cFind := "Краска белая"
"Краска матовая белая"
"Краска белая"
"Краска ... белая"
"Белая ... краска "
т.е. выбор не совсем тот, что просили, нужно указание разделителя в первых байтах, например, в своих поисках использовал алгоритм, если в 1-ом байте " ", то поиск на вхождение, если нет, то на точное равенство слева заданного. В данном случае можно поступить так же, если 1-ый байт " ", то ваш алгоритм aFind := hb_ATokens( Upper( alltrim(cFind) ) ), иначе, как сейчас

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4834
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.10.25 18:17. Заголовок: gfilatov2002 Попроб..


gfilatov2002
Попробовал добавить вариант от sashaBG в :FilterFTS с вкл. его алгоритма от наличия первого пробела в cFind, работает.
Сделал Скрытый текст

В примерах Advanced\Tsb_FilterFTS поправил
demo.prg 
...
b2 := {||
Local cVal := Trim( This.Value )
...
demo2.prg
...
oac:oBlk:b_2 := {||
Local cVal := Trim( This.Value )
...

Т.е. поиск в длинном тексте колонки с .and. работает в таком варианте

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2513
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.10.25 18:54. Заголовок: SergKis пишет: от н..


SergKis пишет:

 цитата:
от наличия первого пробела в cFind, работает


OK
У меня тоже работает. Но теперь надо объяснять пользователям насчет использования первого пробела для поиска в длинных строках.
Это реально сделать

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4835
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.10.25 19:11. Заголовок: С Clipper87 такая фи..


С Summer87 такая фишка работала (как я писал выше про поиск $ или на ==) и всегда с новой версией все в один голос говорили, что бы это не менял. Так, что даже не знаю, что сказать Но убирается режим легко (на уровне разработчика), в примере, вместо Trim(cVal), ставим AllTrim(cVal)

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2514
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 10.10.25 19:23. Заголовок: SergKis пишет: все ..


SergKis пишет:

 цитата:
все в один голос говорили, что бы это не менял




Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4836
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 11.10.25 11:26. Заголовок: gfilatov2002 Andrey..


gfilatov2002
Andrey пишет (Пост N: 8052)
 цитата:
Григорий, как из своей программы изменить цвета Program error ?
Я задаю свои функции Alert*() на базе твоих...


gfilatov2002 пишет
 цитата:
Сейчас эти цвета задаются в ядре без возможности их изменения извне.


Предлагаю дать возможность разработчику делать свои окна вместо системных.
Для этого небольшая правка ErrorSys.prg
 
STATIC PROCEDURE ShowError( cErrorMessage, oError )
...
cMsg += iif( _lShowDetailError(), cErrorMessage, ErrorMessage( oError ) )

IF !Replicate(chr(9), 3) $ cMsg

IF ISLOGICAL( _HMG_lOnErrorStop ) .AND. _HMG_lOnErrorStop
...
ENDIF

ENDIF

ErrorLevel( 1 )

IF ISBLOCK( _HMG_bOnErrorExit )
Eval( _HMG_bOnErrorExit )
ENDIF
...
т.е. разработчик в своем модуле делает ~так (пример Tsb_2tsb\demo_e.prg)
...
Function Main()
...
LOCAL cTitl := " Mouse (Right, Left) click events"
cTitl += " - Version 0.2 (29.09.2025)"
cTitl += " Press key F1 for error"

...
ON KEY F1 ACTION iif( AlertYesNo("Make the program terminate with an error ?"), ;
This.Buff.SetFocus, )

ON KEY TAB ACTION {||
...
FUNCTION my_ErrorExit(cMsg,oErr,cTxt,cErr)

IF pCount() > 0
AlertStop(cErr)
cTxt := oErr
ENDIF

RETURN cMsg + Replicate(chr(9), 3) // отказываемся от показа окон ошибки hmg

PS. Или вводить переменную среды hmg для анализа ситуации, возможно просто вертуть .F. и проверить возврат в ErrorSys.prg

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2515
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 11.10.25 21:25. Заголовок: SergKis пишет: Пред..


SergKis пишет:

 цитата:
Предлагаю дать возможность разработчику делать свои окна вместо системных.


Такая возможность есть в библиотеке изначально.

Базовые примеры находятся в папках
Basic\Hmg_Error
Basic\Hmg_Error_2


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4837
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 11.10.25 21:58. Заголовок: gfilatov2002 пишет Т..


gfilatov2002 пишет
 цитата:
Такая возможность есть в библиотеке изначально


Подмена системы обработок ошибок (она существует давно с clipper времен), это несколько не то, что я предложил. Система обработок ошибок остается как есть, заменяем только окно вывода ошибки, которое часто вылазит за пределы экрана, искажается и хочется, как Андрею, покраску и фонты сменить в некоторых строках вывода, а может и не выдавать окно, просто вернув, например, .F.. Обработка ErrorLog.htm или тексты cErr можно отработать и в др. месте. Окно ошибки пугает user и вполне при сбое можно перезапустить модуль на прежнее окно работы, даже без сообщений, сморгнул экран для user и дальше работай

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 2000
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 11.10.25 23:40. Заголовок: SergKis пишет: Пре..


SergKis пишет:

 цитата:

Предлагаю дать возможность разработчику делать свои окна вместо системных.
Для этого небольшая правка ErrorSys.prg


Стесняюсь спросить, а зачем?
Пользователю насрать на красоту сообщения об ошибке, если разраб их обрабатывает, то и юзер эту красоту не увидит.
Если нужно о чем то предупредитт юзера, то у разраба полно способов нарисовать свое окно любое.
Errorsys открыт полностью, делай что хочешь, объект ошибки не бином Ньютона, чес слово не понял смысла зачем изобретать велосипед. А то становится похоже на мем, программа, работает ху*во, но ошибки показывает красиво

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8058
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.10.25 00:51. Заголовок: Haz пишет: Errorsys..


Haz пишет:

 цитата:
Errorsys открыт полностью, делай что хочешь,


Сделал правку его, прога у заказчика не всегда показывает ошибки, писал уже ранее - выдаёт ошибки, что нет фонта на окне и ошибка НЕ ТА, что привела к краху.
У меня работает без сбоев, у заказчика периодически вылетает.
Сам видел ошибку - на хорошем сервере - ошибка SELECT базы, хотя потом после перезапуска, прога работает без ошибок в этом месте программы.
Хрень получается...
Переключение между прогами 1С, Мозилой и Минигуи - непонятная штука,
особенно если у заказчика мало памяти.

Сейчас после замены на свой Alert*() вот такое окно:

Юзер будет в шоке. А если пришлет такую ошибку на телефон, то ни фига не видно !
Из-за этого и просил изменить цвета.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4838
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.10.25 06:48. Заголовок: Haz пишет Пользовате..


Haz пишет
 цитата:
Пользователю насрать на красоту сообщения об ошибке


Глубокое заблуждение, при приеме, вникают в каждую букву, не то что в окно, его вид, если заказчик серьезный.

 цитата:
Errorsys открыт полностью, делай что хочешь, объект ошибки не бином Ньютона, чес слово не понял смысла зачем изобретать велосипед


Сейчас так и есть, обработчик со времен Clipper5\VO, перенесенный в hb, таскается из проекта в проект. Зачем, если обработчик текущий в hmg устраивает ? Мешает, что нет возможности отключить окно конечное совсем или заменить его своим. Это и ограничивает свободу действий, именно, как разработчика систем. Предложение совсем копеечное, обработать спец. символы или .T.\.F. в имеющейся, готовой системе обработок ошибок, кому не нужно - даже не заметит этого

 цитата:
А то становится похоже на мем, программа, работает ху*во, но ошибки показывает красиво


А если наоборот ? Программа работает красиво, а ошибки криво и это заложено по умолчанию, в стандарт, т.к. сейчас часто Alert окно искажено, т.е. тексты уходят вправо за экран и вниз, а кнопка <OK> поверх текста

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 2002
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 12.10.25 09:14. Заголовок: SergKis пишет: ошиб..


SergKis пишет:

 цитата:
ошибки криво и это заложено по умолчанию, в стандарт, т.к. сейчас часто Alert окно искажено, т.е. тексты уходят вправо за экран и вниз, а кнопка <OK> поверх текста


Так я о том, что все строится на объекте ошибки и инструментария создать свою обработку и тем более раскрасить ее по своему вкусу предостаточно.
На вкус и цвет все фломастеры разные и в некоторых интерфейсах Алерт выглядит как красная тряпка перед быком, тем более со стеком вызова процедур при виде которого пользователь не понимает ровным счётом ничего
Если не устраивает стандартная процедура обработки, делаем свою с подробным протоколом и автоматической отправкой разработчику, если нужно предупредить пользователя вывешиваем флаг с лозунгами что уже знаем и работаем. Тем более , что информация об ошибке стандартным обработчиком иногда ни о чем. К примеру при открытом через ole excel читается текстовой файл параметров и если файла нет выдаёт discspace(0) при сотнях гигов свободного места
Уже как то обсуждали , и мое мнение нужно не окно на пол экрана со стеком в цветах африканского авангарда,а удобный инструмент логирования ошибки, оправки лога разработчику и удобный вьюер этого лога. Пользователю достаточно обычного окна с уведомлениями о том что ситуация контролируется.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4839
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.10.25 10:15. Заголовок: Haz пишет Если не ус..


Haz пишет
 цитата:
Если не устраивает стандартная процедура обработки, делаем свою с подробным протоколом и автоматической отправкой разработчику


УСТРАИВАЕТ ! Кроме окна сообщения MsgStop() или Alert и ничего лишнего не надо, все есть в параметрах пользовательского блока кода, что и куда девать это совсем др. вопрос

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8059
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.10.25 12:01. Заголовок: Haz пишет: Уже как ..


Haz пишет:

 цитата:
Уже как то обсуждали , и мое мнение нужно не окно на пол экрана со стеком в цветах африканского авангарда,а удобный инструмент логирования ошибки, оправки лога разработчику


Да это нужная вещь в программе.
Сделал с помощью Сергея, недавно похожее, в новой версии МиниГуи пример - \SAMPLES\Advanced\Tsb_EventLog
Запись ошибки и действий пользователя в dbf-файл.
 Журнал событий в программе - запись действий пользователей в программе. 
Статистика выполнения(события программы) по операторам за периоды времени - кнопка "F5 Отчёты".
События программы - справочник смотреть/добавлять: user2log.prg функция EVENTS_Dim().
Аварийная ошибка в программе - смотреть модуль: demo.prg
_HMG_bOnErrorInit := {|cMsg,oErr,cTxt,cErr| my_ErrorExit(cMsg,oErr,cTxt,cErr) }
_HMG_bOnErrorExit := {| | my_ErrorExit() }
Сама функция в demo_ErrorLog.prg


Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2516
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 12.10.25 12:49. Заголовок: Andrey пишет: Из-за..


Andrey пишет:

 цитата:
Из-за этого и просил изменить цвета.


Проблема с цветами сообщения об ошибке уже решена.
Сейчас возможно настроить все цвета в этом сообщении.

SergKis пишет:

 цитата:
сейчас часто Alert окно искажено, т.е. тексты уходят вправо за экран и вниз, а кнопка <OK> поверх текста


Эту проблему тоже решил.

Благодарю всех за это полезное обсуждение

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4840
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.10.25 16:58. Заголовок: gfilatov2002 пишет П..


gfilatov2002 пишет
 цитата:
Проблема с цветами сообщения об ошибке уже решена.
Сейчас возможно настроить все цвета в этом сообщении


Это хорошо
Но обработка ошибок, это одно, а вывод их на устройства (диск, console, gui), это другое, как и то куда девать данные об ошибке

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4842
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.10.25 21:59. Заголовок: gfilatov2002 Правка..


gfilatov2002
Правка в :FilterFTS() небольшая
 
METHOD FilterFTS( cFind, lUpper, lBottom, lFocus, lAll ) CLASS TSBrowse
...
FOR EACH aLine IN ::aArray
...
IF nCol == 1 .AND. ::lSelector ; LOOP
ELSEIF !Empty(oCol:cName) .and. oCol:cName == "ARRAYNO" ; LOOP

ELSEIF ! oCol:lVisible ; LOOP
...
METHOD FilterFTS_Line( cFind, lUpper, lAll ) CLASS TSBrowse
...
IF nCol == 1 .AND. ::lSelector ; LOOP
ELSEIF !Empty(oCol:cName) .and. oCol:cName == "ORDKEYNO" ; LOOP

ELSEIF ! oCol:lVisible ; LOOP
ELSEIF oCol:lBitMap ; LOOP
ENDIF
...

стал работать, с наличием колонки oTsb:aNumber := ... в списке колонок

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2518
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 16.10.25 09:53. Заголовок: SergKis пишет: Прав..


SergKis пишет:

 цитата:
Правка в :FilterFTS()


OK.
Благодарю за помощь

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 187
Зарегистрирован: 12.07.06
ссылка на сообщение  Отправлено: 18.10.25 11:10. Заголовок: Ups!


Перешел с версии 25.03 на 25.10 и споткнулся на ровном месте.
Изменилась работа команды

UNCOMPRESS cName EXTRACTPATH Path_Dbf BLOCK {|cFile,nPos| ShowProgress(cFile,nPos,cForm)}

Теперь существующие в Path_Dbf файлы не переписываются из архива, хотя раньше всё работало.

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2520
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 18.10.25 13:47. Заголовок: alex_II пишет: Тепе..


alex_II пишет:

 цитата:
Теперь существующие в Path_Dbf файлы не переписываются из архива


Благодарю за сообщение!
Теперь при извлечении файлов используется флаг HB_FO_EXCL

 цитата:
create and open only if file doesn't exist


Если это критично для Вашей программы, то этот флаг можно убрать, и затем пересобрать библиотеку hbziparc.

P.S. Я уже сделал необходимые правки кода, чтобы восстановить предыдущий функционал команды UNCOMPRESS.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 188
Зарегистрирован: 12.07.06
ссылка на сообщение  Отправлено: 18.10.25 19:16. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
P.S. Я уже сделал необходимые правки кода, чтобы восстановить предыдущий функционал команды UNCOMPRESS.


Спасибо за разъяснение, а пока подожду на версии 25.03

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4843
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 20.10.25 20:18. Заголовок: gfilatov2002 Не бол..


gfilatov2002
Не большое предложение по :CalcTotal(...), использовать Picture колонки для вывода суммы итога в footer, если задан
 
METHOD CalcTotal( cTotal, cNoTotal, lDraw, lPicture ) CLASS TSBrowse
...
FOR nK := 1 TO nCols
oCol := ::aColumns[nK]
IF !aTot[nK] ; LOOP
ENDIF
IF Empty( aSum[nK] )
xVal := ""
ELSEIF !Empty( lPicture ) .and. !Empty( oCol:cPicture )
xVal := AllTrim( Transform( aSum[nK], oCol:cPicture ) )
ELSE
xVal := hb_ntos( aSum[nK] )
ENDIF

oCol:cFooting := xVal
NEXT
...

при lPicture := .T. в параметре
Может быть, надо сделать, Default lPicture := .T. , но не уверен в этом, т.е. можно без этого параметра делать
 
ELSEIF !Empty( lPicture ) .and. !Empty( oCol:cPicture )
xVal := AllTrim( Transform( aSum[nK], oCol:cPicture ) )

но остается вопрос, если колонка узкая и с oCol:cPicture не помещается, а без него (hb_ntos...) все ok!, а :cPicture задан ?

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2521
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 21.10.25 10:21. Заголовок: SergKis пишет: надо..


SergKis пишет:

 цитата:
надо сделать, Default lPicture := .T.


Принято с использованием этого параметра, как наиболее универсальный вариант.
Если задано oCol:cPicture, то эта установка в приоритете, с возможностью включить ее использование с помощью параметра lPicture := .T., который по умолчанию задан, как lPicture := .F.

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2524
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 01.11.25 15:56. Заголовок: Всем кому это интересно


Подготовил первый релиз-кандидат для ПРО-версии сборки 25.11

Кратко, что нового:
Скрытый текст

Пока я НЕ знаю, когда будет опубликован этот релиз...
Все зависит от интереса к этой работе у пользователей библиотеки.

Желаю всем хороших выходных.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8095
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 01.11.25 16:15. Заголовок: Да ! Новый релиз нуж..


Да ! Новый релиз нужен ! Ждем с не терпеньем !
Спасибо большое Григорий за твою огромную работу !

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2526
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 05.11.25 14:46. Заголовок: Andrey пишет: Новый..


Andrey пишет:

 цитата:
Новый релиз нужен


Я могу опубликовать новую сборку хоть завтра, но НЕ вижу большого интереса у пользователей библиотеки (кроме ОДНОГО человека ).

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 189
Зарегистрирован: 12.07.06
ссылка на сообщение  Отправлено: 06.11.25 05:41. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Да ! Новый релиз нужен ! Ждем с не терпеньем !
Спасибо большое Григорий за твою огромную работу !



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 190
Зарегистрирован: 12.07.06
ссылка на сообщение  Отправлено: 06.11.25 05:44. Заголовок: Andrey пишет: Да ! ..


Andrey пишет:

 цитата:
Да ! Новый релиз нужен ! Ждем с не терпеньем !
Спасибо большое Григорий за твою огромную работу !


Присоединяюсь.

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 2527
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 06.11.25 12:37. Заголовок: Выложил новую сборку..


Выложил новую сборку 25.11

Стандартная версия click here

ПРО-версия (архив под паролем) click here

Желаю всем хорошего дня!

Спасибо: 1 
ПрофильЦитата Ответить
постоянный участник




Пост N: 8102
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 06.11.25 21:50. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Выложил новую сборку 25.11


Что-то описания нет в ChangeLog.txt для:
1) Три способа скачивания файла с сайта - \SAMPLES\Advanced\Updating_program_from_website
На базе этого примера можно делать свою программу для обновления с сайта новых версий программы.
2) Работа с файлами Microsoft Access - \SAMPLES\Advanced\mg_Access
Спасибо БОЛЬШОЕ за новую версию !

Примеров libcurl-test(0.3).7z и Tsb_image_dbf(0.38).7z нет в библиотеке.
Хорошие же примеры, небольшие.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 207
Зарегистрирован: 15.09.05
ссылка на сообщение  Отправлено: Вчера 13:38. Заголовок: Про FilterFTS_Line


У меня предложение по FilterFTS_Line:

Сначало собрать строку, а потом в ней искать совпадения:
 

// ============================================================================
// METHOD TSBrowse:FilterFTS_Line() by SergKis
// ============================================================================

METHOD FilterFTS_Line( cFind, lUpper, lAll ) CLASS TSBrowse

LOCAL nCol, oCol, xVal,cRow:="", lRet := .F., aFind
DEFAULT lUpper := .T., lAll := .F.

IF Left( cFind, 1 ) == " "
aFind := hb_ATokens( substr( cFind, 2 ) )
ELSE
aFind := { cFind }
ENDIF

FOR nCol := 1 TO Len( ::aColumns )
oCol := ::aColumns[ nCol ]
IF nCol == 1 .AND. ::lSelector ; LOOP
ELSEIF !Empty(oCol:cName) .AND. oCol:cName == "ORDKEYNO" ; LOOP
ELSEIF ! oCol:lVisible ; LOOP
ELSEIF oCol:lBitMap ; LOOP
ENDIF
xVal := ::bDataEval( oCol, , nCol )
IF lAll .AND. ! HB_ISCHAR( xVal )
IF HB_ISLOGICAL( xVal )
xVal := iif( xVal, ".T.", ".F." )
ELSE
xVal := cValToChar( xVal )
ENDIF
ENDIF
IF HB_ISCHAR( xVal )
cRow += iif( lUpper, Upper( xVal ), xVal )
ENDIF
NEXT
FOR EACH cFind IN aFind
lRet := cFind $ cRow
IF !lRet
EXIT
ENDIF
NEXT
RETURN lRet


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4858
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: Вчера 14:25. Заголовок: sashaBG пишет Сначал..


sashaBG пишет
 цитата:
Сначало собрать строку, а потом в ней искать совпадения:


По мне, такой вариант сравнения не совсем, а может и совсем, не корректен, т.к. например, 2а последних символа одного поля + 2а первых символа следующего, дадут .T. для cFind, а это не так, по отдельности поля не совпадают с cFind. Возможно, для такого поиска надо применять метод :FilterData(cFilter, ...), т.к. в выражении cFilter можете определять для себя, какие поля идут слитно, а какие по отдельности или собрать строку по записи и проверить на вхождение заданного фрагмента

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 208
Зарегистрирован: 15.09.05
ссылка на сообщение  Отправлено: Вчера 16:35. Заголовок: Спасибо за ответ!


Нет возражений!
Попробую тогда через FilterData !

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 129 , стр: 1 2 3 4 5 6 7 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 23
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет