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

|
|
Ответов - 129
, стр:
1
2
3
4
5
6
7
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(...) с отборами\выборками из базы
|
 |

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