Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Оператор
|
|||
|---|---|---|---|
|
#18+
Люди, а кто-нибудь знает есть-ли такой оператор в Fox'e, который определяет было ли изменено содержимое ячеек или была ли изменена таблица, или что-либо подобное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2003, 11:24 |
|
||
|
Оператор
|
|||
|---|---|---|---|
|
#18+
цитата для visual foxpro 3.0 и выше ------- функция UPDATE() Возвращает значение "истина" (.T.), если в ходе выполнения текущей команды READ какие-либо данные были изменены в интерактивном режиме. Включена для совместимости с предыдущими версиями. Используйте вместо нее событие InteractiveChange или ProgrammaticChange. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2003, 11:33 |
|
||
|
Оператор
|
|||
|---|---|---|---|
|
#18+
Это все есть для буферизированных данных. Читай описание функций: GetFldState() - стутус изменения полей текущей записи таблицы GetNextModified() - физический номер записи, которая была изменена OldVal() - значение, которое было в поле до начала изменений CurVal() - значение, которое имеет сейчас данное поле в исходной таблице (но не в буфере) Все эти функции помогают установить факт того было ли изменение в буферизированных данных с момент включения буферизации и до момент сброса буфера. Если речь идет о многократном редактировании одной и той же ячейки буферизированных данных до сброса буфера. И при этом необходимо отлавливать факт каждого изменения ячейки то стандартных функций на такой случай не предусмотрено. Есть 2 пути решения: 1) Запоминать занчение ячейки при входе (When или SetFocus) и сравнивать его с текущем значением при выходе (Valid или LostFocus) 2) Использовать функцию SetFldState() при выходе (Valid или LostFocus) примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. В коде я предполагаю, что ControlSource объекта записан в виде MyTable.MyField Изменение статуса по SetFldState() никак не повлияет на буфер и работу других функций с буфером. Он окажеть исключительно влияние на значение возвращаемое по GetFldState() и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2003, 11:42 |
|
||
|
Оператор
|
|||
|---|---|---|---|
|
#18+
Возникла новая проблема. На сколько я знаю, BeforeRowColChange имеет место перед тем, как поль-ль изменяет активную строку или столбец, т.е. по сути дела, если: mActiveCellValue = This.Columns(nColIndex).ControlSource , то mActiveCellValue будет иметь то значение, которое имела было в акт. ячейке до изменения. Или я чего-то не догоняю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2003, 17:03 |
|
||
|
Оператор
|
|||
|---|---|---|---|
|
#18+
Теоретически, да, должно работать. Но практически не проверял. А что, так трудно проверить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2003, 17:52 |
|
||
|
Оператор
|
|||
|---|---|---|---|
|
#18+
Дык, в том то и дело, что проверил, но почему-то не работает. Выдает уже измененное значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2003, 18:01 |
|
||
|
Оператор
|
|||
|---|---|---|---|
|
#18+
Попутали вы немного: BeforeRowColChage имеет место быть не при изменении значения ControlSource активной ячейки, а при потере фокуса активной ячейкой и при перемещении фокуса на другую ячейку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 06:36 |
|
||
|
Оператор
|
|||
|---|---|---|---|
|
#18+
Нет, ничего я не попутал. При переходе на другую колоку nColIndex - изменяется и, соответственно, изменяется ControlSource и, соответственно, изменяется значение m.ActiveCellValue при m.ActiveCellValue = This.Columns(nColIndex).ControlSource, если переход осуществляется по одной колонке то ни nColIndex ни ControlSource не изменяются, но изменяется значение &m.ActiveCellValue Вообщем, все, что я хочу сделать, это, чтобы при изменении значения ячейки в поле YEAR, Fox проверял бы соответствует ли данное введенное значение условиям типа YEAR > 2001 и изменял бы ег на 2002, если это не так. Я в BeforeRowColChange сохраняю начальное значение ячейки (теперь работает), затем в AfterRowColChange осуществляю проверку If YEAR > 2001.... При переходе с одной ячейки на другую слева направо, т.е на другую колонку, Fox проверяет измененное значение и, если оно не соответствует критерию, меняет его на 2002. При переходе же с ячейки на ячейку по одной и той же колонке проверка не осуществляется и, соответственно, значение остается не соответствующим критерию. Как можно сделать так, чтобы Fox проверял значение при движении вниз-вверх ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 12:23 |
|
||
|
Оператор
|
|||
|---|---|---|---|
|
#18+
Попробуйте сохранить значение в When а проверять в Valid объекта ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 12:29 |
|
||
|
Оператор
|
|||
|---|---|---|---|
|
#18+
Но, на сколько я знаю, Valid и When для Grida не будут работать для ячеек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 14:01 |
|
||
|
Оператор
|
|||
|---|---|---|---|
|
#18+
А для GRIDa и не надо. Используй энти события для каждой ячейки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 14:24 |
|
||
|
Оператор
|
|||
|---|---|---|---|
|
#18+
Имелось в виду использовать Valid и When того объекта, который расположен внутри соответсвующей ячейки. Как правило, просто делают свой класс, например, TextBox-а с нужным кодом и вставляют его в колонки вместо стандартного TextBox-а Запись можно делать в свойство TAG. Это свойство не оказывает никакого влияния на собственно работу объекта. Это просто комментарий. Единственное ограничение - TAG принитмает только символьные данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 14:25 |
|
||
|
Оператор
|
|||
|---|---|---|---|
|
#18+
Вы знаете, я Fox только начинаю изучать. Сижу каждый день с кучей литературы. Но пока не понимаю каким образом я могу использовать Valid и When для каждой ячейки, у меня даже такого объекта не существует как ячейка или даже колонка (Grid так построен, что всегда загружаются новые таблицы, он каждый раз перерисовывается). Хотя, как я понял (по словам Владимира М), можно создать свой класс на базе ячейки, но не знаю я пока, как классы создавать (если только Вы не подскажете) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 14:55 |
|
||
|
Оператор
|
|||
|---|---|---|---|
|
#18+
На подробный ответ меня не хватит. Поэтому только намеки :) 1) Чтобы при изменении источника данных для Grid не происходил сброс настроек столбцов необходимо предварительно обнулить источник данных ThisForm.Grid1.RecordSource="" ThisForm.Grid1.RecordSource="NewTable" ThisForm.Grid1.Column1.ControlSource="NewTable.Field1" ThisForm.Grid1.Column2.ControlSource="NewTable.Field2" ThisForm.Grid1.Column3.ControlSource="NewTable.Field3" При таком способе замены источника настройки (и самое главное коды событий и методов) столбцов и объектов внутри столбцов сохраняются 2) Классы в FoxPro можно создавать программно (команда DEFINE CLASS) и визуально (Пункт главного меню File->New->Class). Классы для некоторых объектов невозможно создать визуально (например для Column или Header) 3) Вставить любой другой объект в Grid вместо стандартного TextBox можно как в дезайнере формы, так и программно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 15:08 |
|
||
|
Оператор
|
|||
|---|---|---|---|
|
#18+
Я делел вот так: THISFORM.Grid1.RECORDSOURCE= m.TableName lcColumn = 'thisform.Grid1.column'+m.ColNumb with &lcColumn .CONTROLSOURCE=6 .CONTROLSOURCE=m.CSource (в колонку могут загружаться данные из нескольких таблиц) .Еще всякие разные свойства Или таким образом заполнять Grid не советуете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 15:21 |
|
||
|
Оператор
|
|||
|---|---|---|---|
|
#18+
Да, а команду Define Class нужно писать в inite формы или как ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 15:41 |
|
||
|
Оператор
|
|||
|---|---|---|---|
|
#18+
Для объяснение идеологии объектно-ориентированного подхода пишутся здоровенные книги, а Вы хотите, чтобы я тут вкратце поснил :) Значит так. Вне зависимости от выбранного источника данных для Grid надо думать, что ряд настроек останется все-равно неизменной. Ну например, количество столбцов, ширина каждого столбца, название заголовков столбцов, способы обработки и т.п. Значит, все это неизменяемое богатство надо описать непосредственно в конструкторе формы (начни с задания количества столбцов Grid.ColumnCount=6) Если я правильно понял, динамически изменяться будет только имя таблицы-источника и имена полей-источников столбцов. Вот для того, чтобы эти изменения не привели к сбросу настроек сделанных в конструкторе формы перед изменением источника следует дать команду на сброс источника данных для Grid ThisForm.Grid1.RecordSource="" Эта команда обнуляет источник данных (т.е. в Grid ничего не отображается), но при этом все настройки Grid сделанные ранее остаются в силе (в том числе и коды событий When, Valid сделанных для объектов внутри колонок). Вот теперь можно приступить к восстановлению (назначению) источника данных для Grid как у Вас и написано. Команду DEFINE CLASS обычно пишут в процедурных файлах. Процедурные файлы подключаются по команде SET PROCEDURE. Но вообще-то, поскольку Вы только начинаете, используйте визуальные классы, которые создаются через построитель. С ними проще работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 16:56 |
|
||
|
Оператор
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. предудущее описание классов для одной колонки таблицы где-нить (ну например в главной процедуре) это описание не выполняется,а определяется 1 раз (т.е. в программе больше повторятся не должно) далее использование этого в проседуре grid.init PRIVATE i,area,pfn,dobj,fc WITH this area = .parent.areagrids fc = FCOUNT(area) .ColumnCount = -1 FOR i = 4 TO fc pfn = FIELD(i,area) dobj = 'Column'+inttostr(i-3) .Addobject(dobj,'MyColumn') dobj = '.' + dobj WITH &dobj .Header1.Caption = '' IF UPPER(SUBSTR(pfn,1,3))='DEN' .Header1.Caption = inttostr(objectindex(pfn)) ENDIF IF EMPTY(.Header1.Caption) .width = defaultcolumnwidth IF .parent.colindex = 0 .parent.colindex = i-3 endif ENDIF STORE area+'.'+pfn TO .ControlSource ENDWITH ENDFOR .parent.columncount = fc-3 ENDWITH я прекрасно понимаю, что код практически не читаем. Но может быть структура поможет. Просто это совсем, совсем свежее все, но в рабочем состоянии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 17:23 |
|
||
|
Оператор
|
|||
|---|---|---|---|
|
#18+
To: ВладимирМ Если это принципиально, то изменяются не только имя таблицы-источника и имена полей-источников столбцов, но и их количество и структура. THISFORM.Grid2.COLUMNCOUNT= n_column THISFORM.Grid2.RECORDSOURCE= m.filedbf Brather я прекрасно понимаю, что код практически не читаем. мда...так оно и есть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2003, 14:19 |
|
||
|
Оператор
|
|||
|---|---|---|---|
|
#18+
Мне тут подсказали, что если добавить в Data Environment таблицу (желательно пустую и с большим количеством полей), то при любой загружаемой таблице в Грид (с постоянно измен. recordsource) визуально отображаются TextBox'Ы. т.е нет необходимости создавать класс на основе TextBox'ов и вставлять TextBox's в Грид взамен старых. Посмотрел. Попробовал. Вроде бы работает. Но остается вопрос : а стоит ли так делать, какие сложности могут возникнуть в процессе работы, как может измениться работоспособность системы ? Поможите кто чем может. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2003, 17:05 |
|
||
|
Оператор
|
|||
|---|---|---|---|
|
#18+
Вот...Вот .... Вот.... И нас убеждают, что VISUALные средства ускоряют процесс программирования и легче всем..... Простые вещи стали описывать "трехэтажным" языком... Начинающему программисту, сразу прочитавшему книжки по визуальному программированию, уже ничем помочь нельзя...(ну или очень трудно) Мы теряем его... Это я вам как учитель информатики.... Многие вопросы начинающих в конфе - результат визуализирования FOXa. Из за картинок сути не видать, механики процессов, так сказать. И HELP стал такой огромный, что редкий "МЭТР" дочитает его до середины. :)) Что-то надо делать..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2003, 05:27 |
|
||
|
|

start [/forum/topic.php?fid=41&fpage=399&tid=1597351]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 246ms |
| total: | 367ms |

| 0 / 0 |
