| Автор | Сообщение |
|
|
| модератор
|
Пост N: 699
Зарегистрирован: 25.05.05
|
|
Отправлено: 29.01.08 13:59. Заголовок: Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)
Начало темы находится здесь, а теперь АНОНС * АНОНС * АНОНС * АНОНС * АНОНС Готовится к опубликованию новая сборка №48, которая выйдет в конце недели. Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне Кратко, что нового: - исправление обнаруженных ошибок и неточностей кода; - новый класс HEADERIMAGE для Grid и Browse; - свойство Address в Hyperlink может теперь открывать папку или файл на диске; - добавлен NOTABSTOP класс для Browse; - поддержка пользовательских компонентов (заимствована из оффициального релиза); - расширения и исправления в библиотеках TsBrowse и PropGrid; - обновлены сборки Харбор и HMGS-IDE; - новые и обновленные старые примеры (как обычно  ).
|
 |

|
|
Ответов - 195
, стр:
1
2
3
4
5
6
7
8
9
10
All
[только новые]
|
|
|
|
| moderator
|
Пост N: 2465
Зарегистрирован: 11.02.10
|
|
Отправлено: 01.07.25 17:44. Заголовок: SergKis пишет: надо..
SergKis пишет: Поправил, пример отработал после этого нормально. Благодарю за помощь 
|
 |

|
|
|
| moderator
|
Пост N: 2466
Зарегистрирован: 11.02.10
|
|
Отправлено: 02.07.25 12:58. Заголовок: На английском форуме..
На английском форуме задали вопрос о том, как динамически изменить встроенный комбо при редактировании грида. Написал такую функцию и пример для проверки (см. ниже). Скрытый текст
#include "minigui.ch" /* * PROCEDURE Main * * Defines and activates the main window containing a grid and buttons for demonstration purposes. * * Purpose: * This procedure serves as the entry point for the grid demo application. It creates a main window with a grid control to display and edit data, and two buttons to manipulate the grid's content. * The grid demonstrates features like cell editing, column controls (textbox and combobox), and data justification. The buttons allow for dynamic modification of the combobox items and adding new rows to the grid. * This procedure showcases the capabilities of the HMG Extended grid control and provides a basic example of how to interact with it programmatically. * * Notes: * The Random(4) function used when adding a new item assumes a random number generator is available and seeded appropriately. */ PROCEDURE Main LOCAL nId DEFINE WINDOW m AT 0, 0 WIDTH 600 HEIGHT 400 TITLE 'Grid Demo' MAIN DEFINE GRID g ROW 10 COL 10 WIDTH 472 HEIGHT 200 HEADERS { "Name", "City", "Amount" } WIDTHS { 200, 150, 100 } celled .T. allowedit .T. COLUMNCONTROLS { { 'TEXTBOX', 'CHARACTER' }, { 'COMBOBOX', { 'A', 'B', 'C', 'D' } }, { 'TEXTBOX', 'NUMERIC', "999999.99" } } ITEMS { { "Person 1", 1, 1000 }, { "Person 2", 3, 2000 } } JUSTIFY { 0, 0, 1 } END GRID DEFINE BUTTON b1 ROW 230 COL 10 WIDTH 240 CAPTION "Replace inplaced combobox items" ACTION ReplaceGridEditComboItems( "g", "m", 2, { "FIRST", "SECOND", "THIRD", "FOURTH" } ) END BUTTON DEFINE BUTTON b2 ROW 260 COL 10 WIDTH 240 CAPTION "Add a new item in grid" ACTION ( nId := m.g.ItemCount, m.g.AddItem( { "Person " + hb_ntos( ++nId ), Random( 4 ), nId * 1000 } ) ) END BUTTON ON KEY ESCAPE ACTION thiswindow.release() END WINDOW m.CENTER m.ACTIVATE RETURN /* * FUNCTION ReplaceGridEditComboItems(cGridName, cWindowName, nColIndex, aNewItems) * * Replaces the items in the combobox control of a specific column within a grid. * * Parameters: * cGridName (CHARACTER): The name of the grid control. * cWindowName (CHARACTER): The name of the window containing the grid. * nColIndex (NUMERIC): The index of the column whose combobox items are to be replaced (1-based). * aNewItems (ARRAY): An array containing the new items to be displayed in the combobox. * * Returns: * NIL * * Purpose: * This function allows for the dynamic modification of the combobox items within a grid column. This is useful when the available options in a combobox need to change based on user input or other application logic. * The function retrieves the current cell values of the specified column, updates the combobox items in the internal control data structure, and then resets the cell values to refresh the display. * For example, you might use this function to update the list of available products in a combobox based on the selected category in another combobox. * * Notes: * This function relies on the internal HMG Extended data structures (_HMG_aControlMiscData1) to access and modify the combobox items. Changes to these internal structures in future versions of HMG Extended may break this function. * The function assumes that the specified column actually contains a combobox control. Calling this function on a column with a different control type will likely result in an error. * The cell values are stored in an array aCell to preserve the current selection of each combobox in the column. * The function uses GetControlIndex to find the index of the grid control within the window's control array. This index is then used to access the grid's internal data structures. */ FUNCTION ReplaceGridEditComboItems ( cGridName, cWindowName, nColIndex, aNewItems ) LOCAL i := GetControlIndex ( cGridName, cWindowName ) LOCAL nItemCount := GetProperty( cWindowName, cGridName, "ItemCount" ) LOCAL aCell := {}, ni LOCAL aEditcontrols := _HMG_aControlMiscData1[ i ][ 13 ] // Store the current cell values of the specified column in the aCell array. ni := 0 DO WHILE ni < nItemCount AAdd( aCell, GetProperty( cWindowName, cGridName, "Cell", ++ni, nColIndex ) ) ENDDO // Check if the column contains a combobox control. IF aEditControls[ nColIndex ][ 1 ] == "COMBOBOX" // Replace the combobox items with the new items. aEditControls[ nColIndex ][ 2 ] := aNewItems _HMG_aControlMiscData1[ i ][ 13 ] := aEditControls // Restore the cell values to refresh the display. ni := 0 DO WHILE ni < nItemCount SetProperty( cWindowName, cGridName, "Cell", ++ni, nColIndex, aCell[ ni ] ) ENDDO ENDIF RETURN NIL
|
|
 |

|
|
|
| постоянный участник
|
Пост N: 4771
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.07.25 13:35. Заголовок: А не проще формирова..
А не проще, формировать новый массив для комбо и помещать его новый адрес на место старого ? Это один запрос к базе\серверу ... Когда использовал GRID (правда очень давно не пользуюсь) так и делал, записей в комбо не много, как правило
|
 |

|
|
|
| moderator
|
Пост N: 2467
Зарегистрирован: 11.02.10
|
|
Отправлено: 02.07.25 13:43. Заголовок: SergKis пишет: форм..
SergKis пишет: | цитата: | | формировать новый массив для комбо и помещать его новый адрес на место старого |
| Да, именно так и сделано. Возможно, я не совсем понял, что значит помещать новый адрес на место старого. 
|
 |

|
|
|
| постоянный участник
|
Пост 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 ] для комбо
|
 |

|
|
|
| moderator
|
Пост N: 2468
Зарегистрирован: 11.02.10
|
|
Отправлено: 02.07.25 14:48. Заголовок: SergKis пишет: Прим..
SergKis пишет: Значит, я все понял правильно. Я использовал точно такой же алгоритм, и добавил перерисовку грида с новыми параметрами комбо. 
|
 |

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

|
|
|
| moderator
|
Пост N: 2469
Зарегистрирован: 11.02.10
|
|
Отправлено: 02.07.25 15:33. Заголовок: SergKis пишет: По м..
SergKis пишет: | цитата: | | По мне это пример, как не надо работать с комбо |
| Поддерживаю! SergKis пишет: | цитата: | | Комбо в GRID это оч. редко или совсем не меняемые справочники |
| Полностью согласен. P.S. Я просто ответил на вопрос на форуме... 
|
 |

|
|
|
| moderator
|
Пост N: 2470
Зарегистрирован: 11.02.10
|
|
Отправлено: 02.07.25 16:57. Заголовок: Всем кому это интересно...
Написал такой пример для проверки новой функции HMG_LISTTIMERS(). Скрытый текст
#include "minigui.ch" STATIC nTickCount := 0 // Counter to show timer is working /* * FUNCTION Main() * * Initializes the main application window and defines its controls. * * Purpose: * This is the entry point of the application. It creates the main window, * defines the buttons, labels, and edit box, and sets up their initial * properties and event handlers. The window is then centered and activated. * This function sets up the user interface for testing timer functionality. * * Notes: * The window definition includes buttons to start, stop, and list timers, * a label to display the tick count, and an edit box to display timer information. */ FUNCTION Main() DEFINE WINDOW Form_1 ; AT 0, 0 ; WIDTH 420 HEIGHT 340 ; TITLE "HMG_LISTTIMERS() Function Test" ; MAIN @ 20, 20 BUTTON btnStart ; CAPTION "Start Timer" ; WIDTH 100 HEIGHT 28 ; ACTION StartTimer() @ 20, 140 BUTTON btnStop ; CAPTION "Stop Timer" ; WIDTH 100 HEIGHT 28 ; ACTION StopTimer() @ 60, 20 BUTTON btnList ; CAPTION "List Timers" ; WIDTH 100 HEIGHT 28 ; ACTION ListTimers() @ 100, 20 LABEL lblCounter ; VALUE "Tick Count: 0" ; WIDTH 300 HEIGHT 24 @ 140, 20 EDITBOX edtOutput ; WIDTH 370 HEIGHT 140 ; NOHSCROLL ; READONLY END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 RETURN NIL /* * PROCEDURE OnTimer() * * Updates the tick count label on the main form. * * Purpose: * This procedure is called by the timer at a regular interval (defined in StartTimer()). * It increments the global tick counter (nTickCount) and updates the value of the * lblCounter label on the main form to display the current tick count. This provides * a visual indication that the timer is running. * * Notes: * The nTickCount variable is a global variable that is incremented each time the timer fires. */ PROCEDURE OnTimer() nTickCount++ Form_1.lblCounter.VALUE := "Tick Count: " + LTrim( Str( nTickCount ) ) RETURN /* * PROCEDURE StartTimer() * * Starts or creates a timer that calls the OnTimer() procedure. * * Purpose: * This procedure is called when the "Start Timer" button is clicked. It checks if a timer * named "Timer_1" already exists on the form. If it does, it enables the timer. If it * doesn't exist, it creates a new timer with an interval of 1000 milliseconds (1 second) * and sets its action to call the OnTimer() procedure. A message box is then displayed * to confirm that the timer has been started. * * Notes: * The IsControlDefined() function is used to check if the timer control already exists. */ PROCEDURE StartTimer() IF IsControlDefined( Timer_1, Form_1 ) Form_1.Timer_1.Enabled := .T. ELSE DEFINE TIMER Timer_1 PARENT Form_1 INTERVAL 1000 ACTION OnTimer() END TIMER ENDIF MsgInfo( "Timer started." ) RETURN /* * PROCEDURE StopTimer() * * Stops the timer if it is running. * * Purpose: * This procedure is called when the "Stop Timer" button is clicked. It retrieves a list of * currently active timers using the HMG_LISTTIMERS() function. If there is exactly one * timer in the list (presumably Timer_1), it disables the timer by setting its Enabled * property to .F.. A message box is then displayed to confirm that the timer has been stopped. * * Notes: * The HMG_LISTTIMERS() function returns an array of active timers. * The Enabled property of the timer control determines whether the timer is running or not. */ PROCEDURE StopTimer() LOCAL aTimers := HMG_LISTTIMERS() IF Len( aTimers ) == 1 Form_1.Timer_1.Enabled := .F. MsgInfo( "Timer stopped." ) ENDIF RETURN /* * FUNCTION ListTimers() * * Displays a list of currently active timers in the edit box on the main form. * * Purpose: * This function is called when the "List Timers" button is clicked. It retrieves a list of * currently active timers using the HMG_LISTTIMERS() function. If there are no active timers, * it displays a message indicating that. Otherwise, it iterates through the list of timers * and formats the timer information (window handle, timer ID, and interval) into a string. * This string is then displayed in the edtOutput edit box on the main form. * * Notes: * The HMG_LISTTIMERS() function returns an array of active timers. Each element in the array * is itself an array containing the timer's window handle, timer ID, and interval. */ FUNCTION ListTimers() LOCAL aTimers := HMG_LISTTIMERS() LOCAL cOutput := "" LOCAL i IF Len( aTimers ) == 0 cOutput := "No active timers." ELSE FOR i := 1 TO Len( aTimers ) cOutput += "Timer #" + LTrim( Str( i ) ) + CRLF cOutput += " hWnd : " + LTrim( Str( aTimers[ i ][ 1 ] ) ) + CRLF cOutput += " Timer ID : " + LTrim( Str( aTimers[ i ][ 2 ] ) ) + CRLF cOutput += " Interval : " + LTrim( Str( aTimers[ i ][ 3 ] ) ) + " ms" + CRLF + CRLF NEXT ENDIF Form_1.edtOutput.VALUE := cOutput RETURN NIL
| Вопрос: нужен ли такой пример в поставке библиотеки? 
|
 |

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

|
|
|
| moderator
|
Пост N: 2471
Зарегистрирован: 11.02.10
|
|
Отправлено: 03.07.25 09:31. Заголовок: Andrey пишет: пуска..
Andrey пишет: Спасибо за отклик! Ниже приведена окончательная версия этого примера: Скрытый текст
#include "minigui.ch" STATIC nTickCount := 0 // Counter to show timer is working /* * FUNCTION Main() * * Initializes the main application window and defines its controls. * * Purpose: * This is the entry point of the application. It creates the main window, * defines the buttons, labels, and edit box, and sets up their initial * properties and event handlers. The window is then centered and activated. * This function sets up the user interface for testing timer functionality. * * Notes: * The window definition includes buttons to start, stop, and list timers, * a label to display the tick count, and an edit box to display timer information. */ FUNCTION Main() DEFINE WINDOW Form_1 ; AT 0, 0 ; WIDTH 420 HEIGHT 340 ; TITLE "HMG_LISTTIMERS() Function Test" ; MAIN ; ON RELEASE OnReleaseResources() DEFINE STATUSBAR STATUSITEM "Ready" END STATUSBAR @ 20, 20 BUTTON btnStart ; CAPTION "Start Timer" ; WIDTH 100 HEIGHT 28 ; ACTION StartTimer() @ 20, 140 BUTTON btnStop ; CAPTION "Stop Timer" ; WIDTH 100 HEIGHT 28 ; ACTION StopTimer() @ 60, 20 BUTTON btnList ; CAPTION "List Timers" ; WIDTH 100 HEIGHT 28 ; ACTION ListTimers() @ 60, 140 BUTTON btnReset ; CAPTION "Reset Count" ; WIDTH 100 HEIGHT 28 ; ACTION ResetCounter() @ 100, 20 LABEL lblCounter ; VALUE "Tick Count: 0" ; WIDTH 300 HEIGHT 24 @ 140, 20 EDITBOX edtOutput ; WIDTH 370 HEIGHT 140 ; NOHSCROLL ; READONLY END WINDOW CENTER WINDOW Form_1 ACTIVATE WINDOW Form_1 RETURN NIL /* * FUNCTION OnReleaseResources() * * Releases the timer control when the form is closed. * * Purpose: * This function is called when the main form is closed (ON RELEASE event). * It checks if the Timer_1 control is defined on the form. If it is, it releases * the timer's resources to prevent memory leaks or other issues. * * Notes: * Releasing controls when they are no longer needed is good practice to ensure * efficient resource management. */ FUNCTION OnReleaseResources IF IsControlDefined( Timer_1, Form_1 ) Form_1.Timer_1.RELEASE ENDIF RETURN NIL /* * PROCEDURE OnTimer() * * Updates the tick count label on the main form. * * Purpose: * This procedure is called by the timer at a regular interval (defined in StartTimer()). * It increments the global tick counter (nTickCount) and updates the value of the * lblCounter label on the main form to display the current tick count. This provides * a visual indication that the timer is running. * * Notes: * The nTickCount variable is a global variable that is incremented each time the timer fires. */ PROCEDURE OnTimer() nTickCount++ Form_1.lblCounter.VALUE := "Tick Count: " + LTrim( Str( nTickCount ) ) RETURN /* * PROCEDURE StartTimer() * * Starts or creates a timer that calls the OnTimer() procedure. * * Purpose: * This procedure is called when the "Start Timer" button is clicked. It checks if a timer * named "Timer_1" already exists on the form. If it does, it enables the timer. If it * doesn't exist, it creates a new timer with an interval of 1000 milliseconds (1 second) * and sets its action to call the OnTimer() procedure. The status bar is updated to indicate * that the timer has been started. * * Notes: * The IsControlDefined() function is used to check if the timer control already exists. */ PROCEDURE StartTimer() IF IsControlDefined( Timer_1, Form_1 ) IF Form_1.Timer_1.Enabled Form_1.StatusBar.Item( 1 ) := "Timer already running" RETURN ELSE Form_1.Timer_1.Enabled := .T. ENDIF ELSE DEFINE TIMER Timer_1 PARENT Form_1 INTERVAL 1000 ACTION OnTimer() END TIMER ENDIF Form_1.StatusBar.Item( 1 ) := "Timer started" RETURN /* * PROCEDURE StopTimer() * * Stops the timer if it is running. * * Purpose: * This procedure is called when the "Stop Timer" button is clicked. It disables the timer * by setting its Enabled property to .F.. The status bar is updated to indicate whether * the timer was stopped or if there was no timer running. * * Notes: * The Enabled property of the timer control determines whether the timer is running or not. */ PROCEDURE StopTimer() IF IsControlDefined( Timer_1, Form_1 ) .AND. Form_1.Timer_1.Enabled Form_1.Timer_1.Enabled := .F. Form_1.StatusBar.Item( 1 ) := "Timer stopped" ELSE Form_1.StatusBar.Item( 1 ) := "No timer to stop" ENDIF RETURN /* * FUNCTION ListTimers() * * Displays a list of currently active timers in the edit box on the main form. * * Purpose: * This function is called when the "List Timers" button is clicked. It retrieves a list of * currently active timers using the HMG_LISTTIMERS() function. If there are no active timers, * it displays a message indicating that. Otherwise, it iterates through the list of timers * and formats the timer information (window handle, timer ID, and interval) into a string. * This string is then displayed in the edtOutput edit box on the main form. The status bar * is updated to show the number of timers listed. * * Notes: * The HMG_LISTTIMERS() function returns an array of active timers. Each element in the array * is itself an array containing the timer's window handle, timer ID, and interval. */ FUNCTION ListTimers() LOCAL aTimers := HMG_LISTTIMERS() LOCAL cOutput := "" LOCAL i IF Len( aTimers ) == 0 cOutput := "No active timers." ELSE FOR i := 1 TO Len( aTimers ) cOutput += "Timer #" + LTrim( Str( i ) ) + CRLF cOutput += " hWnd : " + LTrim( Str( aTimers[ i ][ 1 ] ) ) + CRLF cOutput += " Timer ID : " + LTrim( Str( aTimers[ i ][ 2 ] ) ) + CRLF cOutput += " Interval : " + LTrim( Str( aTimers[ i ][ 3 ] ) ) + " ms" + CRLF + CRLF NEXT ENDIF Form_1.edtOutput.VALUE := cOutput Form_1.StatusBar.Item( 1 ) := "Listed " + LTrim( Str( Len( aTimers ) ) ) + " timer(s)" RETURN NIL /* * PROCEDURE ResetCounter() * * Resets the tick counter to zero. * * Purpose: * This procedure is called when the "Reset Count" button is clicked. It resets the global * tick counter (nTickCount) to zero and updates the lblCounter label on the main form to * reflect the reset value. The status bar is also updated to indicate that the counter * has been reset. * * Notes: * The nTickCount variable is a global variable that is incremented by the timer. */ PROCEDURE ResetCounter() nTickCount := 0 Form_1.lblCounter.VALUE := "Tick Count: 0" Form_1.StatusBar.Item( 1 ) := "Counter reset" RETURN
|
|
 |

|
|
|
|
|
| постоянный участник
|
Пост 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 ...
|
 |

|
|
|
| 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" ) ), а показывает все активные таймеры, которые установлены в данный момент в программе.
|
 |

|
|
|
| постоянный участник
|
Пост N: 4776
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.07.25 11:40. Заголовок: gfilatov2002 пишет п..
gfilatov2002 пишет | цитата: | | показывает все активные таймеры |
| т.е. Enabled == .T. , а Enabled == .F. нет ? | цитата: | | функция HMG_LISTTIMERS() не привязана к конкретному окну |
| 
|
 |

|
|
|
| moderator
|
Пост N: 2473
Зарегистрирован: 11.02.10
|
|
Отправлено: 03.07.25 11:56. Заголовок: SergKis пишет: т.е...
SergKis пишет: | цитата: | | т.е. Enabled == .T. , а Enabled == .F. - нет |
| Именно так 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4777
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.07.25 14:55. Заголовок: gfilatov2002 пишет И..
gfilatov2002 пишет Это мало что дает, т.е. снимок не отражает картину, особенно, если таймеры короткие (100 - 300 мс) и они на время работы блока кода ставятся Enable := .F. и потом .T. (все таймеры исп. этот механизм)  Что то определить по таким данным ф-ии сложно. Возможно, надо, что бы ф-я возвращала все таймера назначенные в программе с их тек. соостоянием Enable ?
|
 |

|
|
|
| moderator
|
Пост N: 2474
Зарегистрирован: 11.02.10
|
|
Отправлено: 04.07.25 09:52. Заголовок: SergKis пишет: Что ..
SergKis пишет: | цитата: | | Что то определить по таким данным ф-ии сложно. |
| Так как основное использование этой функции - для отладки кода, то можно временно убрать Enable := .F. в режиме отладки. Но это уже вопросы конкретной реализации работы таймеров... 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4778
Зарегистрирован: 17.02.12
|
|
Отправлено: 04.07.25 10:42. Заголовок: gfilatov2002 пишет в..
gfilatov2002 пишет | цитата: | | временно убрать Enable := .F. в режиме отладки |
| Зачем такая канитель, тем более, что это для отладки (ставить Enable := .T. надо для каждого таймера, его блока кода) ? Проще получать весь список "TIMER" и иметь в массиве элемент Enabled для анализа, возможно, имя таймера и имя окна (дополнительно к handle) PS Такой массив можно использовать и для управления таймерами (включать\выключать их работу), а не только для отладки
|
 |

|
|
|
| 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. |
| - добавлены комментарии в код библиотеки и некоторых примеров.
|
 |

|
|
|
| постоянный участник
|
Пост N: 4779
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.07.25 18:48. Заголовок: gfilatov2002 Положи..
gfilatov2002 Положил на ftp пример работы _TBrowse(...) с отборами\выборками из базы
|
 |

|
|
|
| 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. */ |
|
|
 |

|
|
|
|
|
| постоянный участник
|
Пост N: 8006
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.07.25 05:43. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Вот его краткое описание, сгенерированное ИИ: |
| Это надо поставить в начале примера ! Иначе непонятно что это за пример...
|
 |

|
|
|
| постоянный участник
|
Пост N: 4780
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.07.25 08:08. Заголовок: gfilatov2002 Добави..
gfilatov2002 Добавил в пример более широкую информацию в Title окна и SuperHeader тсб (просьба Андрея), + почистил код немного Положил на ftp PS Для понимания о чем речь (кому интересно), пример demo8.prg тут Скрытый текст
/* * MINIGUI - Harbour Win32 GUI library Demo * */ #define _HMG_OUTLOG #include "hmg.ch" #include "tsbrowse.ch" #include "dbinfo.ch" REQUEST DBFCDX FUNCTION Main() LOCAL cForm := "wMain" LOCAL nY, nX, nH, nW LOCAL oTsb1, oTsb2, aFile := {}, cFile, aAls := {} LOCAL cAls1 := "CUST_1" , cAls2 := "CUST_2" LOCAL cDbf := "CUSTOMER2", cID := "CUSTNO" LOCAL cSel1 := "RecNo() %2 != 0" LOCAL cSel2 := "RecNo() %2 == 0" LOCAL cTitl := " Select, Relation and Edit. " + MiniGuiVersion() Sets_TSB() // App.Cargo:oTsb create cFile := App.Cargo:cPathDbf + cDbf USE ( cFile ) ALIAS ( cAls1 ) NEW SHARED INDEX ON &cID TAG ID SET ORDER TO 1 GO TOP AAdd( aFile, Select2Mem(cSel1, cID) ) AAdd( aAls , StrTran(cAls1, "_", "") ) GO TOP USE ( cFile ) ALIAS ( cAls2 ) NEW SHARED SET ORDER TO 1 GO TOP AAdd( aFile, Select2Mem(cSel2, cID) ) AAdd( aAls , StrTran(cAls2, "_", "") ) GO TOP USE ( aFile[1] ) ALIAS ( aAls[1] ) NEW //SHARED SET RELATION TO ROWID INTO &cAls1 GO TOP USE ( aFile[2] ) ALIAS ( aAls[2] ) NEW //SHARED SET RELATION TO ROWID INTO &cAls2 GO TOP DEFINE WINDOW &cForm TITLE "Demo 2 TBrowse." + cTitl ; MAIN NOSIZE TOPMOST ; ON INIT ( This.Topmost := .F., _wPost(0) ) ; ON RELEASE ( This.Hide, _wSend(90) ) This.Cargo := oHmgData() This.Maximize This.Cargo:aFile := aFile nY := nX := 0 nW := This.ClientWidth nH := Int( This.ClientHeight / 2 ) oTsb1 := App.Cargo:oTsb:Clone() oTsb1:cBrw := "Brw_1" oTsb1:uAlias := aAls[1] oTsb1:cAlsFld := cAls1 // relation oTsb1:cAlsKey := NIL //"CUSTNO" // field relation oTsb1:lAlsEdit := !Empty(oTsb1:cAlsKey) // lock edit oTsb1:aSelFld := NIL // FieldNames relation, array oTsb1:nY := nY oTsb1:nX := nX oTsb1:nW := nW oTsb1:nH := nH oTsb1:lSuperHd := .T. oTsb1:cSuperHd := oTsb1:cBrw + "." + oTsb1:uAlias + " -> " + ; Lower((oTsb1:uAlias)->( dbInfo( DBI_FULLPATH ) )) + ; space(3) + "SELECT: " + cSel1 + space(3) + ; "RELATION: TO ROWID INTO " +oTsb1:cAlsFld + ; space(3) + "EDIT: " oTsb1:cSuperHd += iif( oTsb1:lAlsEdit, "TRUE", "FALSE" ) oTsb1:aSuperHdColor := {CLR_YELLOW, CLR_HBLUE} nY += nH nH -= 1 oTsb2 := App.Cargo:oTsb:Clone() oTsb2:cBrw := "Brw_2" oTsb2:uAlias := aAls[2] oTsb2:cAlsFld := cAls2 // relation oTsb2:cAlsKey := cID // field relation oTsb2:lAlsEdit := !Empty(oTsb2:cAlsKey) // lock edit oTsb2:aSelFld := NIL // FieldNames relation, array oTsb2:lZebra := .F. oTsb2:lChess := .T. oTsb2:nY := nY oTsb2:nH := nH oTsb2:lSuperHd := .T. oTsb2:cSuperHd := oTsb2:cBrw + "." + oTsb2:uAlias + " -> " + ; Lower((oTsb2:uAlias)->( dbInfo( DBI_FULLPATH ) )) + ; space(3) + "SELECT: " + cSel2 + space(3) + ; "RELATION: TO ROWID INTO " +oTsb2:cAlsFld + ; space(3) + "EDIT: " oTsb2:cSuperHd += iif( oTsb2:lAlsEdit, "TRUE", "FALSE" ) oTsb2:aSuperHdColor := {CLR_HBLUE, CLR_YELLOW} This.Cargo:aBrw := _TBrowse({ oTsb1, oTsb2 }) This.Cargo:nBrw := 1 This.Cargo:aBrw[ This.Cargo:nBrw ]:SetFocus() ON KEY F1 ACTION NIL ON KEY TAB ACTION {|| Local ab := ThisWindow.Cargo:aBrw, ob Local nb := ThisWindow.Cargo:nBrw + 1 nb := iif( nb > Len(ab), 1, nb ) ob := ab[ nb ] ob:SetFocus() Return Nil } ON KEY ESCAPE ACTION {|| Local ab := ThisWindow.Cargo:aBrw, ob Local nb := ThisWindow.Cargo:nBrw ob := ab[ nb ] IF ob:IsEdit ; ob:SetFocus() ELSE ; _wSend(99) ENDIF Return Nil } WITH OBJECT This.Object :Event( 0, {|ow| AEval(ow:Cargo:aBrw, {|ob| ob:Show() }), DoEvents() }) :Event(90, {|ow| dbCloseAll() hb_FileDelete("*.cdx") AEval(ow:Cargo:aFile, {|cf| dbDrop(cf, cf, "DBFCDX") }) FErase("mem") //!!! Return Nil }) :Event(99, {|ow| ow:Release() }) END WITH END WINDOW ACTIVATE WINDOW &cForm RETURN NIL 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 GO TOP DO EVENTS dbDrop(cFile, cFile, "DBFCDX") dbCreate( cFile, {{"ROWID", "N", 10, 0}}, "DBFCDX", .T., cAls + "_" ) FOR EACH aRec IN aRecs dbAppend() FieldPut(1, aRec[1]) IF ! Empty( aRec[2] ) ; dbDelete() ENDIF NEXT dbGoTop() dbCloseArea() dbSelectArea(nOld) DO EVENTS RETURN cFile STATIC FUNCTION Sets_TSB( oTsb ) LOCAL oac := App.Cargo Default oac:oTsb := oTsb ; Default oac:oTsb := oHmgData() oac:oTsb:aEdit := .F. oac:oTsb:aFoot := .T. oac:oTsb:lZebra := .T. oac:oTsb:aNumber := { 1, App.Object:W(0.5) } oac:oTsb:uSelector := 20 oac:oTsb:bInit := {|ob,op| Local cn := op:cAlsKey, lEdit, oc ob:Hide() lEdit := !Empty(op:lAlsEdit) ob:LoadFields(lEdit, op:aSelFld, op:cAlsFld) IF !Empty(cn) .and. ob:nColumn(cn, .T.) > 0 ob:DelColumn(cn) ENDIF IF lEdit ; ob:lRecLockArea := lEdit ENDIF Return Nil } oac:oTsb:bAfter := {|ob| Local oc := ob:aColumns[1] oc:nClrBack := {|na,nc,obr| Local ocol := obr:aColumns[nc] Local nclr := ocol:nClrHeadBack IF (obr:cAlias)->( Deleted() ) nclr := CLR_HGRAY na := nc ENDIF Return nclr } Return Nil } oac:oTsb:bGotFocus := {|ob| Local owc IF IsObject(ob) SET WINDOW THIS TO ob:cParentWnd owc := This.Cargo owc:nBrw := ob:Cargo:nBrw SET WINDOW THIS TO ENDIF Return Nil } oac:oTsb:nHeightCell := App.Object:H(1.2) oac:oTsb:nHeightHead := App.Object:H(1.2) oTsb := oac:oTsb RETURN oTsb *----------------------------------------------------------------------------* INIT PROCEDURE Sets_ENV() *----------------------------------------------------------------------------* LOCAL cFont := "Arial", nSize := 12, oac rddSetDefault( "DBFCDX" ) SET DECIMALS TO 4 SET EPOCH TO 2000 SET DATE TO GERMAN SET CENTURY ON SET DELETED OFF SET AUTOPEN ON SET EXACT ON SET EXCLUSIVE ON SET SOFTSEEK ON SET OOP ON SET TOOLTIPSTYLE BALLOON SET MULTIPLE QUIT WARNING SET WINDOW MAIN OFF SET NAVIGATION EXTENDED SET WINDOW MODAL PARENT HANDLE ON //SET DEFAULT ICON TO "1MG" SET ShowRedAlert ON App.Cargo := oHmgData() ; oac := App.Cargo oac:lLogDel := .T. oac:cLogFile := hb_FNameExtSet( App.ExeName, ".log" ) oac:cPathDbf := ".\" oac:nMenuBmpH := 24 SET FONT TO cFont, nSize _DefineFont("Normal" , cFont, nSize , .F., .F. ) _DefineFont("Bold" , cFont, nSize , .T., .F. ) _DefineFont("Italic" , cFont, nSize-4, .F., .T. ) // Alert* font _DefineFont("DlgFont" , cFont, nSize+2, .F., .F. ) _SetGetLogFile( oac:cLogFile ) IF oac:lLogDel ; hb_FileDelete( oac:cLogFile ) ENDIF SET MENUSTYLE EXTENDED SetMenuBitmapHeight( oac:nMenuBmpH ) // RETURN
|
|
 |

|
|
|
| moderator
|
Пост N: 2478
Зарегистрирован: 11.02.10
|
|
Отправлено: 10.07.25 13:10. Заголовок: SergKis пишет: Поло..
SergKis пишет: Большое спасибо! Andrey пишет: | цитата: | | Это надо поставить в начале примера |
| Добавил комментарии в код (см. ниже) Скрытый текст
/* * MINIGUI - Harbour Win32 GUI library Demo * */ #define _HMG_OUTLOG #include "hmg.ch" #include "tsbrowse.ch" #include "dbinfo.ch" REQUEST DBFCDX /* * FUNCTION Main() * * 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. */ FUNCTION Main() LOCAL cForm := "wMain" LOCAL nY, nX, nH, nW LOCAL oTsb1, oTsb2, aFile := {}, cFile, aAls := {} LOCAL cAls1 := "CUST_1" , cAls2 := "CUST_2" LOCAL cDbf := "CUSTOMER2", cID := "CUSTNO" LOCAL cSel1 := "RecNo() %2 != 0" LOCAL cSel2 := "RecNo() %2 == 0" LOCAL cTitl := " Select, Relation and Edit. " + MiniGuiVersion() Sets_TSB() // App.Cargo:oTsb create cFile := App.Cargo:cPathDbf + cDbf USE ( cFile ) ALIAS ( cAls1 ) NEW SHARED INDEX ON &cID TAG ID SET ORDER TO 1 GO TOP AAdd( aFile, Select2Mem(cSel1, cID) ) AAdd( aAls , StrTran(cAls1, "_", "") ) GO TOP USE ( cFile ) ALIAS ( cAls2 ) NEW SHARED SET ORDER TO 1 GO TOP AAdd( aFile, Select2Mem(cSel2, cID) ) AAdd( aAls , StrTran(cAls2, "_", "") ) GO TOP USE ( aFile[1] ) ALIAS ( aAls[1] ) NEW SHARED SET RELATION TO ROWID INTO &cAls1 GO TOP USE ( aFile[2] ) ALIAS ( aAls[2] ) NEW SHARED SET RELATION TO ROWID INTO &cAls2 GO TOP DEFINE WINDOW &cForm TITLE "Demo 2 TBrowse." + cTitl ; MAIN NOSIZE TOPMOST ; ON INIT ( This.Topmost := .F., _wPost(0) ) ; ON RELEASE ( This.Hide, _wSend(90) ) This.Cargo := oHmgData() This.Maximize This.Cargo:aFile := aFile nY := nX := 0 nW := This.ClientWidth nH := Int( This.ClientHeight / 2 ) oTsb1 := App.Cargo:oTsb:Clone() oTsb1:cBrw := "Brw_1" oTsb1:uAlias := aAls[1] oTsb1:cAlsFld := cAls1 // relation oTsb1:cAlsKey := NIL //"CUSTNO" // field relation oTsb1:lAlsEdit := !Empty(oTsb1:cAlsKey) // lock edit oTsb1:aSelFld := NIL // FieldNames relation, array oTsb1:nY := nY oTsb1:nX := nX oTsb1:nW := nW oTsb1:nH := nH oTsb1:lSuperHd := .T. oTsb1:cSuperHd := oTsb1:cBrw + "." + oTsb1:uAlias + " -> " + ; Lower((oTsb1:uAlias)->( dbInfo( DBI_FULLPATH ) )) + ; space(3) + "SELECT: " + cSel1 + space(3) + ; "RELATION: TO ROWID INTO " +oTsb1:cAlsFld + ; space(3) + "EDIT: " oTsb1:cSuperHd += iif( oTsb1:lAlsEdit, "TRUE", "FALSE" ) oTsb1:aSuperHdColor := {CLR_YELLOW, CLR_HBLUE} nY += nH nH -= 1 oTsb2 := App.Cargo:oTsb:Clone() oTsb2:cBrw := "Brw_2" oTsb2:uAlias := aAls[2] oTsb2:cAlsFld := cAls2 // relation oTsb2:cAlsKey := cID // field relation oTsb2:lAlsEdit := !Empty(oTsb2:cAlsKey) // lock edit oTsb2:aSelFld := NIL // FieldNames relation, array oTsb2:lZebra := .F. oTsb2:lChess := .T. oTsb2:nY := nY oTsb2:nH := nH oTsb2:lSuperHd := .T. oTsb2:cSuperHd := oTsb2:cBrw + "." + oTsb2:uAlias + " -> " + ; Lower((oTsb2:uAlias)->( dbInfo( DBI_FULLPATH ) )) + ; space(3) + "SELECT: " + cSel2 + space(3) + ; "RELATION: TO ROWID INTO " +oTsb2:cAlsFld + ; space(3) + "EDIT: " oTsb2:cSuperHd += iif( oTsb2:lAlsEdit, "TRUE", "FALSE" ) oTsb2:aSuperHdColor := {CLR_HBLUE, CLR_YELLOW} This.Cargo:aBrw := _TBrowse({ oTsb1, oTsb2 }) This.Cargo:nBrw := 1 This.Cargo:aBrw[ This.Cargo:nBrw ]:SetFocus() ON KEY F1 ACTION NIL ON KEY TAB ACTION {|| Local ab := ThisWindow.Cargo:aBrw, ob Local nb := ThisWindow.Cargo:nBrw + 1 nb := iif( nb > Len(ab), 1, nb ) ob := ab[ nb ] ob:SetFocus() Return Nil } ON KEY ESCAPE ACTION {|| Local ab := ThisWindow.Cargo:aBrw, ob Local nb := ThisWindow.Cargo:nBrw ob := ab[ nb ] IF ob:IsEdit ; ob:SetFocus() ELSE ; _wSend(99) ENDIF Return Nil } WITH OBJECT This.Object :Event( 0, {|ow| AEval(ow:Cargo:aBrw, {|ob| ob:Show() }), DoEvents() }) :Event(90, {|ow| dbCloseAll() hb_FileDelete("*.cdx") AEval(ow:Cargo:aFile, {|cf| dbDrop(cf, cf, "DBFCDX") }) FErase("mem") Return Nil }) :Event(99, {|ow| ow:Release() }) END WITH END WINDOW ACTIVATE WINDOW &cForm RETURN NIL /* * 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. * 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 based on lMode, 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. * * 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. */ 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 GO TOP DO EVENTS dbDrop(cFile, cFile, "DBFCDX") dbCreate( cFile, {{"ROWID", "N", 10, 0}}, "DBFCDX", .T., cAls + "_" ) FOR EACH aRec IN aRecs dbAppend() FieldPut(1, aRec[1]) IF ! Empty( aRec[2] ) ; dbDelete() ENDIF NEXT dbGoTop() dbCloseArea() dbSelectArea(nOld) DO EVENTS RETURN cFile /* * STATIC FUNCTION Sets_TSB( oTsb ) * * Configures default settings for TBrowse objects used in the application. * * Parameters: * oTsb (OBJECT, optional): An existing TBrowse object to configure. If NIL, a new oHmgData() object is created. * * Returns: * OBJECT: The configured TBrowse object (either the passed object or the newly created one). * * Purpose: * This function centralizes the configuration of common TBrowse settings, promoting code reuse and consistency. * It sets properties such as zebra striping, column numbering, and event handlers for initialization, after-browse operations, and focus changes. * The function also defines closures (code blocks) for customizing the appearance and behavior of the TBrowse objects. * This allows for dynamic modification of the TBrowse based on the data being displayed. * * Notes: * The function uses the App.Cargo object to store the TBrowse settings. * The bInit closure is responsible for loading the fields into the TBrowse and handling column customization. * The bAfter closure is responsible for customizing the appearance of the TBrowse after it has been loaded. * The bGotFocus closure is responsible for setting the focus to the TBrowse object and updating the window title. */ STATIC FUNCTION Sets_TSB( oTsb ) LOCAL oac := App.Cargo Default oac:oTsb := oTsb, oac:oTsb := oHmgData() oac:oTsb:aEdit := .F. oac:oTsb:aFoot := .T. oac:oTsb:lZebra := .T. oac:oTsb:aNumber := { 1, App.Object:W(0.5) } oac:oTsb:uSelector := 20 oac:oTsb:bInit := {|ob,op| Local cn := op:cAlsKey, lEdit, oc ob:Hide() lEdit := !Empty(op:lAlsEdit) ob:LoadFields(lEdit, op:aSelFld, op:cAlsFld) IF !Empty(cn) .and. ob:nColumn(cn, .T.) > 0 ob:DelColumn(cn) ENDIF IF lEdit ; ob:lRecLockArea := lEdit ENDIF Return Nil } oac:oTsb:bAfter := {|ob| Local oc := ob:aColumns[1] oc:nClrBack := {|na,nc,obr| Local ocol := obr:aColumns[nc] Local nclr := ocol:nClrHeadBack IF (obr:cAlias)->( Deleted() ) nclr := CLR_HGRAY na := nc ENDIF Return nclr } Return Nil } oac:oTsb:bGotFocus := {|ob| Local owc IF IsObject(ob) SET WINDOW THIS TO ob:cParentWnd owc := This.Cargo owc:nBrw := ob:Cargo:nBrw SET WINDOW THIS TO ENDIF Return Nil } oac:oTsb:nHeightCell := App.Object:H(1.2) oac:oTsb:nHeightHead := App.Object:H(1.2) oTsb := oac:oTsb RETURN oTsb /* * INIT PROCEDURE Sets_ENV() * * Initializes the application environment, setting various system parameters and defining fonts. * * Purpose: * This procedure sets up the Harbour MiniGUI Extended Edition (HMG Extended) environment for the application. * It configures the default RDD (Replaceable Database Driver), date and time formats, display settings, and other system parameters. * It also defines custom fonts for use throughout the application, ensuring a consistent look and feel. * The procedure also sets up logging functionality, creating a log file to record application events and errors. * * Notes: * The procedure uses the rddSetDefault() function to set the default RDD to DBFCDX. * The procedure uses the SET command to configure various system parameters. * The procedure uses the _DefineFont() function to define custom fonts. * The procedure uses the _SetGetLogFile() function to set the log file. * The procedure uses the hb_FileDelete() function to delete the log file if it already exists. */ INIT PROCEDURE Sets_ENV() LOCAL cFont := "Arial", nSize := 12, oac rddSetDefault( "DBFCDX" ) SET DECIMALS TO 4 SET EPOCH TO 2000 SET DATE TO GERMAN SET CENTURY ON SET DELETED OFF SET AUTOPEN ON SET EXACT ON SET EXCLUSIVE ON SET SOFTSEEK ON SET OOP ON SET TOOLTIPSTYLE BALLOON SET MULTIPLE QUIT WARNING SET NAVIGATION EXTENDED SET WINDOW MODAL PARENT HANDLE ON SET ShowRedAlert ON App.Cargo := oHmgData() ; oac := App.Cargo oac:lLogDel := .T. oac:cLogFile := hb_FNameExtSet( App.ExeName, ".log" ) oac:cPathDbf := ".\" SET FONT TO cFont, nSize _DefineFont("Normal" , cFont, nSize , .F., .F. ) _DefineFont("Bold" , cFont, nSize , .T., .F. ) _DefineFont("Italic" , cFont, nSize-4, .F., .T. ) // Alert* font _DefineFont("DlgFont" , cFont, nSize+2, .F., .F. ) _SetGetLogFile( oac:cLogFile ) IF oac:lLogDel ; hb_FileDelete( oac:cLogFile ) ENDIF RETURN
|
|
 |

|
|
|
| постоянный участник
|
Пост 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"}
|
 |

|
|
|
| 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. */ |
|
|
 |

|
|
|
| постоянный участник
|
Пост N: 4784
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.07.25 11:53. Заголовок: gfilatov2002 Положи..
gfilatov2002 Положил на ftp пример аналог demo8, но работа тсб без индексов и set relation. Кому интересно demo9.prg тут Скрытый текст
/* * MINIGUI - Harbour Win32 GUI library Demo * */ #define _HMG_OUTLOG #include "hmg.ch" #include "tsbrowse.ch" #include "dbinfo.ch" REQUEST DBFCDX FUNCTION Main() LOCAL cForm := "wMain" LOCAL nY, nX, nH, nW LOCAL oTsb1, oTsb2, aFile := {}, cFile, aAls := {} LOCAL cAls1 := "CUST_1" , cAls2 := "CUST_2" LOCAL cDbf := "CUSTOMER2", cID := "CUSTNO" LOCAL cSel1 := "RecNo() %2 != 0" LOCAL cSel2 := "RecNo() %2 == 0" LOCAL cTitl := " Select, NO Relation and Edit. " + MiniGuiVersion() Sets_TSB() // App.Cargo:oTsb create cFile := App.Cargo:cPathDbf + cDbf USE ( cFile ) ALIAS ( cAls1 ) NEW SHARED AAdd( aFile, Select2Mem(cSel1, cID) ) AAdd( aAls , StrTran(cAls1, "_", "") ) GO TOP USE ( cFile ) ALIAS ( cAls2 ) NEW SHARED AAdd( aFile, Select2Mem(cSel2, cID) ) AAdd( aAls , StrTran(cAls2, "_", "") ) GO TOP USE ( aFile[1] ) ALIAS ( aAls[1] ) NEW GO TOP USE ( aFile[2] ) ALIAS ( aAls[2] ) NEW GO TOP DEFINE WINDOW &cForm TITLE "Demo 2 TBrowse." + cTitl ; MAIN NOSIZE TOPMOST ; ON INIT ( This.Topmost := .F., _wPost(0) ) ; ON RELEASE ( This.Hide, _wSend(90) ) This.Cargo := oHmgData() This.Maximize This.Cargo:aFile := aFile nY := nX := 0 nW := This.ClientWidth nH := Int( This.ClientHeight / 2 ) oTsb1 := App.Cargo:oTsb:Clone() oTsb1:cBrw := "Brw_1" oTsb1:uAlias := aAls[1] oTsb1:cAlsFld := cAls1 // relation oTsb1:cAlsKey := NIL //"CUSTNO" // field relation oTsb1:lAlsEdit := !Empty(oTsb1:cAlsKey) // lock edit //oTsb1:aSelFld := NIL // FieldNames relation, array oTsb1:aSelFld := {"COUNTRY", "STATE", "CITY", "COMPANY", "ADDR1"} oTsb1:nY := nY oTsb1:nX := nX oTsb1:nW := nW oTsb1:nH := nH oTsb1:lSuperHd := .T. oTsb1:cSuperHd := oTsb1:cBrw + "." + oTsb1:uAlias + " -> " + ; Lower((oTsb1:uAlias)->( dbInfo( DBI_FULLPATH ) )) + ; space(3) + "SELECT: " + cSel1 + space(3) + ; "RELATION: TO ROWNR INTO " +oTsb1:cAlsFld + ; space(3) + "EDIT: " oTsb1:cSuperHd += iif( oTsb1:lAlsEdit, "TRUE", "FALSE" ) oTsb1:aSuperHdColor := {CLR_YELLOW, CLR_HBLUE} nY += nH nH -= 1 oTsb2 := App.Cargo:oTsb:Clone() oTsb2:cBrw := "Brw_2" oTsb2:uAlias := aAls[2] oTsb2:cAlsFld := cAls2 // relation oTsb2:cAlsKey := cID // field relation oTsb2:lAlsEdit := !Empty(oTsb2:cAlsKey) // lock edit oTsb2:aSelFld := NIL // FieldNames relation, array oTsb2:lZebra := .F. oTsb2:lChess := .T. oTsb2:nY := nY oTsb2:nH := nH oTsb2:lSuperHd := .T. oTsb2:cSuperHd := oTsb2:cBrw + "." + oTsb2:uAlias + " -> " + ; Lower((oTsb2:uAlias)->( dbInfo( DBI_FULLPATH ) )) + ; space(3) + "SELECT: " + cSel2 + space(3) + ; "RELATION: TO ROWNR INTO " +oTsb2:cAlsFld + ; space(3) + "EDIT: " oTsb2:cSuperHd += iif( oTsb2:lAlsEdit, "TRUE", "FALSE" ) oTsb2:aSuperHdColor := {CLR_HBLUE, CLR_YELLOW} This.Cargo:aBrw := _TBrowse({ oTsb1, oTsb2 }) This.Cargo:nBrw := 1 This.Cargo:aBrw[ This.Cargo:nBrw ]:SetFocus() ON KEY F1 ACTION NIL ON KEY TAB ACTION {|| Local ab := ThisWindow.Cargo:aBrw, ob Local nb := ThisWindow.Cargo:nBrw + 1 nb := iif( nb > Len(ab), 1, nb ) ob := ab[ nb ] ob:SetFocus() Return Nil } ON KEY ESCAPE ACTION {|| Local ab := ThisWindow.Cargo:aBrw, ob Local nb := ThisWindow.Cargo:nBrw ob := ab[ nb ] IF ob:IsEdit ; ob:SetFocus() ELSE ; _wSend(99) ENDIF Return Nil } WITH OBJECT This.Object :Event( 0, {|ow| AEval(ow:Cargo:aBrw, {|ob| ob:Show() }), DoEvents() }) :Event(90, {|ow| dbCloseAll() AEval(ow:Cargo:aFile, {|cf| dbDrop(cf, cf, "DBFCDX") }) FErase("mem") Return Nil }) :Event(99, {|ow| ow:Release() }) END WITH END WINDOW ACTIVATE WINDOW &cForm RETURN NIL 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, { RecNo(), Deleted() }) ENDIF SKIP ENDDO GO TOP DO EVENTS dbDrop(cFile, cFile, "DBFCDX") dbCreate( cFile, {{"ROWNR", "N", 10, 0}}, "DBFCDX", .T., cAls + "_" ) FOR EACH aRec IN aRecs dbAppend() FieldPut(1, aRec[1]) IF ! Empty( aRec[2] ) ; dbDelete() ENDIF NEXT dbGoTop() dbCloseArea() dbSelectArea(nOld) DO EVENTS RETURN cFile STATIC FUNCTION Sets_TSB( oTsb ) LOCAL oac := App.Cargo Default oac:oTsb := oTsb ; Default oac:oTsb := oHmgData() oac:oTsb:aEdit := .F. oac:oTsb:aFoot := .T. oac:oTsb:lZebra := .T. oac:oTsb:aNumber := { 1, App.Object:W(0.5) } oac:oTsb:uSelector := 20 oac:oTsb:bInit := {|ob,op| Local cn := op:cAlsKey, lEdit, oc ob:Hide() lEdit := !Empty(op:lAlsEdit) ob:LoadFields(lEdit, op:aSelFld, op:cAlsFld) IF lEdit ; ob:lRecLockArea := lEdit ENDIF ob:bOnDrawLine := {|obr| Local cAls := obr:Cargo:oParam:cAlsFld (cAls)->( dbGoTo((obr:cAlias)->ROWNR) ) Return Nil } Return Nil } oac:oTsb:bAfter := {|ob| Local oc := ob:aColumns[1] oc:nClrBack := {|na,nc,obr| Local ocol := obr:aColumns[nc] Local nclr := ocol:nClrHeadBack IF (obr:cAlias)->( Deleted() ) nclr := CLR_HGRAY na := nc ENDIF Return nclr } Return Nil } oac:oTsb:bGotFocus := {|ob| Local owc IF IsObject(ob) SET WINDOW THIS TO ob:cParentWnd owc := This.Cargo owc:nBrw := ob:Cargo:nBrw SET WINDOW THIS TO ENDIF Return Nil } oac:oTsb:nHeightCell := App.Object:H(1.2) oac:oTsb:nHeightHead := App.Object:H(1.2) oTsb := oac:oTsb RETURN oTsb *----------------------------------------------------------------------------* INIT PROCEDURE Sets_ENV() *----------------------------------------------------------------------------* LOCAL cFont := "Arial", nSize := 12, oac rddSetDefault( "DBFCDX" ) SET DECIMALS TO 4 SET EPOCH TO 2000 SET DATE TO GERMAN SET CENTURY ON SET DELETED OFF SET AUTOPEN OFF SET EXACT ON SET EXCLUSIVE ON SET SOFTSEEK ON SET OOP ON SET TOOLTIPSTYLE BALLOON SET MULTIPLE QUIT WARNING SET WINDOW MAIN OFF SET NAVIGATION EXTENDED SET WINDOW MODAL PARENT HANDLE ON //SET DEFAULT ICON TO "1MG" SET ShowRedAlert ON App.Cargo := oHmgData() ; oac := App.Cargo oac:lLogDel := .T. oac:cLogFile := hb_FNameExtSet( App.ExeName, ".log" ) oac:cPathDbf := ".\" oac:nMenuBmpH := 24 SET FONT TO cFont, nSize _DefineFont("Normal" , cFont, nSize , .F., .F. ) _DefineFont("Bold" , cFont, nSize , .T., .F. ) _DefineFont("Italic" , cFont, nSize-4, .F., .T. ) // Alert* font _DefineFont("DlgFont" , cFont, nSize+2, .F., .F. ) _SetGetLogFile( oac:cLogFile ) IF oac:lLogDel ; hb_FileDelete( oac:cLogFile ) ENDIF SET MENUSTYLE EXTENDED SetMenuBitmapHeight( oac:nMenuBmpH ) // RETURN
|
|
 |

|
|
|
| moderator
|
Пост N: 2480
Зарегистрирован: 11.02.10
|
|
Отправлено: 14.07.25 12:20. Заголовок: SergKis пишет: Поло..
SergKis пишет: Большое спасибо, обязательно посмотрю... 
|
 |

|
|
|
| moderator
|
Пост N: 2481
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.07.25 12:01. Заголовок: SergKis Еще раз бла..
SergKis Еще раз благодарю за новый пример. Ниже - его прокомментированная версия: Скрытый текст
/* * MINIGUI - Harbour Win32 GUI library Demo * */ #define _HMG_OUTLOG #include "hmg.ch" #include "tsbrowse.ch" #include "dbinfo.ch" REQUEST DBFCDX /* * FUNCTION Main() * * Demonstrates the use of TBrowse controls with data selection, relation, and editing capabilities. * * Purpose: * This function demonstrates the use of two TBrowse controls to display and interact with data from a DBF file. * It performs the following steps: * 1. Sets up the TBrowse environment using Sets_TSB(). * 2. Opens two instances of the "CUSTOMER2" DBF file with different aliases and selection criteria. * 3. Creates two memory tables based on the selection criteria. * 4. Defines a main window with two TBrowse controls, each displaying data from one of the memory tables. * 5. Configures the TBrowse controls with specific properties, including aliases, relation fields, and editability. * 6. Sets up key bindings for navigation and exiting the application. * 7. Activates the main window, making it visible to the user. * * Notes: * - The "CUSTOMER2" DBF file is assumed to exist in the application's directory. * - The Sets_TSB() function is responsible for initializing the TBrowse environment and setting default properties. * - The Select2Mem() function creates a memory table based on a selection criteria. * - The application uses the App.Cargo object to store application-wide data, such as the TBrowse objects and file paths. */ FUNCTION Main() LOCAL cForm := "wMain" LOCAL nY, nX, nH, nW LOCAL oTsb1, oTsb2, aFile := {}, cFile, aAls := {} LOCAL cAls1 := "CUST_1" , cAls2 := "CUST_2" LOCAL cDbf := "CUSTOMER2", cID := "CUSTNO" LOCAL cSel1 := "RecNo() %2 != 0" LOCAL cSel2 := "RecNo() %2 == 0" LOCAL cTitl := " Select, Relation and Edit. " + MiniGuiVersion() Sets_TSB() // App.Cargo:oTsb create cFile := App.Cargo:cPathDbf + cDbf USE ( cFile ) ALIAS ( cAls1 ) NEW SHARED AAdd( aFile, Select2Mem(cSel1, cID) ) AAdd( aAls , StrTran(cAls1, "_", "") ) GO TOP USE ( cFile ) ALIAS ( cAls2 ) NEW SHARED AAdd( aFile, Select2Mem(cSel2, cID) ) AAdd( aAls , StrTran(cAls2, "_", "") ) GO TOP USE ( aFile[1] ) ALIAS ( aAls[1] ) NEW GO TOP USE ( aFile[2] ) ALIAS ( aAls[2] ) NEW GO TOP DEFINE WINDOW &cForm TITLE "Demo 2 TBrowse." + cTitl ; MAIN NOSIZE TOPMOST ; ON INIT ( This.Topmost := .F., _wPost(0) ) ; ON RELEASE ( This.Hide, _wSend(90) ) This.Cargo := oHmgData() This.Maximize This.Cargo:aFile := aFile nY := nX := 0 nW := This.ClientWidth nH := Int( This.ClientHeight / 2 ) oTsb1 := App.Cargo:oTsb:Clone() oTsb1:cBrw := "Brw_1" oTsb1:uAlias := aAls[1] oTsb1:cAlsFld := cAls1 // relation oTsb1:cAlsKey := NIL // field relation oTsb1:lAlsEdit := !Empty(oTsb1:cAlsKey) // lock edit //oTsb1:aSelFld := NIL // FieldNames relation, array oTsb1:aSelFld := {"COUNTRY", "STATE", "CITY", "COMPANY", "ADDR1"} oTsb1:nY := nY oTsb1:nX := nX oTsb1:nW := nW oTsb1:nH := nH oTsb1:lSuperHd := .T. oTsb1:cSuperHd := oTsb1:cBrw + "." + oTsb1:uAlias + " -> " + ; Lower((oTsb1:uAlias)->( dbInfo( DBI_FULLPATH ) )) + ; space(3) + "SELECT: " + cSel1 + space(3) + ; "RELATION: TO ROWID INTO " +oTsb1:cAlsFld + ; space(3) + "EDIT: " oTsb1:cSuperHd += iif( oTsb1:lAlsEdit, "TRUE", "FALSE" ) oTsb1:aSuperHdColor := {CLR_YELLOW, CLR_HBLUE} nY += nH nH -= 1 oTsb2 := App.Cargo:oTsb:Clone() oTsb2:cBrw := "Brw_2" oTsb2:uAlias := aAls[2] oTsb2:cAlsFld := cAls2 // relation oTsb2:cAlsKey := cID // field relation oTsb2:lAlsEdit := !Empty(oTsb2:cAlsKey) // lock edit oTsb2:aSelFld := NIL // FieldNames relation, array oTsb2:lZebra := .F. oTsb2:lChess := .T. oTsb2:nY := nY oTsb2:nH := nH oTsb2:lSuperHd := .T. oTsb2:cSuperHd := oTsb2:cBrw + "." + oTsb2:uAlias + " -> " + ; Lower((oTsb2:uAlias)->( dbInfo( DBI_FULLPATH ) )) + ; space(3) + "SELECT: " + cSel2 + space(3) + ; "RELATION: TO ROWID INTO " +oTsb2:cAlsFld + ; space(3) + "EDIT: " oTsb2:cSuperHd += iif( oTsb2:lAlsEdit, "TRUE", "FALSE" ) oTsb2:aSuperHdColor := {CLR_HBLUE, CLR_YELLOW} This.Cargo:aBrw := _TBrowse({ oTsb1, oTsb2 }) This.Cargo:nBrw := 1 This.Cargo:aBrw[ This.Cargo:nBrw ]:SetFocus() ON KEY F1 ACTION NIL ON KEY TAB ACTION {|| Local ab := ThisWindow.Cargo:aBrw, ob Local nb := ThisWindow.Cargo:nBrw + 1 nb := iif( nb > Len(ab), 1, nb ) ob := ab[ nb ] ob:SetFocus() Return Nil } ON KEY ESCAPE ACTION {|| Local ab := ThisWindow.Cargo:aBrw, ob Local nb := ThisWindow.Cargo:nBrw ob := ab[ nb ] IF ob:IsEdit ; ob:SetFocus() ELSE ; _wSend(99) ENDIF Return Nil } WITH OBJECT This.Object :Event( 0, {|ow| AEval(ow:Cargo:aBrw, {|ob| ob:Show() }), DoEvents() }) :Event(90, {|ow| dbCloseAll() AEval(ow:Cargo:aFile, {|cf| dbDrop(cf, cf, "DBFCDX") }) FErase("mem") Return Nil }) :Event(99, {|ow| ow:Release() }) END WITH END WINDOW ACTIVATE WINDOW &cForm RETURN NIL /* * STATIC FUNCTION Select2Mem(bMode, cFld) * * Creates a memory table containing records selected from the current database based on a given condition. * * Parameters: * bMode (BLOCK or CHARACTER): A code block or character expression that defines the selection criteria. * If a code block, it should evaluate to .T. for records to be included. * If a character expression, it is converted to a code block. * cFld (CHARACTER, optional): The name of the field to be used as the ROWID in the memory table. Defaults to "CUSTNO". * * Returns: * CHARACTER: The alias of the newly created memory table. * * Purpose: * This function is used to create a temporary memory table containing a subset of records from a DBF file, * based on a specified selection criteria. This allows for filtering and manipulating data without directly * modifying the original DBF file. The memory table includes a "ROWNR" field that stores the original record number * from the DBF file, enabling a relation between the memory table and the original DBF. * * Notes: * - The function uses dbCreate() to create the memory table, which is automatically opened. * - The function uses dbAppend() and FieldPut() to add records to the memory table. * - The function uses dbDelete() to mark records as deleted in the memory table if they were deleted in the original DBF. * - The function uses dbDrop() to delete the memory table if it already exists. * - The function uses dbCloseArea() to close the memory table after it has been created. * - The function uses dbSelectArea() to restore the original selected work area. */ 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, { RecNo(), Deleted() }) ENDIF SKIP ENDDO GO TOP DO EVENTS dbDrop(cFile, cFile, "DBFCDX") dbCreate( cFile, {{"ROWNR", "N", 10, 0}}, "DBFCDX", .T., cAls + "_" ) FOR EACH aRec IN aRecs dbAppend() FieldPut(1, aRec[1]) IF ! Empty( aRec[2] ) ; dbDelete() ENDIF NEXT dbGoTop() dbCloseArea() dbSelectArea(nOld) DO EVENTS RETURN cFile /* * STATIC FUNCTION Sets_TSB( oTsb ) * * Configures the default settings and event handlers for TBrowse objects used in the application. * * Parameters: * oTsb (OBJECT, optional): An existing TBrowse object to configure. If not provided, a new oHmgData() object is created. * * Returns: * OBJECT: The configured TBrowse object (either the provided object or the newly created one). * * Purpose: * This function centralizes the configuration of TBrowse objects, ensuring consistency across the application. * It sets default properties such as editability, footer visibility, zebra striping, and column numbering. * It also defines event handlers for initialization, drawing lines, and gaining focus. * This function promotes code reusability and simplifies the creation of TBrowse controls. * * Notes: * - The function uses the App.Cargo object to store application-wide data, such as the default TBrowse settings. * - The bInit codeblock is executed when the TBrowse object is initialized. It loads the fields to be displayed and sets up the record locking area. * - The bOnDrawLine codeblock is executed when a line is drawn in the TBrowse object. It positions the cursor in the related DBF file. * - The bAfter codeblock is executed after the TBrowse object is displayed. It sets the background color of deleted records. * - The bGotFocus codeblock is executed when the TBrowse object gains focus. It sets the active window and updates the application's current TBrowse object. */ STATIC FUNCTION Sets_TSB( oTsb ) LOCAL oac := App.Cargo DEFAULT oac:oTsb := oTsb, oac:oTsb := oHmgData() oac:oTsb:aEdit := .F. oac:oTsb:aFoot := .T. oac:oTsb:lZebra := .T. oac:oTsb:aNumber := { 1, App.Object:W(0.5) } oac:oTsb:uSelector := 20 oac:oTsb:bInit := {|ob,op| Local cn := op:cAlsKey, lEdit, oc ob:Hide() lEdit := !Empty(op:lAlsEdit) ob:LoadFields(lEdit, op:aSelFld, op:cAlsFld) IF lEdit ; ob:lRecLockArea := lEdit ENDIF ob:bOnDrawLine := {|obr| Local cAls := obr:Cargo:oParam:cAlsFld (cAls)->( dbGoTo((obr:cAlias)->ROWNR) ) Return Nil } Return Nil } oac:oTsb:bAfter := {|ob| Local oc := ob:aColumns[1] oc:nClrBack := {|na,nc,obr| Local ocol := obr:aColumns[nc] Local nclr := ocol:nClrHeadBack IF (obr:cAlias)->( Deleted() ) nclr := CLR_HGRAY na := nc ENDIF Return nclr } Return Nil } oac:oTsb:bGotFocus := {|ob| Local owc IF IsObject(ob) SET WINDOW THIS TO ob:cParentWnd owc := This.Cargo owc:nBrw := ob:Cargo:nBrw SET WINDOW THIS TO ENDIF Return Nil } oac:oTsb:nHeightCell := App.Object:H(1.2) oac:oTsb:nHeightHead := App.Object:H(1.2) oTsb := oac:oTsb RETURN oTsb /* * INIT PROCEDURE Sets_ENV() * * Initializes the application environment, setting various system settings and defining fonts. * * Purpose: * This procedure sets up the application's environment by configuring various system settings, * such as the default RDD, date format, decimal precision, and font settings. It also defines * application-specific settings, such as the log file path and whether to delete the log file on startup. * This ensures that the application runs consistently across different systems and configurations. * * Notes: * - The procedure sets the default RDD to DBFCDX, which is a common RDD for DBF files. * - The procedure sets the date format to German. * - The procedure sets various other system settings, such as SET DELETED OFF, SET EXACT ON, and SET SOFTSEEK ON. * - The procedure defines three fonts: "Normal", "Bold", and "Italic". * - The procedure creates an oHmgData() object and stores it in App.Cargo for application-wide data storage. * - The procedure sets the log file path and whether to delete the log file on startup. */ INIT PROCEDURE Sets_ENV() LOCAL cFont := "Arial", nSize := 12, oac rddSetDefault( "DBFCDX" ) SET DECIMALS TO 4 SET EPOCH TO 2000 SET DATE TO GERMAN SET CENTURY ON SET DELETED OFF SET AUTOPEN OFF SET EXACT ON SET EXCLUSIVE ON SET SOFTSEEK ON SET OOP ON SET TOOLTIPSTYLE BALLOON SET MULTIPLE QUIT WARNING SET NAVIGATION EXTENDED SET WINDOW MODAL PARENT HANDLE ON SET ShowRedAlert ON App.Cargo := oHmgData() ; oac := App.Cargo oac:lLogDel := .T. oac:cLogFile := hb_FNameExtSet( App.ExeName, ".log" ) oac:cPathDbf := ".\" SET FONT TO cFont, nSize _DefineFont("Normal" , cFont, nSize , .F., .F. ) _DefineFont("Bold" , cFont, nSize , .T., .F. ) _DefineFont("Italic" , cFont, nSize-4, .F., .T. ) // Alert* font _DefineFont("DlgFont" , cFont, nSize+2, .F., .F. ) _SetGetLogFile( oac:cLogFile ) IF oac:lLogDel ; hb_FileDelete( oac:cLogFile ) ENDIF RETURN
|
|
 |

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

|
|
|
| |
Пост N: 8122
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.07.25 12:26. Заголовок: Softlog86 пишет: По..
Softlog86 пишет: | цитата: | Подскажите , где сейчас находятся дистрибутивы Hаrbour и MiniGui ? Хочу установить всё для работы на новом компьютере . |
| http://hmgextended.com/download.html
|
 |

|
|
|
|
|
| moderator
|
Пост N: 2482
Зарегистрирован: 11.02.10
|
|
Отправлено: 27.07.25 18:03. Заголовок: Всем, кому это интересно...
Завершена подготовка новой сборки 25.08, которая будет опубликована на следующей неделе. Кратко, что нового: Скрытый текст
Enhancements * Added support for CenterAlign and RightAlign properties in StatusBar items without requiring color attributes. (Requested by Ivanil Marcelino) * Improved _Alert() function now correctly handles the AlwaysOnTop parameter. * HMG_PressKey() now displays an “Invalid parameter” message for better error handling. * Registry function RegCreateKey() replaced with the recommended RegCreateKeyEx() WinAPI call. --- Library and Core Updates * Refactored network functions for improved performance and maintainability: NetRecLock(), NetFileLock(), NetAppend(), NetDelete(), and NetRecall() * Internal modules improved for: * PDF management * Help file handling * Hotkey configuration * StatusBar keyboard shortcuts * Windows Registry access * DBF/Array conversions (HMG_DbfToArray(), HMG_ArrayToDbf()) * Updated libraries: * HbSQLite3 now uses SQLite version 3.50.3 * HbVpdf library now includes full function documentation * Shell32 source refactored * SQLRDD library updated (Pro version) * Harbour Compiler 3.2.0dev (SVN 2025-07-19 19:44) integrated (Pro version) --- New Samples * Custom Progress Bar using OOP Location: \samples\Basic\MyProgressbar * Registry Wrapper Test Location: \samples\Basic\REGISTRY_4 * Two memory tables based on selection criteria Location: \samples\Advanced\Tsb_2tsb (demo8.prg and demo9.prg) --- Updated Samples with Detailed Comments The following samples have been updated with comprehensive inline documentation: * DATA_BOUND * Grid_8 * AlertBoxes * HotKeyBox * HotKeys * FastFind * REPORT_GENERATOR * EZ_Lines (Pro version) * HMG_Tetris (Pro version) * MineSweeper (Pro version) * Sudoku (Pro version)
|
|
 |

|
|
|
| moderator
|
Пост N: 2483
Зарегистрирован: 11.02.10
|
|
Отправлено: 30.07.25 09:29. Заголовок: Всем, кому это интересно...
Выложил новую сборку 25.08 Стандартная версия click here ПРО-версия (архив под паролем) click here Желаю всем хорошего дня! 
|
 |

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

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

|
|
|
| moderator
|
Пост N: 2486
Зарегистрирован: 11.02.10
|
|
Отправлено: 17.08.25 20:21. Заголовок: krutoff пишет: карт..
krutoff пишет: | цитата: | | картинки в меню поменяли фон |
| Благодарю за сообщение! Вернул прежний вид картинок в меню: Исправление будет включено в следующую сборку. 
|
 |

|
|
|
| постоянный участник
|
Пост 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())) - аналогично портит алиас 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8036
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.09.25 11:18. Заголовок: Выяснил, что при зап..
Выяснил, что при запуске программы эти функции не портят алиас, но потом при открытии базы (стандартное открытие и создание индексов), начинается чехарда с этим алиасом, после вывода на экран - теряется алиас. Где и что происходит - не понимаю ? 
|
 |

|
|
|
| moderator
|
Пост N: 2487
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.09.25 09:35. Заголовок: Всем кому это интересно...
Выложил новую сборку 25.09 Смотрите список изменений этой версии в файле doc\changelog.txt Стандартная версия click here ПРО-версия (архив под паролем) click here Желаю всем хорошего дня! 
|
 |

|
|
|
| постоянный участник
|
Пост 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
|
 |

|
|
|
| постоянный участник
|
Пост 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.
|
 |

|
|
|
|
|
| moderator
|
Пост N: 2488
Зарегистрирован: 11.02.10
|
|
Отправлено: 13.09.25 12:07. Заголовок: SergKis пишет: Може..
SergKis пишет: | цитата: | Может вместо STATIC PROCEDURE AddIfUnique( aList, cName ) сделать |
| Да, конечно. Благодарю за предложение 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4799
Зарегистрирован: 17.02.12
|
|
Отправлено: 13.09.25 12:12. Заголовок: и еще добавить в h_d..
и еще добавить в h_dbf_aux *-----------------------------------------------------------------------------* FUNCTION HMG_ConvertType( uVal, cTypeDst ) *-----------------------------------------------------------------------------* RETURN ConvertType( uVal, cTypeDst )
|
 |

|
|
|
| постоянный участник
|
Пост N: 4800
Зарегистрирован: 17.02.12
|
|
Отправлено: 13.09.25 12:33. Заголовок: gfilatov2002 На ftp..
gfilatov2002 На ftp положил предложение, комментарий в demo.prg
|
 |

|
|
|
| постоянный участник
|
Пост 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("..."), например
|
 |

|
|
|
| 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 |
| Благодарю за предложение 
|
 |

|
|
|
| постоянный участник
|
Пост 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!
|
 |

|
|
|
| moderator
|
Пост N: 2490
Зарегистрирован: 11.02.10
|
|
Отправлено: 14.09.25 18:02. Заголовок: SergKis пишет: Это ..
SergKis пишет: Понял, спасибо за разъяснение. 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4803
Зарегистрирован: 17.02.12
|
|
Отправлено: 14.09.25 23:52. Заголовок: gfilatov2002 Внес и..
gfilatov2002 Внес изменения в hmg 25.09 (ранее на ftp давал, сейчас свежие), положил на ftp, MDI пока не трогал В demo.prg варианты использования. Default Arg1 := _HMG_ThisFormName сделал
|
 |

|
|
|
| постоянный участник
|
Пост N: 4804
Зарегистрирован: 17.02.12
|
|
Отправлено: 15.09.25 19:39. Заголовок: gfilatov2002 Положи..
gfilatov2002 Положил расширенный вариант примера на ftp
|
 |

|
|
|
| moderator
|
Пост N: 2491
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.09.25 22:25. Заголовок: SergKis пишет: Поло..
SergKis пишет: | цитата: | | Положил расширенный вариант примера |
| OK 
|
 |

|
|
|
| постоянный участник
|
Пост 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) } ; ...
|
 |

|
|
|
| moderator
|
Пост N: 2492
Зарегистрирован: 11.02.10
|
|
Отправлено: 16.09.25 09:16. Заголовок: SergKis пишет: Пред..
SergKis пишет: Принято. Благодарю за помощь 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8042
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.09.25 10:59. Заголовок: Andrey пишет: Верси..
Andrey пишет: | цитата: | Версия МиниГуи 25.06Pro MsgDebug() портит текущий АЛИАС базы !!! |
| Разобрался с такой ошибкой ! Если в ТСБ назначить клавиши F3, F4, ... на не существующие события на окне, то происходит такая фигня. Лечится только перепроверкой своего кода. 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4806
Зарегистрирован: 17.02.12
|
|
Отправлено: 18.09.25 19:31. Заголовок: gfilatov2002 Положил..
gfilatov2002 Положил на ftp вариант и для MDI с примерами
|
 |

|
|
|
| постоянный участник
|
Пост 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
|
 |

|
|
|
| постоянный участник
|
Пост 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 ...
|
 |

|
|
|
| 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 |
| Теперь можно управлять этой функцией с помощью установки отладочного режима в приложении:
|
 |

|
|
|
| постоянный участник
|
Пост N: 4809
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.09.25 17:43. Заголовок: gfilatov2002 пишет A..
gfilatov2002 пишет Это немного не то. Если на окне ~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 ... вполне читаемо
|
 |

|
|
|
| moderator
|
Пост N: 2494
Зарегистрирован: 11.02.10
|
|
Отправлено: 20.09.25 17:57. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | можно управлять этой функцией с помощью установки отладочного режима |
| Видимо, я высказался непонятно. Теперь в отлаженной программе НЕ будет такой проверки. Если потребуется делать такую проверку, то это возможно в режиме отладки, который включается с помощью вызова
|
 |

|
|
|
| постоянный участник
|
Пост 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
|
 |

|
|
|
| moderator
|
Пост N: 2495
Зарегистрирован: 11.02.10
|
|
Отправлено: 20.09.25 18:15. Заголовок: SergKis пишет: надо..
SergKis пишет: | цитата: | | надо вставлять в INIT PROCEDURE ... AltD( App.Cargo:oIni:nVerifyControl ) Где nVerifyControl = 0\1 |
| Да, верно. 
|
 |

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

|
|
|
| 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 |
|
|
 |

|
|
|
| постоянный участник
|
Пост N: 4813
Зарегистрирован: 17.02.12
|
|
Отправлено: 20.09.25 18:55. Заголовок: gfilatov2002 :sm36..
gfilatov2002 AltD(0) 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4814
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.09.25 23:50. Заголовок: gfilatov2002 Положи..
gfilatov2002 Положил вариант примера basic\mdi_2 на ftp
|
 |

|
|
|
| moderator
|
Пост N: 2499
Зарегистрирован: 11.02.10
|
|
Отправлено: 23.09.25 15:34. Заголовок: Благодарю за поправк..
Благодарю за поправки в функции _TBrowse() P.S. Добавил пропущенный второй параметр при определении кодового блока | цитата: | {|ob,op| _TBrowse_bAdjColumns(ob,op) } |
|
|
 |

|
|
|
| постоянный участник
|
Пост 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 ...
|
 |

|
|
|
| постоянный участник
|
Пост 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
|
 |

|
|
|
| moderator
|
Пост N: 2500
Зарегистрирован: 11.02.10
|
|
Отправлено: 26.09.25 14:15. Заголовок: SergKis пишет: Пред..
SergKis пишет: Большое спасибо за эти дополнения. Обязательно посмотрю новые примеры с подключением третьей базы. P.S. Все изменения приняты, примеры 8 и 9 стали компактными. 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4817
Зарегистрирован: 17.02.12
|
|
Отправлено: 26.09.25 23:05. Заголовок: gfilatov2002 Добави..
gfilatov2002 Добавил назначение событий нажатий кнопок мышки, положил на ftp
|
 |

|
|
|
| постоянный участник
|
Пост 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 ...
|
 |

|
|
|
| moderator
|
Пост N: 2501
Зарегистрирован: 11.02.10
|
|
Отправлено: 27.09.25 15:56. Заголовок: SergKis пишет: прав..
SergKis пишет: OK Благодарю за дополнения 
|
 |

|
|
|
| постоянный участник
|
Пост 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
|
 |

|
|
|
| постоянный участник
|
Пост N: 4820
Зарегистрирован: 17.02.12
|
|
Отправлено: 28.09.25 10:00. Заголовок: gfilatov2002 На ftp..
gfilatov2002 На ftp положил пример, по использованию, на основе примера от Андрея
|
 |

|
|
|
| moderator
|
Пост N: 2502
Зарегистрирован: 11.02.10
|
|
Отправлено: 28.09.25 10:39. Заголовок: SergKis пишет: поло..
SergKis пишет: | цитата: | | положил пример, по использованию |
| Большое спасибо 
|
 |

|
|
|
| постоянный участник
|
Пост 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 ) ...
|
 |

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

|
|
|
| постоянный участник
|
Пост 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
|
 |

|
|
|
| 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 ) |
| 
|
 |

|
|
|
| постоянный участник
|
Пост 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 ) не использовал
|
 |

|
|
|
| moderator
|
Пост N: 2507
Зарегистрирован: 11.02.10
|
|
Отправлено: 02.10.25 12:59. Заголовок: SergKis пишет: не в..
SergKis пишет: | цитата: | | не все контролы имеют объект |
| Понял, принято. Благодарю за пояснение. 
|
 |

|
|
|
| постоянный участник
|
Пост 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, "Нельзя работать", "Можно работать"), ... }
|
 |

|
|
|
| постоянный участник
|
Пост N: 8052
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.10.25 15:09. Заголовок: Григорий, как из сво..
Григорий, как из своей программы изменить цвета Program error ? Я задаю свои функции Alert*() на базе твоих... 
|
 |

|
|
|
| moderator
|
Пост N: 2508
Зарегистрирован: 11.02.10
|
|
Отправлено: 05.10.25 19:50. Заголовок: Andrey пишет: как и..
Andrey пишет: | цитата: | | как из своей программы изменить цвета Program error |
| Сейчас эти цвета задаются в ядре без возможности их изменения извне. Но, конечно, возможно добавить логику для их задания пользователем. 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8053
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.10.25 22:14. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Но, конечно, возможно добавить логику для их задания пользователем. |
| Сделайте пожалуйста ! 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4828
Зарегистрирован: 17.02.12
|
|
Отправлено: 07.10.25 23:46. Заголовок: gfilatov2002 Положи..
gfilatov2002 Положил ftp предложение по :FilterFTS(...) для массива
|
 |

|
|
|
| moderator
|
Пост N: 2509
Зарегистрирован: 11.02.10
|
|
Отправлено: 08.10.25 10:11. Заголовок: SergKis пишет: пред..
SergKis пишет: | цитата: | | предложение по :FilterFTS(...) для массива |
| OK Благодарю за помощь 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4829
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.10.25 20:49. Заголовок: gfilatov2002 положи..
gfilatov2002 положил yf ftp предложение и пример по :FilterFTS(...)
|
 |

|
|
|
| постоянный участник
|
Пост N: 4830
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.10.25 21:10. Заголовок: gfilatov2002 Возьми..
gfilatov2002 Возьмите пример еще раз, забыл проверить его на фонты 12, 14, 16 размера
|
 |

|
|
|
| постоянный участник
|
Пост 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.
|
 |

|
|
|
| moderator
|
Пост N: 2510
Зарегистрирован: 11.02.10
|
|
Отправлено: 08.10.25 21:36. Заголовок: SergKis пишет: Calc..
SergKis пишет: Увы, использование этого метода перемещает указатель на второй элемент массива при нажатии мышкой на пустой Getbox. Если, убрать вызов :CalcTotal(), то указатель остается на первом элементе массива после отработки метода FilterFTS() . Можно это поправить 
|
 |

|
|
|
| постоянный участник
|
Пост 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 доработанные примеры
|
 |

|
|
|
| moderator
|
Пост N: 2511
Зарегистрирован: 11.02.10
|
|
Отправлено: 09.10.25 09:23. Заголовок: SergKis пишет: Поло..
SergKis пишет: | цитата: | | Положил на ftp доработанные примеры |
| Большое спасибо за оперативность! Примеры работают нормально. 
|
 |

|
|
|
| moderator
|
Пост N: 2512
Зарегистрирован: 11.02.10
|
|
Отправлено: 09.10.25 10:43. Заголовок: Всем, кому это интересно...
Выложил новую сборку 25.10 Стандартная версия click here ПРО-версия (архив под паролем) click here В эту сборку были добавлены все последние предложения Сергея вместе с поясняющими примерами. Желаю всем хорошего дня! 
|
 |

|
|
|
| постоянный участник
|
Пост 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
|
 |

|
|
|
| постоянный участник
|
Пост N: 4833
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.10.25 13:15. Заголовок: sashaBG пишет работа..
sashaBG пишет | цитата: | | работает многословный поиск со знаком .and. между словами |
| Работает такой вариант, но он учтет и не нужный вариант, например cFind := "Краска белая" "Краска матовая белая" "Краска белая" "Краска ... белая" "Белая ... краска " т.е. выбор не совсем тот, что просили, нужно указание разделителя в первых байтах, например, в своих поисках использовал алгоритм, если в 1-ом байте " ", то поиск на вхождение, если нет, то на точное равенство слева заданного. В данном случае можно поступить так же, если 1-ый байт " ", то ваш алгоритм aFind := hb_ATokens( Upper( alltrim(cFind) ) ), иначе, как сейчас
|
 |

|
|
|
| постоянный участник
|
Пост N: 4834
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.10.25 18:17. Заголовок: gfilatov2002 Попроб..
gfilatov2002 Попробовал добавить вариант от sashaBG в :FilterFTS с вкл. его алгоритма от наличия первого пробела в cFind, работает. Сделал Скрытый текст
METHOD FilterFTS( cFind, lUpper, lBottom, lFocus, lAll ) CLASS TSBrowse LOCAL nLen := 0, cAlias := ::cAlias, ob := Self LOCAL aArray, aLine, nLine, nCol, oCol, xVal, lRet LOCAL nAtPos, nLastPos, aFind, nFind := 0 DEFAULT lUpper := .T., lAll := .F. IF !HB_ISCHAR( cFind ) .or. Len( cFind ) == 0 RETURN nFind ENDIF IF lUpper cFind := Upper( cFind ) ENDIF IF Left( cFind, 1 ) == " " aFind := hb_ATokens( substr( cFind, 2 ) ) ELSE aFind := { cFind } ENDIF IF ::lIsDbf IF ! Empty( cFind ) ( cAlias )->( dbSetFilter( {|| ob:FilterFTS_Line( cFind, lUpper, lAll, ob ) }, ; "ob:FilterFTS_Line( cFind, lUpper, lAll, ob)" ) ) ELSE ( cAlias )->( dbClearFilter() ) ENDIF ( cAlias )->( dbGoTop() ) DO While !( cAlias )->( Eof() ) SysRefresh() nLen++ ( cAlias )->( dbSkip( 1 ) ) ENDDO nFind := nLen ::bLogicLen := {|| nLen } ::lInitGoTop := .T. ::Reset( lBottom ) ELSEIF ::lIsArr .AND. ! Empty( cFind ) IF ::aArray_FTS == NIL ::aArray_FTS := ::aArray ELSE ::aArray := ::aArray_FTS ENDIF nAtPos := ::nAt nLastPos := ::nLastPos aArray := {} FOR EACH aLine IN ::aArray nLine := hb_enumindex( aLine ) ::nAt := nLine FOR EACH oCol IN ::aColumns nCol := hb_enumindex( oCol ) IF nCol == 1 .AND. ::lSelector ; LOOP ELSEIF ! oCol:lVisible ; LOOP ELSEIF oCol:lBitMap ; LOOP ENDIF xVal := ob: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 ) FOR EACH cFind IN aFind IF lUpper lRet := cFind $ Upper( xVal ) ELSE lRet := cFind $ xVal ENDIF IF !lRet EXIT ENDIF NEXT IF lRet AAdd( aArray, aLine ) EXIT ENDIF ENDIF NEXT ::Skip() NEXT ::nAt := nAtPos ::nLastPos := nLastPos IF ( nFind := Len( aArray ) ) > 0 ::aArray := aArray ::Reset( lBottom ) ELSEIF IsArray( ::aArray_FTS ) ::aArray := { Array( Len( ::aArray_FTS[1] ) ) } ::Reset( lBottom ) ENDIF ELSEIF ::lIsArr .AND. Empty( cFind ) IF IsArray( ::aArray_FTS ) ::aArray := ::aArray_FTS ::aArray_FTS := NIL ENDIF nFind := Len( ::aArray ) ::Reset( lBottom ) ENDIF IF ! Empty( lFocus ) ::SetFocus() ENDIF RETURN nFind METHOD FilterFTS_Line( cFind, lUpper, lAll ) CLASS TSBrowse LOCAL nCol, oCol, xVal, 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 ! 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 ) FOR EACH cFind IN aFind IF lUpper lRet := cFind $ Upper( xVal ) ELSE lRet := cFind $ xVal ENDIF IF !lRet EXIT ENDIF NEXT IF lRet EXIT ENDIF ENDIF NEXT RETURN lRet
| В примерах Advanced\Tsb_FilterFTS поправил demo.prg ... b2 := {|| Local cVal := Trim( This.Value ) ... demo2.prg ... oac:oBlk:b_2 := {|| Local cVal := Trim( This.Value ) ... Т.е. поиск в длинном тексте колонки с .and. работает в таком варианте
|
 |

|
|
|
| moderator
|
Пост N: 2513
Зарегистрирован: 11.02.10
|
|
Отправлено: 10.10.25 18:54. Заголовок: SergKis пишет: от н..
SergKis пишет: | цитата: | | от наличия первого пробела в cFind, работает |
| OK У меня тоже работает. Но теперь надо объяснять пользователям насчет использования первого пробела для поиска в длинных строках. Это реально сделать 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4835
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.10.25 19:11. Заголовок: С Clipper87 такая фи..
С Summer87 такая фишка работала (как я писал выше про поиск $ или на ==) и всегда с новой версией все в один голос говорили, что бы это не менял. Так, что даже не знаю, что сказать  Но убирается режим легко (на уровне разработчика), в примере, вместо Trim(cVal), ставим AllTrim(cVal)
|
 |

|
|
|
| moderator
|
Пост N: 2514
Зарегистрирован: 11.02.10
|
|
Отправлено: 10.10.25 19:23. Заголовок: SergKis пишет: все ..
SergKis пишет: | цитата: | | все в один голос говорили, что бы это не менял |
| 
|
 |

|
|
|
| постоянный участник
|
Пост 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
|
 |

|
|
|
| moderator
|
Пост N: 2515
Зарегистрирован: 11.02.10
|
|
Отправлено: 11.10.25 21:25. Заголовок: SergKis пишет: Пред..
SergKis пишет: | цитата: | | Предлагаю дать возможность разработчику делать свои окна вместо системных. |
| Такая возможность есть в библиотеке изначально. Базовые примеры находятся в папках Basic\Hmg_Error Basic\Hmg_Error_2 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4837
Зарегистрирован: 17.02.12
|
|
Отправлено: 11.10.25 21:58. Заголовок: gfilatov2002 пишет Т..
gfilatov2002 пишет | цитата: | | Такая возможность есть в библиотеке изначально |
| Подмена системы обработок ошибок (она существует давно с clipper времен), это несколько не то, что я предложил. Система обработок ошибок остается как есть, заменяем только окно вывода ошибки, которое часто вылазит за пределы экрана, искажается и хочется, как Андрею, покраску и фонты сменить в некоторых строках вывода, а может и не выдавать окно, просто вернув, например, .F.. Обработка ErrorLog.htm или тексты cErr можно отработать и в др. месте. Окно ошибки пугает user и вполне при сбое можно перезапустить модуль на прежнее окно работы, даже без сообщений, сморгнул экран для user и дальше работай
|
 |

|
|
|
| |
Пост N: 2000
Зарегистрирован: 20.02.11
|
|
Отправлено: 11.10.25 23:40. Заголовок: SergKis пишет: Пре..
SergKis пишет: | цитата: | Предлагаю дать возможность разработчику делать свои окна вместо системных. Для этого небольшая правка ErrorSys.prg |
| Стесняюсь спросить, а зачем? Пользователю насрать на красоту сообщения об ошибке, если разраб их обрабатывает, то и юзер эту красоту не увидит. Если нужно о чем то предупредитт юзера, то у разраба полно способов нарисовать свое окно любое. Errorsys открыт полностью, делай что хочешь, объект ошибки не бином Ньютона, чес слово не понял смысла зачем изобретать велосипед. А то становится похоже на мем, программа, работает ху*во, но ошибки показывает красиво 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8058
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.10.25 00:51. Заголовок: Haz пишет: Errorsys..
Haz пишет: | цитата: | | Errorsys открыт полностью, делай что хочешь, |
| Сделал правку его, прога у заказчика не всегда показывает ошибки, писал уже ранее - выдаёт ошибки, что нет фонта на окне и ошибка НЕ ТА, что привела к краху. У меня работает без сбоев, у заказчика периодически вылетает. Сам видел ошибку - на хорошем сервере - ошибка SELECT базы, хотя потом после перезапуска, прога работает без ошибок в этом месте программы. Хрень получается... Переключение между прогами 1С, Мозилой и Минигуи - непонятная штука, особенно если у заказчика мало памяти. Сейчас после замены на свой Alert*() вот такое окно: Юзер будет в шоке. А если пришлет такую ошибку на телефон, то ни фига не видно ! Из-за этого и просил изменить цвета.
|
 |

|
|
|
| постоянный участник
|
Пост N: 4838
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.10.25 06:48. Заголовок: Haz пишет Пользовате..
Haz пишет | цитата: | | Пользователю насрать на красоту сообщения об ошибке |
| Глубокое заблуждение, при приеме, вникают в каждую букву, не то что в окно, его вид, если заказчик серьезный. | цитата: | | Errorsys открыт полностью, делай что хочешь, объект ошибки не бином Ньютона, чес слово не понял смысла зачем изобретать велосипед |
| Сейчас так и есть, обработчик со времен Clipper5\VO, перенесенный в hb, таскается из проекта в проект. Зачем, если обработчик текущий в hmg устраивает ? Мешает, что нет возможности отключить окно конечное совсем или заменить его своим. Это и ограничивает свободу действий, именно, как разработчика систем. Предложение совсем копеечное, обработать спец. символы или .T.\.F. в имеющейся, готовой системе обработок ошибок, кому не нужно - даже не заметит этого | цитата: | | А то становится похоже на мем, программа, работает ху*во, но ошибки показывает красиво |
| А если наоборот ? Программа работает красиво, а ошибки криво и это заложено по умолчанию, в стандарт, т.к. сейчас часто Alert окно искажено, т.е. тексты уходят вправо за экран и вниз, а кнопка <OK> поверх текста
|
 |

|
|
|
| |
Пост N: 2002
Зарегистрирован: 20.02.11
|
|
Отправлено: 12.10.25 09:14. Заголовок: SergKis пишет: ошиб..
SergKis пишет: | цитата: | ошибки криво и это заложено по умолчанию, в стандарт, т.к. сейчас часто Alert окно искажено, т.е. тексты уходят вправо за экран и вниз, а кнопка <OK> поверх текста |
| Так я о том, что все строится на объекте ошибки и инструментария создать свою обработку и тем более раскрасить ее по своему вкусу предостаточно. На вкус и цвет все фломастеры разные и в некоторых интерфейсах Алерт выглядит как красная тряпка перед быком, тем более со стеком вызова процедур при виде которого пользователь не понимает ровным счётом ничего Если не устраивает стандартная процедура обработки, делаем свою с подробным протоколом и автоматической отправкой разработчику, если нужно предупредить пользователя вывешиваем флаг с лозунгами что уже знаем и работаем. Тем более , что информация об ошибке стандартным обработчиком иногда ни о чем. К примеру при открытом через ole excel читается текстовой файл параметров и если файла нет выдаёт discspace(0) при сотнях гигов свободного места Уже как то обсуждали , и мое мнение нужно не окно на пол экрана со стеком в цветах африканского авангарда,а удобный инструмент логирования ошибки, оправки лога разработчику и удобный вьюер этого лога. Пользователю достаточно обычного окна с уведомлениями о том что ситуация контролируется.
|
 |

|
|
|
| постоянный участник
|
Пост N: 4839
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.10.25 10:15. Заголовок: Haz пишет Если не ус..
Haz пишет | цитата: | | Если не устраивает стандартная процедура обработки, делаем свою с подробным протоколом и автоматической отправкой разработчику |
| УСТРАИВАЕТ ! Кроме окна сообщения MsgStop() или Alert и ничего лишнего не надо, все есть в параметрах пользовательского блока кода, что и куда девать это совсем др. вопрос
|
 |

|
|
|
| постоянный участник
|
Пост 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
|
 |

|
|
|
| moderator
|
Пост N: 2516
Зарегистрирован: 11.02.10
|
|
Отправлено: 12.10.25 12:49. Заголовок: Andrey пишет: Из-за..
Andrey пишет: | цитата: | | Из-за этого и просил изменить цвета. |
| Проблема с цветами сообщения об ошибке уже решена. Сейчас возможно настроить все цвета в этом сообщении. SergKis пишет: | цитата: | | сейчас часто Alert окно искажено, т.е. тексты уходят вправо за экран и вниз, а кнопка <OK> поверх текста |
| Эту проблему тоже решил. Благодарю всех за это полезное обсуждение 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4840
Зарегистрирован: 17.02.12
|
|
Отправлено: 12.10.25 16:58. Заголовок: gfilatov2002 пишет П..
gfilatov2002 пишет | цитата: | Проблема с цветами сообщения об ошибке уже решена. Сейчас возможно настроить все цвета в этом сообщении |
| Это хорошо Но обработка ошибок, это одно, а вывод их на устройства (диск, console, gui), это другое, как и то куда девать данные об ошибке
|
 |

|
|
|
| постоянный участник
|
Пост 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 := ... в списке колонок
|
 |

|
|
|
| moderator
|
Пост N: 2518
Зарегистрирован: 11.02.10
|
|
Отправлено: 16.10.25 09:53. Заголовок: SergKis пишет: Прав..
SergKis пишет: OK. Благодарю за помощь 
|
 |

|
|
|
| |
Пост 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 файлы не переписываются из архива, хотя раньше всё работало.
|
 |

|
|
|
| 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. 
|
 |

|
|
|
| |
Пост N: 188
Зарегистрирован: 12.07.06
|
|
Отправлено: 18.10.25 19:16. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | P.S. Я уже сделал необходимые правки кода, чтобы восстановить предыдущий функционал команды UNCOMPRESS. |
| Спасибо за разъяснение, а пока подожду на версии 25.03 
|
 |

|
|
|
| постоянный участник
|
Пост 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 задан ?
|
 |

|
|
|
| moderator
|
Пост N: 2521
Зарегистрирован: 11.02.10
|
|
Отправлено: 21.10.25 10:21. Заголовок: SergKis пишет: надо..
SergKis пишет: | цитата: | | надо сделать, Default lPicture := .T. |
| Принято с использованием этого параметра, как наиболее универсальный вариант. Если задано oCol:cPicture, то эта установка в приоритете, с возможностью включить ее использование с помощью параметра lPicture := .T., который по умолчанию задан, как lPicture := .F. 
|
 |

|
|
|
| moderator
|
Пост N: 2524
Зарегистрирован: 11.02.10
|
|
Отправлено: 01.11.25 15:56. Заголовок: Всем кому это интересно
Подготовил первый релиз-кандидат для ПРО-версии сборки 25.11 Кратко, что нового: Скрытый текст
Fixes * Memory leaks in CHECKLABEL control: this fix avoids memory and GDI leaks that would previously happen when replacing images or destroying windows. * HbZipArc library: hb_ZipFile() and hb_UnzipFile() major fixes. New * Adaptation of MiniGUI core is completed for using Zig language as LLVM C compiler frontend. Please note that the library format of this compiler is fully compatible with MinGW. Updates * Improved output of the Error message window with using SET SHOWREDALERT ON command. * Unicode support: Fixed getting the name of the currently set hotkey in HotKeyBox. * TSBrowse 9.0 adaptation: Improved FilterFTS() method now works with arrays and added new CalcTotal() method. * Update for using SQLITE3 version 3.51.0 (from 3.50.4). * Updated Harbour Compiler 3.2.0dev (SVN 2025-10-23 21:45): * updated hbmk2 tool to define __ARCH64BIT__ at .prg level; * added support for using Zig as LLVM C compiler frontend; * added use of read lock when accessing the FPT memo file. New Samples * Simple ChartView class for GraphPlus library. * CSV Viewer for .txt, .csv and .arr files. Enhanced Samples * Refactored Arkanoid Mini Game 🎮 (PRO version). * Updated ChatGPT-generated samples. IMPORTANT NOTE I will only release the Standard build 25.11 if I get at least 10 upvotes that will donate to that build.
| Пока я НЕ знаю, когда будет опубликован этот релиз... Все зависит от интереса к этой работе у пользователей библиотеки. Желаю всем хороших выходных.
|
 |

|
|
|
| постоянный участник
|
Пост N: 8095
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.11.25 16:15. Заголовок: Да ! Новый релиз нуж..
Да ! Новый релиз нужен ! Ждем с не терпеньем ! Спасибо большое Григорий за твою огромную работу ! 
|
 |

|
|
|
| moderator
|
Пост N: 2526
Зарегистрирован: 11.02.10
|
|
Отправлено: 05.11.25 14:46. Заголовок: Andrey пишет: Новый..
Andrey пишет: Я могу опубликовать новую сборку хоть завтра, но НЕ вижу большого интереса у пользователей библиотеки (кроме ОДНОГО человека  ).
|
 |

|
|
|
| |
Пост N: 189
Зарегистрирован: 12.07.06
|
|
Отправлено: 06.11.25 05:41. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | Да ! Новый релиз нужен ! Ждем с не терпеньем ! Спасибо большое Григорий за твою огромную работу ! |
|
|
 |

|
|
|
| |
Пост N: 190
Зарегистрирован: 12.07.06
|
|
Отправлено: 06.11.25 05:44. Заголовок: Andrey пишет: Да ! ..
Andrey пишет: | цитата: | Да ! Новый релиз нужен ! Ждем с не терпеньем ! Спасибо большое Григорий за твою огромную работу ! |
| Присоединяюсь.
|
 |

|
|
|
| moderator
|
Пост N: 2527
Зарегистрирован: 11.02.10
|
|
Отправлено: 06.11.25 12:37. Заголовок: Выложил новую сборку..
Выложил новую сборку 25.11 Стандартная версия click here ПРО-версия (архив под паролем) click here Желаю всем хорошего дня! 
|
 |

|
|
|
| постоянный участник
|
Пост 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 нет в библиотеке. Хорошие же примеры, небольшие.
|
 |

|
|
|
| постоянный участник
|
Пост N: 207
Зарегистрирован: 15.09.05
|
|
Отправлено: 08.11.25 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
|
 |

|
|
|
| постоянный участник
|
Пост N: 4858
Зарегистрирован: 17.02.12
|
|
Отправлено: 08.11.25 14:25. Заголовок: sashaBG пишет Сначал..
sashaBG пишет | цитата: | | Сначало собрать строку, а потом в ней искать совпадения: |
| По мне, такой вариант сравнения не совсем, а может и совсем, не корректен, т.к. например, 2а последних символа одного поля + 2а первых символа следующего, дадут .T. для cFind, а это не так, по отдельности поля не совпадают с cFind. Возможно, для такого поиска надо применять метод :FilterData(cFilter, ...), т.к. в выражении cFilter можете определять для себя, какие поля идут слитно, а какие по отдельности или собрать строку по записи и проверить на вхождение заданного фрагмента
|
 |

|
|
|
| постоянный участник
|
Пост N: 208
Зарегистрирован: 15.09.05
|
|
Отправлено: 08.11.25 16:35. Заголовок: Спасибо за ответ!
Нет возражений! Попробую тогда через FilterData !
|
 |

|
|
|
| постоянный участник
|
Пост N: 8108
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.11.25 14:00. Заголовок: Опять кнопка убегает..
Опять кнопка убегает на окне ошибки ! 
|
 |

|
|
|
| постоянный участник
|
Пост N: 4861
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.11.25 13:51. Заголовок: gfilatov2002 Правка..
gfilatov2002 Правка METHOD FilterFTS( cFind, lUpper, lBottom, lFocus, lAll ) CLASS TSBrowse ... DEFAULT lUpper := .T., lAll := .F. IF !HB_ISCHAR( cFind ) cFind := "" ELSEIF lUpper cFind := Upper( cFind ) ENDIF IF Left( cFind, 1 ) == " " .and. Len( cFind ) > 1 aFind := hb_ATokens( substr( cFind, 2 ) ) ELSE ... METHOD CalcTotal( cTotal, cNoTotal, lDraw, lPicture ) CLASS TSBrowse ... IF Empty( aSum[nK] ) xVal := "" ELSEIF !Empty( lPicture ) .and. !Empty( oCol:cPicture ) xVal := AllTrim( Transform( aSum[nK], oCol:cPicture ) ) IF "*" $ xVal xVal := hb_ntos( aSum[nK] ) ENDIF ELSE xVal := hb_ntos( aSum[nK] ) ENDIF oCol:cFooting := xVal ...
|
 |

|
|
|
| moderator
|
Пост N: 2528
Зарегистрирован: 11.02.10
|
|
Отправлено: 24.11.25 18:54. Заголовок: SergKis пишет: Прав..
SergKis пишет: Принято 
|
 |

|
|
|
| moderator
|
Пост N: 2529
Зарегистрирован: 11.02.10
|
|
Отправлено: 28.11.25 13:26. Заголовок: Всем кому это интересно...
Завершена подготовка обновленной ноябрьской сборки 25.11 Update 1, которая будет опубликована завтра Выход этой сборки стал возможен только благодаря поддержке Андрея Верченко Желаю всем хорошего дня! 
|
 |

|
|
|
| moderator
|
Пост N: 2530
Зарегистрирован: 11.02.10
|
|
Отправлено: 29.11.25 11:59. Заголовок: Выложил обновление с..
Выложил обновление сборки 25.11 Update 1 Стандартная бесплатная версия click here ПРО-версия (архив под паролем) click here Желаю всем хороших выходных! 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8122
Зарегистрирован: 12.09.06
|
|
Отправлено: 30.11.25 15:21. Заголовок: Вижу в ресурсах defa..
Вижу в ресурсах default.ico, но не вижу подключения в файлах *.rc Как подключить к себе в программу эту иконку ? Можно внести её в minigui.rc как 1MG ICON default.ico
|
 |

|
|
|
| |
Пост N: 8209
Зарегистрирован: 17.05.05
|
|
Отправлено: 30.11.25 19:30. Заголовок: Andrey пишет: но не..
Andrey пишет: | цитата: | | но не вижу подключения в файлах *.rc |
| c:\MiniGUI\SAMPLES\Applications\Cumple\cumple.rc c:\MiniGUI\SAMPLES\BASIC\Template\demo.rc c:\MiniGUI\UTILS\MPM\mpm.rc c:\MiniGUI\UTILS\MPMC\mpmc.rc
|
 |

|
|
|
| постоянный участник
|
Пост N: 4862
Зарегистрирован: 17.02.12
|
|
Отправлено: 30.11.25 20:13. Заголовок: Andrey C:\MiniG..
Andrey C:\MiniGUI\SAMPLES\BASIC\Template\demo.rc /* the first icon will also defines the executable icon in Explorer */ MAIN ICON ".\..\..\..\RESOURCES\DEFAULT.ICO" PAPER GIF "Paper.gif"
|
 |

|
|
|
| постоянный участник
|
Пост N: 8123
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.12.25 13:13. Заголовок: SergKis пишет: MAIN..
SergKis пишет: | цитата: | | MAIN ICON ".\..\..\..\RESOURCES\DEFAULT.ICO" |
| У меня другие пути к Минигуи. Проекты собираю на диске W:\ Эту иконку могу и в проект к себе в папку собирать, но это же не дело ! Легче в примерах писать так: SET DEFAULT ICON TO "1MG" Ресурсный файл МиниГуи увеличится на размер DEFAULT.ICO Там уже есть иконки... Сложно добавить ещё одну ? В папке C:\MiniGUI\SAMPLES 33 файлов размером 994308 байт - 1mg.ico Вот экономия места в самой библиотеке. Для анализа файлов в папке МиниГуи использовал проект mg_zip
|
 |

|
|
|
| |
Пост N: 2023
Зарегистрирован: 20.02.11
|
|
Отправлено: 01.12.25 19:15. Заголовок: Andrey пишет: Как п..
Andrey пишет: | цитата: | | Как подключить к себе в программу эту иконку |
| Ты уж определись с хотелками, себе в программу или всем ? Тем более икону, которую каждый под проект выбирает индивидуально.
|
 |

|
|
|
| постоянный участник
|
Пост N: 8125
Зарегистрирован: 12.09.06
|
|
Отправлено: 02.12.25 22:42. Заголовок: Haz пишет: Ты уж оп..
Haz пишет: | цитата: | | Ты уж определись с хотелками, себе в программу или всем ? |
| Всем ! 33 примера используют эту иконку. Для экономии места нужно ВСЕГО НАВСЕГО прописать эту иконку в ресурсном файле МиниГуи и всё. В дальнейшем примеры легко будет делать с главной иконкой МиниГуи.
|
 |

|
|
|
| |
Пост N: 2024
Зарегистрирован: 20.02.11
|
|
Отправлено: 03.12.25 16:46. Заголовок: Andrey пишет: Для э..
Andrey пишет: | цитата: | | Для экономии места нужно ВСЕГО НАВСЕГО прописать эту иконку в ресурсном файле МиниГуи и всё. |
| Странная экономия , да там полно дублей разных и BMP и DBF и ICO и AVI .... вот пример который создаст отчет о дублях Procedure Main() local cFile, aFiles, cDir, aFile, aHash, cStr, cKey aHash := hb_Hash() cDir := "c:\minigui" cFile := "" cStr := "" aFiles := {} aFiles := hb_DirScan( cDir, "*.*" ) nLen := 0 for each aFile in aFiles cKey := upper( hb_FNameNameExt( aFile[1] ) ) + "." + hb_ntoc( aFile[2] ) if !hb_hHasKey(aHash, cKey ) aHash[ cKey ] := hb_Hash() aHash[ cKey ]["COUNT"] := 1 aHash[ cKey ]["FILE"] := upper(hb_FNameNameExt( aFile[1] )) aHash[ cKey ]["SIZE"] := aFile[2] else aHash[ cKey ]["COUNT"] ++ aHash[ cKey ]["SIZE"] += aFile[2] end end cStr += PADR("FILE NAME", 30, " ") + " " + PadL("COUNT", 6, " ") + " " + PADL("SIZE", 13," ") + hb_eol() cStr += PADR("-", 30, " ") + " " + PadL("-", 6, " ") + " " + PADL("-", 13," ") + hb_eol() for Each cKey in hb_hKeys( aHash ) if aHash[ cKey ]["COUNT"] > 1 cStr += PADR(aHash[ cKey ]["FILE"], 30, " ") + " " + PadL(hb_ntoc(aHash[ cKey ]["COUNT"]), 6, " ") + " " + transform(aHash[ cKey ]["SIZE"], "9 999 999 999" )+ hb_eol() end end strFile( cStr, "Dupe.txt") Return nil уверен после просмотра результатат в Dupe/txt желание экономить пропадет 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8126
Зарегистрирован: 12.09.06
|
|
Отправлено: 03.12.25 17:33. Заголовок: Haz пишет: да там п..
Haz пишет: | цитата: | | да там полно дублей разных и BMP и DBF и ICO и AVI .. |
| Да я согласен с этим, что полно дублей. Просто насчёт иконки 1MG бросилось в глаза, вот и предложил. 1Мб только одной иконки в библиотеке, как то многовато !
|
 |

|
|
|
| постоянный участник
|
Пост N: 8127
Зарегистрирован: 12.09.06
|
|
Отправлено: 07.12.25 10:48. Заголовок: Добавил 1 строку в с..
Добавил 1 строку в старую прогу - Set ShowRedAlert On Теперь на ошибках прога просто вылетает ! Файл ErrorLog.htm создаётся, в нём 2 ошибки, моя и ещё вот такая: Error MGERROR/0 Control Btn_01 Of oDlg Not defined. Program terminated. --------------------------------- Stack Trace --------------------------------- Called from MSGMINIGUIERROR(0) Called from GETCONTROLHANDLE(0) Called from _CONTROLOBJ(0) Called from _CONTROLCARGO(0) Called from SETPROPERTY(0) Called from FILLDLG(0) Called from HMG_ALERT(0) Called from _ALERT(0) Called from ALERTSTOP(0) Called from SHOWERROR(0) Called from DEFERROR(0) Called from (b)ERRORSYS(0) Called from (b)MYPAGE_ABONCALL(967) in module: form_config_PC.prg Called from DO_CONTROLEVENTPROCEDURE(0) Called from _DEFINECHKLABEL(0) Called from MYPAGE_ABONCALL(967) in module: form_config_PC.prg Called from TAB_PC(300) in module: form_config_PC.prg Called from SHOW_PC_CONFIG(91) in module: form_config_PC.prg Called from (b)MYINITCONFIG(247) in module: form_config.prg Called from (b)METRO2BUTTON(235) in module: Metro_button.prg Called from _DOCONTROLEVENTPROCEDURE(0) Called from EVENTS(0) Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(0) Called from SHOW_CONFIG2(134) in module: form_config.prg Called from SHOW_CONFIG(37) in module: form_config.prg Called from (b)MAIN(326) in module: 14main.prg Called from DO_WINDOWEVENTPROCEDURE(0) Called from TWNDDATA:DOEVENT(0) Called from DO_ONWNDLAUNCH(0) Called from (b)INIT(0) Called from EVENTS(0) Called from DOEVENTS(0) Called from REFRESHWIN(976) in module: 14main.prg Called from (b)MAIN(269) in module: 14main.prg Called from _DOWINDOWEVENTPROCEDURE(0) Called from EVENTS(0) Called from SETFOCUS(0) Called from _SETFOCUS(0) Called from _SETACTIVATIONFOCUS(0) Called from _ACTIVATEWINDOW(0) Called from MAIN(348) in module: 14main.prg И как это исправить ? Чтобы окно ошибки было на экране.
|
 |

|
|
|
| постоянный участник
|
Пост N: 8129
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.12.25 18:24. Заголовок: Можно ли в объекте C..
Можно ли в объекте CHECKLABEL картинки заменить на иконки ? Очень плохо отображается круг bmp-картинке на форме - зубчиками !!!
|
 |

|
|
|
| moderator
|
Пост N: 2531
Зарегистрирован: 11.02.10
|
|
Отправлено: 13.12.25 19:42. Заголовок: Andrey пишет: Очень..
Andrey пишет: | цитата: | | Очень плохо отображается круг bmp-картинке на форме |
| | цитата: | /* * MINIGUI - Harbour Win32 GUI library Demo * * Copyright 2012 Janusz Pora <januszpora@onet.eu> * * Revised by Grigory Filatov, 2017-2025 */ SET PROCEDURE TO clradio.prg #include "minigui.ch" FUNCTION Main() LOCAL aRadio SET FONT TO 'MS Shell Dlg', 12 DEFINE WINDOW Form_Main ; AT 0, 0 ; WIDTH 640 HEIGHT 480 ; TITLE 'MiniGUI Check Label Demo' ; MAIN BACKCOLOR {236,240,250} /* @ 40, 50 BUTTON Btn1 ; CAPTION "Check Label_2" ; WIDTH 120 DEFAULT ; ACTION Form_Main.Label_2.Checked := .T. @ 80, 50 BUTTON Btn2 ; CAPTION "Uncheck Label_2" ; WIDTH 120 ; ACTION Form_Main.Label_2.Checked := .F. */ @ 150, 30 CHECKLABEL Label_1 ; WIDTH 200 HEIGHT 20 ; VALUE 'Check Label_1 standard' ; CHECKED ; ON MOUSEHOVER Rc_Cursor( "MINIGUI_FINGER" ) @ 180, 15 FRAME Frame_1 WIDTH 470 HEIGHT 230 CAPTION "CheckBox and RadioGroup Emulation" FONTCOLOR NAVY /* DEFINE CHECKLABEL Label_2 ROW 200 COL 30 WIDTH 190 HEIGHT 18 VALUE 'Left Check Label_2 with images' LEFTCHECK .T. TRANSPARENT .T. IMAGE { 'Check', 'UnCheck' } TOOLTIP 'CheckLabel Control' FONTCOLOR NAVY ON MOUSEHOVER ( Rc_Cursor( "MINIGUI_FINGER" ), Form_Main.Label_2.FONTCOLOR := BLUE ) ON MOUSELEAVE ( Form_Main.Label_2.FONTCOLOR := NAVY ) VCENTERALIGN .T. END CHECKLABEL @ 200, 300 CHECKBOX Check_1 CAPTION ' CheckBox Check_1 standard' ; WIDTH 180 ; HEIGHT 21 ; VALUE .F. ; TOOLTIP 'CheckBox Control' ; FONTCOLOR NAVY */ aRadio := CLRadio_Create( ; "RB_Custom", ; Form_Main.NAME, ; 250, 30, ; 100, 18, ; { 'One', 'Two', 'Three', 'Four' }, ; { 'radio1.bmp', 'radio2.bmp' }, ; NAVY, BLUE, ; 1, ; 25, ; .F. ) CLRadio_Create( "RB2", Form_Main.NAME, 210, 30, 100, 36, { 'One', 'Two', 'Three', 'Four' }, { 'CheckT32', 'CheckF32' }, NAVY, BLUE, 1, 50, .T. ) DEFINE RADIOGROUP Radio_1 ROW 246 COL 300 OPTIONS { 'One', 'Two', 'Three', 'Four' } VALUE 1 WIDTH 100 TOOLTIP 'Radio Group Control' FONTCOLOR NAVY END RADIOGROUP @ 360, 30 BUTTON Btn3 ; CAPTION "Get CheckLabel Radio Value" ; WIDTH 200 ; ACTION MsgInfo ( CLRadio_GetValue( Form_Main.NAME, aRadio ), 'CheckLabel Group' ) SIZE 10 @ 360, 300 BUTTON Btn4 ; CAPTION "Get Radio Group Value" ; WIDTH 160 ; ACTION MsgInfo ( Form_Main.Radio_1.VALUE, 'Radio Group' ) SIZE 10 ON KEY ESCAPE ACTION ThisWindow.RELEASE END WINDOW CENTER WINDOW Form_Main ACTIVATE WINDOW Form_Main RETURN NIL |
| Полный текст примера отправил по почте...
|
 |

|
|
|
| |
Пост N: 192
Зарегистрирован: 12.07.06
|
|
Отправлено: 15.12.25 19:05. Заголовок: Вопрос к Григорию
Работаю на версии: 2025/11/06: HMG Extended Edition version 25.11 и BCC 5.8. Проблема с примером из папки Updating_program_from_website, а точнее c build3.bat. Я хотел его реализовать через стандартный батник Compile.Bat, но после подключения hbcurl.lib и hbcurls.lib появляется масса неразрешенных ссылок, которые очевидно находятся в libcurl.dll, он у меня есть, но как его использовать я не понимаю, если бы libcurl был в виде lib'а, проблемы бы не было. hbmk2.exe в build3.bat как то собирает ехешник без libcurl.dll. Проблема в том, что я работаю в xMate, а там не используется hbmk2.exe и проект останавливается на шаге линковки. Можно указать чтобы iLink32.exe эти ссылки игнорировал?
|
 |

|
|
|
| |
Пост N: 193
Зарегистрирован: 12.07.06
|
|
Отправлено: 15.12.25 19:05. Заголовок: Вопрос к Григорию
Работаю на версии: 2025/11/06: HMG Extended Edition version 25.11 и BCC 5.8. Проблема с примером из папки Updating_program_from_website, а точнее c build3.bat. Я хотел его реализовать через стандартный батник Compile.Bat, но после подключения hbcurl.lib и hbcurls.lib появляется масса неразрешенных ссылок, которые очевидно находятся в libcurl.dll, он у меня есть, но как его использовать я не понимаю, если бы libcurl был в виде lib'а, проблемы бы не было. hbmk2.exe в build3.bat как то собирает ехешник без libcurl.dll. Проблема в том, что я работаю в xMate, а там не используется hbmk2.exe и проект останавливается на шаге линковки. Можно указать чтобы iLink32.exe эти ссылки игнорировал?
|
 |

|
|
|
| постоянный участник
|
Пост N: 8130
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.12.25 15:07. Заголовок: alex_II пишет: Проб..
alex_II пишет: | цитата: | Проблема с примером из папки Updating_program_from_website, а точнее c build3.bat. Я хотел его реализовать через стандартный батник Compile.Bat, но после подключения hbcurl.lib и hbcurls.lib появляется масса неразрешенных ссылок, которые очевидно находятся в libcurl.dll, он у меня есть, но как его использовать я не понимаю, если бы libcurl был в виде lib'а, проблемы бы не было. |
| Компилирую build3.bat - прога собирается нормально. В demo3.hbp используются эти библиотеки - брать их к себе только из этой версии МиниГуи и Харбора. # paths to the main and extension *.Lib -llibcurl -lhbcurl Вот собранные примеры из в версии МиниГуи 25.11 (Standard) - https://cloud.mail.ru/public/8PXb/hLQiDqbLC Попробуй собрать в xMate отдельно этот пример. Скорее всего берутся другие библиотеки из-за этого и не собирается пример в в xMate. Я ушёл с в xMate из-за его капризности.
|
 |

|
|
|
| |
Пост N: 194
Зарегистрирован: 12.07.06
|
|
Отправлено: 16.12.25 15:56. Заголовок: Благодарю за пример,..
Благодарю за пример, я его еще ранее основательно изучил. Andrey пишет: | цитата: | # paths to the main and extension *.Lib -llibcurl -lhbcurl |
| -llibcurl тут подразумевается libcurl.lib, но эту библиотеку я нигде не могу найти, есть только libcurl.dll, но её линковщик не видит.
|
 |

|
|
|
| |
Пост N: 195
Зарегистрирован: 12.07.06
|
|
Отправлено: 16.12.25 15:58. Заголовок: Благодарю за пример,..
Благодарю за пример, я его еще ранее основательно изучил. Andrey пишет: | цитата: | # paths to the main and extension *.Lib -llibcurl -lhbcurl |
| -llibcurl тут подразумевается libcurl.lib, но эту библиотеку я нигде не могу найти, есть только libcurl.dll, но её линковщик не видит.
|
 |

|
|
|
| |
Пост N: 196
Зарегистрирован: 12.07.06
|
|
Отправлено: 16.12.25 15:58. Заголовок: Благодарю за пример,..
Благодарю за пример, я его еще ранее основательно изучил. Andrey пишет: | цитата: | # paths to the main and extension *.Lib -llibcurl -lhbcurl |
| -llibcurl тут подразумевается libcurl.lib, но эту библиотеку я нигде не могу найти, есть только libcurl.dll, но её линковщик не видит.
|
 |

|
|
|
| |
Пост N: 8211
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.12.25 17:41. Заголовок: alex_II у меня тут ..
alex_II у меня тут лежит c:\MiniGUI\Harbour\lib\
|
 |

|
|
|
| постоянный участник
|
Пост N: 8131
Зарегистрирован: 12.09.06
|
|
Отправлено: 16.12.25 17:42. Заголовок: alex_II пишет: но э..
alex_II пишет: | цитата: | | но эту библиотеку я нигде не могу найти |
| Открываем в Far-е папку C:\MiniGUI_25111 (это у меня такая папка), здесь открываем поиск по файлам и задаём - libcurl.lib Far найдёт эту библиотеку по пути C:\MiniGUI_25111\Harbour\lib\libcurl.lib
|
 |

|
|
|
| |
Пост N: 197
Зарегистрирован: 12.07.06
|
|
Отправлено: 17.12.25 04:54. Заголовок: UPS, вы открыли мне ..
UPS, вы открыли мне веки! 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8140
Зарегистрирован: 12.09.06
|
|
Отправлено: 13.01.26 13:36. Заголовок: Версия МиниГуи 25.11..
Версия МиниГуи 25.11.1 - опять кнопка на окне ошибки прячется на окне ввода ! Не возможно нажать кнопку Ок: 
|
 |

|
|
|
| moderator
|
Пост N: 2534
Зарегистрирован: 11.02.10
|
|
Отправлено: 22.01.26 09:56. Заголовок: Выложил новую сборку..
Выложил новую сборку 26.01 Стандартная версия click here ПРО-версия (архив под паролем) click here Желаю всем хорошего дня! 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8142
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.01.26 08:51. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: * Updated: Adaptation FiveWin Class TSBrowse 9.0 in HMG: - pacified the warnings in the C code for compatibility with Zig compiler. Когда будет версия МиниГуи под Zig ? В чём преимущества этого компилятора ?
|
 |

|
|
|
| |
Пост N: 8233
Зарегистрирован: 17.05.05
|
|
Отправлено: 26.01.26 20:47. Заголовок: Andrey пишет: В чём..
Andrey пишет: | цитата: | | В чём преимущества этого компилятора ? |
| так сам погугли , тут же не справочная ))
|
 |

|
|
|
| постоянный участник
|
Пост N: 8143
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.01.26 08:39. Заголовок: Dima пишет: так сам..
Dima пишет: | цитата: | | так сам погугли , тут же не справочная )) |
| Интересно мнение Григория, почему стал делать такую тяжёлую работу.
|
 |

|
|
|
| |
Пост N: 2030
Зарегистрирован: 20.02.11
|
|
Отправлено: 29.01.26 13:27. Заголовок: h_tbrowse.prg строка..
h_tbrowse.prg строка 19925 ::bGoToPos := {| n | Eval( ::bKeyNo, n, Self ) } выделенное красным возможно опечатка при вызове bGoToPos этот Self нигде не используется и заявлен только в ветке с "ADS" $ ::cDriver , с другими драйверами нет устраиваю Crash test своей системе - в потоке рублю окна и коннект к серверу , в целом восстановление программы происходит нормально. Идет переподключение и восстановление окон но пару раз был полный краш с указанием h_tbrowse.prg строка 19925 после удаления в h_tbrowse.prg параметра Self эта строка исчезла . Если нет тайного смысла использования этого Self => может удалить из исходника
|
 |

|
|
|
| moderator
|
Пост N: 2535
Зарегистрирован: 11.02.10
|
|
Отправлено: 29.01.26 18:40. Заголовок: Haz пишет: может уд..
Haz пишет: | цитата: | | может удалить из исходника |
| OK 
|
 |

|
|
|
| moderator
|
Пост N: 2536
Зарегистрирован: 11.02.10
|
|
Отправлено: 08.02.26 18:32. Заголовок: Просто к сведению
Подготовил сборку 26.01 для компилятора MinGW 32-bit, в которую включены следующие компоненты: Harbour MiniGUI Extended Edition 26.01 (PRO) Harbour 3.2.0dev (r2509100708) Harbour Make (hbmk2) 3.2.0dev (r2025-09-10 07:08) gcc version 15.2.0 (MinGW-W64 i686-msvcrt-posix-dwarf, built by Brecht Sanders, r5) Пишите, если вас заинтересовала эта сборка... 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8148
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.02.26 14:38. Заголовок: Делаю показ своей ош..
Делаю показ своей ошибки: cMsg := "Error! No handling type ["+cTypeLine+"] !;" + HB_ValToExp(aDim) cMsg += ";;" + ProcNL(0) cMsg := AtRepl( ";", cMsg, CRLF ) MsgStop( cMsg ) AlertStop( cMsg ) По MsgStop( cMsg ) - идёт показ окна: По AlertStop( cMsg ) прога вылетает без ПОКАЗА окна ошибки ! В логе вот так: Error MGERROR/0 ACTIVATE WINDOW: Main Window must be activated in the first ACTIVATE WINDOW command. Program terminated. --------------------------------- Stack Trace --------------------------------- Called from MSGMINIGUIERROR(99) in module: h_error.prg Called from _ACTIVATEWINDOW(1806) in module: h_windows.prg Called from HMG_ALERT(222) in module: h_alert.prg Called from _ALERT(338) in module: h_alert.prg Called from ALERTSTOP(288) in module: h_alert.prg Called from SHOWERROR(346) in module: errorsys.prg Called from DEFERROR(149) in module: errorsys.prg Called from (b)ERRORSYS(64) in module: errorsys.prg Called from MSGMINIGUIERROR(99) in module: h_error.prg Called from _ACTIVATEWINDOW(1806) in module: h_windows.prg Called from HMG_ALERT(222) in module: h_alert.prg Called from _ALERT(338) in module: h_alert.prg Called from ALERTSTOP(288) in module: h_alert.prg Called from MYCARDFIELDGETBOX(207) in module: demo2.prg Called from SHOWCARD(143) in module: demo2.prg Called from MAIN(53) in module: demo2.prg Может можно сделать исключение для "first ACTIVATE WINDOW command" при показе окна ошибки ? 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8149
Зарегистрирован: 12.09.06
|
|
Отправлено: 15.02.26 16:11. Заголовок: Григорий, можно испр..
Григорий, можно исправить окно сообщений в GETBOX ? Или ввести новый параметр для показа для AlertRetryCancel() вместо MsgRetryCancel() ? Вот окно слишком маленькое для юзеров, экраны большие, ни фига они не обращают внимание на такое окно: Причём синтаксис нужен такой: AlertRetryCancel( VALIDMESSAGE, Title, , Icon, 64, {{195,224,133},{255,178,178}}, .T. ) Т.е. нужно задавать сообщение, высоту иконки и цвета кнопок ! 
|
 |

|
|
|
| moderator
|
Пост N: 2537
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.02.26 19:53. Заголовок: Andrey пишет: можно..
Andrey пишет: | цитата: | | можно исправить окно сообщений в GETBOX ? |
| Да, это возможно сделать Код | цитата: | Set ShowRedAlert ON SetErrorButtonBackColor( {195,224,133} ) SetErrorBackColor( {255,178,178} ) |
| 
|
 |

|
|
|
| moderator
|
Пост N: 2538
Зарегистрирован: 11.02.10
|
|
Отправлено: 18.02.26 22:13. Заголовок: Всем кому это интересно...
Подготовил первый релиз-кандидат для новой сборки. Ниже - полный список изменений Скрытый текст
* Enhanced: GETBOX control supports the changing of built-in buttons 'Picture' property at runtime for BMP, PNG, GIF and TIF images. You can set this property: - function syntax: SetProperty ( Form, GetBox, 'Picture', { cBtnImage1, cBtnImage2 } ) - pseudo-OOP syntax: Form.GetBox.Picture := { cBtnImage1, cBtnImage2 } Form.GetBox.Picture := { cBtnImage1, NIL } Form.GetBox.Picture := { NIL, cBtnImage2 } Requested by Verchenko Andrey. Contributed by Grigory Filatov (see demo2.prg in folder \samples\Advanced\APP_OOPGETBOX) * Enhanced: Improved display of the VALID MESSAGE box in the GETBOX using the command SET SHOWREDALERT ON. In this form, you can customize the button backcolors using the following pseudo-function: SetErrorButtonBackColor( { RetryBtnColor, CancelBtnColor } ) Sample code: SET SHOWREDALERT ON SetErrorButtonBackColor( { {195, 224, 133}, {255, 178, 178} } ) ... Requested by Verchenko Andrey. Contributed by Grigory Filatov (see demo2.prg in folder \samples\Advanced\APP_OOPGETBOX) * Modified: Minor optimizations in the MiniGUI core, affecting the following functions: - cFileNoPath(); - GetColor(); - _Alert(); - MiniGuiVersion(); - WindowsVersion(). Contributed by Grigory Filatov * Updated: Adaptation FiveWin Class TSBrowse 9.0 in HMG: - minor correction of :bGoToPos block for ADS in the method SetDbf(). Investigated and contributed by Igor Nazarov. * Updated: HbSQLite3 library: - update for using SQLITE3 version 3.52.0 (from 3.51.2). Contributed by Grigory Filatov (see demo in folder \samples\Advanced\SQLITE_2) * Updated: Harbour Compiler 3.2.0dev (SVN 2026-02-16 23:30): * Updated libpng library to 1.6.55 (from 1.6.53). Contributed by Grigory Filatov (look at ReadMe.txt in folder \harbour) [PRO VERSION] * Updated: 'ChartView class for GraphPlus library' sample: - added structured color management: * Custom color arrays (GraphColors) * Built-in theme selection (ColorTheme) * Background color * Title/Text/Grid colors * Lighter/darker mode * Automatic color initialization * Reset to theme defaults Contributed by Grigory Filatov (see in folder \samples\Basic\ChartView) * Updated: 'Fill Directory List' sample: - added detailed comments to the code. Contributed by Grigory Filatov (see in folder \samples\Basic\FillDirList) * Updated: 'Compare of command Draw Graph versus Graph Bitmap' sample: - added detailed comments to the code. Contributed by Grigory Filatov (see in folder \samples\Basic\GraphPrint_Bitmap) * Updated: 'HBPrinter library usage' sample: - added detailed comments to the code. Contributed by Grigory Filatov (see demo in folder \samples\Basic\HBPrinter) * Updated: 'Internet Explorer ActiveX' sample: - detailed comments in the code have been updated. Contributed by Grigory Filatov (see in folder \samples\Advanced\ActiveX) * Updated: 'Using OOP events for Tab and Getbox controls' sample. Contributed by Sergej Kiselev and Verchenko Andrey (see in folder \samples\Advanced\APP_OOPGETBOX) * Updated: 'Combo Color' sample: - detailed comments in the code have been updated. Contributed by Grigory Filatov (see in folder \samples\Advanced\ComboColor)
| Надеюсь, это кому-то интересно...
|
 |

|
|
|
| |
Пост N: 2036
Зарегистрирован: 20.02.11
|
|
Отправлено: 19.02.26 09:40. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Надеюсь, это кому-то интересно... |
| Григорий, всем читателям и писателям в ветке. GUI это всегда интересно. Уверен просто многие просто пилят исходники под себя из стандарта , активность не показатель. тем более примеров тут предостаточно
|
 |

|
|
|
| постоянный участник
|
Пост N: 8155
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.02.26 00:06. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | * Enhanced: GETBOX control supports the changing of built-in buttons 'Picture' property at runtime for BMP, PNG, GIF and TIF images. You can set this property: - function syntax: SetProperty ( Form, GetBox, 'Picture', { cBtnImage1, cBtnImage2 } ) - pseudo-OOP syntax: Form.GetBox.Picture := { cBtnImage1, cBtnImage2 } Form.GetBox.Picture := { cBtnImage1, NIL } Form.GetBox.Picture := { NIL, cBtnImage2 } |
| Будет ли работать такой синтаксис ? This.&(cObj).Action2 := ... SetProperty(cForm, cObj, "Action2" , bAct2) .... Сейчас не работает - ошибка компиляции.
|
 |

|
|
|
| moderator
|
Пост N: 2539
Зарегистрирован: 11.02.10
|
|
Отправлено: 26.02.26 10:07. Заголовок: Выложил новую сборку..
Выложил новую сборку 26.02 Стандартная версия click here ПРО-версия (архив под паролем) click here Желаю всем хорошего дня! 
|
 |

|
|
|
| |
Пост N: 199
Зарегистрирован: 12.07.06
|
|
Отправлено: 27.02.26 04:57. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Выложил новую сборку 26.02 |
| Спасибо большое за Ваш труд. PS Только у меня одного перестали работать ссылки на загрузку? Теперь беру обновления вот тут: https://hmgextended.org/download.html
|
 |

|
|
|
| |
Пост N: 8238
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.02.26 13:20. Заголовок: alex_II пишет: Толь..
alex_II пишет: | цитата: | | Только у меня одного перестали работать ссылки на загрузку? |
| у меня работает нормально
|
 |

|
|
|
| постоянный участник
|
Пост N: 8158
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.02.26 17:18. Заголовок: alex_II пишет: PS Т..
alex_II пишет: | цитата: | | PS Только у меня одного перестали работать ссылки на загрузку? |
| У меня тоже нормально !
|
 |

|
|
|
| |
Пост N: 8250
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.03.26 19:00. Заголовок: gfilatov Привет :s..
gfilatov Привет Не в курсе куда писать о глюках PAGESCRIPT32 3.0.4.178 и 4.0.1.157 Или заброшен продукт ? PS Когда то , давно я плотно тестил прогу Winprint и у меня была связь с разработчиком. Глюков было выявлено не мерянно , на сейчас еще иногда ею пользуемся Shareware version 2.08.02 (22.08.2000) Copyright Port Ltd, 1999 Internet: www.port.obninsk.ru E-Mail: winprint@mail.ru port@obninsk.ru
|
 |

|
|
|
| moderator
|
Пост N: 2540
Зарегистрирован: 11.02.10
|
|
Отправлено: 22.03.26 19:43. Заголовок: Dima пишет: куда пи..
Dima пишет: | цитата: | | куда писать о глюках PAGESCRIPT32 |
| Надо писать Ричарду по адресу support@pagescript32.com Он выкупил все права на этот продукт и у него есть все исходники. 
|
 |

|
|
|
| moderator
|
Пост N: 2541
Зарегистрирован: 11.02.10
|
|
Отправлено: 26.03.26 09:33. Заголовок: Выложил новую сборку..
Выложил новую сборку 26.03 Стандартная версия click here ПРО-версия (архив под паролем) click here Желаю всем хорошего дня! 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8171
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.03.26 18:28. Заголовок: Спасибо за новую сбо..
Спасибо за новую сборку ! Заметил вылет проги на МиниГуи при использовании на системах Windows Server 2008/2012/2022 Time from start: 0 days 0 hours 0 mins 25 secs Error BASE/3012 Failed to get cursor position: GETCURSORPOS
|
 |

|
|
|
| moderator
|
Пост N: 2542
Зарегистрирован: 11.02.10
|
|
Отправлено: 29.03.26 14:08. Заголовок: Andrey пишет: Faile..
Andrey пишет: | цитата: | | Failed to get cursor position: GETCURSORPOS |
| Благодарю за сообщение! Эта ошибка возникает при запуске программы, которая физически находится на сервере, с использованием ярлыка на рабочей станции. При этом функция не может определить положение курсора на сервере, поскольку она вызывается на локальной рабочей станции. Конечно, это будет исправлено в следующей сборке, чтобы НЕ возникала эта ошибка. 
|
 |

|
|
|
| moderator
|
Пост N: 2543
Зарегистрирован: 11.02.10
|
|
Отправлено: 21.04.26 20:52. Заголовок: Просто к сведению
Завершена подготовка новой сборки 26.04, которая, вероятно, будет последней бесплатной Минигуи сборкой. Что нового: - выполнена внутренняя переработка следующих С модулей: * Control Miscellaneous Module Major refactoring and code cleanup to improve structure and maintainability. * Font Handling * Cursor Handling * Icon Handling Codebase cleaned up and reorganized for clarity (no functional changes). * ToolBar Handling * StatusBar Handling * MessageBox Handling * HbSQLite3 Library (PRO version) Updated to SQLite 3.53.0 (previously 3.52.0). * Harbour Compiler 3.2.0dev (SVN 2026-02-28 15:33) * Updated libpng to version 1.6.58 (from 1.6.55). Желаю всем хорошего вечера. 
|
 |

|
|
|
| |
Пост N: 118
Зарегистрирован: 18.06.15
|
|
Отправлено: 22.04.26 08:17. Заголовок: gfilatov2002 прошу..
gfilatov2002 прошу озвучить прейскурант ....
|
 |

|
|
|
| |
Пост N: 8282
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.04.26 12:34. Заголовок: Alex_Cher пишет: пр..
Alex_Cher пишет: | цитата: | прошу озвучить прейскурант .... |
| +1
|
 |

|
|
|
| moderator
|
Пост N: 2544
Зарегистрирован: 11.02.10
|
|
Отправлено: 24.04.26 08:35. Заголовок: Выложил новую сборку..
Выложил новую сборку 26.04 Стандартная версия click here ПРО-версия (архив под паролем) click here Желаю всем хорошего дня! 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8177
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.04.26 09:41. Заголовок: Не скачивается.... С..
Не скачивается.... Сервер не найден Firefox не может подключиться к серверу hmgextended.com
|
 |

|
|
|
| |
Пост N: 8283
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.04.26 12:03. Заголовок: Andrey пишет: Не ск..
Andrey пишет: ты сам знаешь почему.. PS от меня сливается норм
|
 |

|
|
|
| |
Пост N: 8284
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.04.26 12:15. Заголовок: если ресурс Сергея у..
если ресурс Сергея у тебя доступен я могу туда перелить абсолютно бесплатно , мне не сложно...
|
 |

|
|
|
| постоянный участник
|
Пост N: 8178
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.04.26 13:56. Заголовок: Dima пишет: ты сам ..
Dima пишет: Пробовал через VPN - тоже не скачивается. Dima пишет: | цитата: | | тебя доступен я могу туда перелить абсолютно бесплатно |
| Давай. 
|
 |

|
|
|
| |
Пост N: 8285
Зарегистрирован: 17.05.05
|
|
Отправлено: 24.04.26 14:16. Заголовок: Andrey пишет: Давай..
Andrey пишет: там уже кто то тебе налил , это не я 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8179
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.04.26 17:07. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: | цитата: | | Выложил новую сборку 26.04 |
| Ошибки такого типа уйдут ? Error BASE/5001 MiniGUI Error: _SETFONT Args: [1] = N 0 [2] = C Tahoma [3] = N 18 [4] = L F [5] = L F [6] = L F [7] = L F
|
 |

|
|
|
| |
Пост N: 8286
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.04.26 17:51. Заголовок: Andrey пишет: Ошибк..
Andrey пишет: | цитата: | | Ошибки такого типа уйдут ? |
| это ты по поводу в связке с RDP ?
|
 |

|
|
|
| постоянный участник
|
Пост N: 8180
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.04.26 21:38. Заголовок: Dima пишет: это ты ..
Dima пишет: | цитата: | | это ты по поводу в связке с RDP ? |
| Нет. Такие ошибки были и на Win10 
|
 |

|
|
|
| moderator
|
Пост N: 2545
Зарегистрирован: 11.02.10
|
|
Отправлено: 15.05.26 21:55. Заголовок: Всем, кому это интересно...
Подготовил первый релиз-кандидат новой сборки 26.05 Кратко, что нового: Скрытый текст
* Modified: Fixed redundant parameter parsing in MOVEBTNTEXTBOX (C layer). * Modified: Refactored font management and enumeration code (C layer) for improved consistency and maintainability. * Modified: Dialogs and common controls interface (C layer). Refactored for clarity and maintainability (no functional changes): * Modified: Refactored INI functions for improved consistency, readability, and maintainability: * Modified: BROWSE handling (C layer). Refactored code for better readability and consistent structure: * Modified: GRID handling (C layer). Refactored code for readability, consistency, and safety: * Modified: EDITBOX handling (C layer). Refactored for improved readability and maintainability: * Modified: CheckLabel handling (C layer). Refactored for clarity and maintainability (no functional changes): * Modified: LABEL handling (C layer). Refactored for improved clarity and maintainability: * Modified: RADIOGROUP handling (C layer). Refactored radio button creation code for better maintainability: * Modified: Refactored BUTTONEX Control code for better readability and maintainability: * Modified: Refactored Image Control code for better structure, readability and maintainability: * Modified: Refactored Label Control code for better structure and maintainability: * Modified: Refactored core MENU engine for better maintainability and reduced code duplication. This is a major refactoring and cleanup: * Modified: Refactored SHELLEXECUTE() and SHELLEXECUTEEX() for improved readability * Modified: Refactored TGif class code structure and formatting: * Modified: MRU (Most Recently Used) module improved: * Modified: Refactored TCDOMail class to version 1.1: * Updated: HbSQLite3 library: - update for using SQLITE3 version 3.53.1 (from 3.53.0). [PRO VERSION] Contributed by Grigory Filatov (see demo in folder \samples\Advanced\SQLITE_2) * Updated: Harbour Compiler 3.2.0dev (SVN 2026-05-14 14:50): * Updated: SddSqlt3 library source code (see in folder \Source\HbSqlDD) Contributed by Grigory Filatov (look at ReadMe.txt in folder \harbour) [PRO VERSION] * Updated: 'EditBox Overwrite' sample: * Updated: 'Virtual Grid Usage' sample: * Updated: 'Label properties' sample: * Updated: 'Labels as buttons' sample: * Updated: 'Message Test Function' sample: refactored MsgTest utility functions for improved readability and maintainability. * Updated: 'System idle time monitoring' sample: * Updated: UnRar sample: - updated unrar.dll to the current version 7.22 (from 7.20).
| Желаю всем хороших выходных 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8181
Зарегистрирован: 12.09.06
|
|
Отправлено: 18.05.26 14:36. Заголовок: Отличная новость ! ..
Отличная новость ! Но у меня прога периодически вылетает на ТСБ. Я использую потоки и таймера в своей большой проге. Если при выходе из ТСБ срабатывает поток (проверка файла в каталоге), то прога может вылететь. Нужно ли при выходе из потока - как то переключать на текущее окно + ТСБ и как это сделать ? Более подробно написал на почту.
|
 |

|
|
|
| |
Пост N: 8295
Зарегистрирован: 17.05.05
|
|
Отправлено: 18.05.26 17:50. Заголовок: Andrey пишет: Если ..
Andrey пишет: | цитата: | | Если при выходе из ТСБ срабатывает поток (проверка файла в каталоге), то прога может вылететь. |
| если данный поток "связан" только с этим ТСБ тогда киляй его перед выходом из ТСБ
|
 |

|
|
|
| постоянный участник
|
Пост N: 8182
Зарегистрирован: 12.09.06
|
|
Отправлено: 20.05.26 18:24. Заголовок: Haz пишет: Поток не..
Haz пишет: | цитата: | | Поток не может испортить рабочую область tsbrowse, a сам tsbrowse легко, через вызовы методов, передачу параметров или public переменные. |
| В потоке идёт ТОЛЬКО проверка наличия файла, больше ничего нет. В tsbrowse тоже нет обращения к потоку. Но вылет из этого окна периодически у юзера ЕСТЬ ! 
|
 |

|
|
|
| moderator
|
Пост N: 2547
Зарегистрирован: 11.02.10
|
|
Отправлено: 25.05.26 10:23. Заголовок: Просто к сведению
Выложил новую сборку 26.05 Стандартная версия ... ПРО-версия (архив под паролем) click here Желаю всем хорошего дня! 
|
 |

|
|
|
| постоянный участник
|
Пост N: 8187
Зарегистрирован: 12.09.06
|
|
Отправлено: 09.06.26 20:18. Заголовок: Перешёл на новую вер..
Перешёл на новую версию 26.05 Pro Теперь стала фигня появлятся, сам лично видел у заказчика. Ветка в программе окно-STANDART, окно-MODAL по кнопке вызываю новое окно MODAL. Оно создаётся под всеми окнами и юзер его не видит. Почему ? До этого не было таких глюков. Придется теперь код перерабатывать ?
|
 |

|
|
Ответов - 195
, стр:
1
2
3
4
5
6
7
8
9
10
All
[только новые]
|
|