Временное отображение в textbox и editbox | |
---|---|
Tanya1339 Автор Сообщений: 8 Дата регистрации: 01.10.2017 |
Здравствуйте, уважаемые форумчане!
Подскажите пожалуйста как не производя запись в таблицу insert отобразить вычисляемое значение в текстовом поле новой формы при её запуске, чтобы это значение записывалось вместе с внесёнными в остальные поля изменениями только по кнопке сохранить (предполагаю, что tableupdate) |
Re: Временное отображение в textbox и editbox | |
---|---|
Chemberzhy Сообщений: 13142 Откуда: Измаил Дата регистрации: 28.04.2009 |
Отображение данный в/на объектах формы вовсе не подразумевает запись их в таблицу. Исключением может быть Grid при стандартных условиях настройки и, к примеру, тот же TextBox, если его ControlSource напрямую привязан к полю таблицы, например,
Исправлено 2 раз(а). Последнее : Chemberzhy, 16.01.18 10:15 |
Re: Временное отображение в textbox и editbox | |
---|---|
Tanya1339 Автор Сообщений: 8 Дата регистрации: 01.10.2017 |
Простите, что не указала подробнее проблему. у меня две формы. В init для полей обозначено thisform.text1.controlsource = thisform.grd.Column1.ControlSource. Нужно просто по кнопке открывать вторую форму где одно из полей показывает число на единицу больше последнего, чем в таблице, внести изменения и только затем по кнопке сохранить внести в таблицу. Тогда запись должна отобразиться в грид на предыдущей форме.
Но проблема, что я не знаю как не записывая в таблицу и не отображая в грид в предыдущей форме показать поля, где первое заполнено с новым значением. У меня получается только продублировать грид, но тогда вся строка отображается в первой форме. |
Re: Временное отображение в textbox и editbox | |
---|---|
Chemberzhy Сообщений: 13142 Откуда: Измаил Дата регистрации: 28.04.2009 |
В Init второй формы
На кнопке Сохранения в Click
ну, и, наверное, закрыть окно?
Исправлено 2 раз(а). Последнее : Chemberzhy, 16.01.18 14:11 |
Re: Временное отображение в textbox и editbox | |
---|---|
Tanya1339 Автор Сообщений: 8 Дата регистрации: 01.10.2017 |
я о таком решении не думала. Очень интересно. А Fields1 это название текущего поля? У меня он его не может найти это поле.
Исправлено 1 раз(а). Последнее : Tanya1339, 16.01.18 11:04 |
Re: Временное отображение в textbox и editbox | |
---|---|
Tanya1339 Автор Сообщений: 8 Дата регистрации: 01.10.2017 |
Кое-что получилось, спасибо огромное Chemberzhy, буду разбираться дальше.
|
Re: Временное отображение в textbox и editbox | |
---|---|
Tanya1339 Автор Сообщений: 8 Дата регистрации: 01.10.2017 |
Я сделала вот так в init формы. Но только по нажатии сохранить не знаю как чтобы новая строчка с значениями записалась в грид grd1. На второй форме я грид удалила и обращаюсь только к таблице которая связана с грид на предыдущей форме.
Thisform.Text1.ControlSource = "" set talk off Calculate max(table.fields1)to var var=var+1 Thisform.Text1.Value = var Thisform.Edit1.ControlSource = "" Thisform.Edit1.Value = '' Thisform.Text3.ControlSource = "" Thisform.Text3.Value = '' Thisform.Text4.ControlSource = "" Thisform.Text4.Value = '' Thisform.Text5.ControlSource = "" Thisform.Text5.Value = '' Изначально по нажатии сохранить у меня был следующий код IF EMPTY (Thisform.Edit1.Value) .or. EMPTY(Thisform.text3.Value) .or. EMPTY(Thisform.text4.Value) .or. EMPTY(Thisform.text5.Value) =MessageBox ('Вы оставили одно из полей незаполненным',48,'Внимание') ELSE TABLEUPDATE() Thisform.refresh() RETURN ENDIF Исправлено 3 раз(а). Последнее : Tanya1339, 16.01.18 14:04 |
Re: Временное отображение в textbox и editbox | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Может быть начать с чтения книжки по фоксу? Понять про буферизацию хотя бы.
Ну и заодно отказаться от Calculate max(table.fields1) для генерации уникальных ключей... ------------------ WBR, Igor |
Re: Временное отображение в textbox и editbox | |
---|---|
Tanya1339 Автор Сообщений: 8 Дата регистрации: 01.10.2017 |
В книжках бывают опечатки. У меня не база данных, а одна таблица и я уже установила буферизацию = 5
|
Re: Временное отображение в textbox и editbox | |
---|---|
ssa Сообщений: 13007 Откуда: Москва Дата регистрации: 23.03.2005 |
В грид невозможно в принципе ничего записать. Ибо в нем места для данных. Он занимается работой с данными в связанной с ним таблице. Именно в неё и надо записывать. Но если таблица буферизована, то сей момент надо обязательно учитывать, ибо сами данные между таблицей и буфером автоматом не бегают. ------------------ Лень - это неосознанная мудрость. |
Re: Временное отображение в textbox и editbox | |
---|---|
Tanya1339 Автор Сообщений: 8 Дата регистрации: 01.10.2017 |
Да указала не корректно простите. Не записалась а отобразилась. Записываются данные в таблицу. Получается внесение новых значений возможно только в кнопке сохранить при добавлении insert или replace with?
|
Re: Временное отображение в textbox и editbox | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Что есть "внесение новых значений"? Добавление записи? Изменение записи?
Почему бы это нужно было делать именно в кнопке "Сохранить"? При том что буферизация как раз и позволяет иметь "временные" данные - они с одной стороны есть в курсоре - отображаются в гриде, или простых текстбоксах привязанных к этому курсору, их там можно спокойно изменять, а с другой стороны они не записаны "в файл на диск". И могут быть потом либо записаны (как раз это обычно и делает кнопка "Сохранить") либо отменены и "забыты" - оставив таблицу в исходном виде. Даже если не книжки, то хотя бы статьи хелпа "Buffering Data" и "How to: Append and Delete Records in Table Buffers" следует прочитать и попытаться понять. ------------------ WBR, Igor |
Re: Временное отображение в textbox и editbox | |
---|---|
Tanya1339 Автор Сообщений: 8 Дата регистрации: 01.10.2017 |
Я в фоксе новичок, но я готова изучать все, что нужно. В том числе и книжки и help. Просто я полагаю, решение должно быть простым, а я могу уйти не в ту сторону. Да, задача подразумевает добавление записи. Но в текущей форме в которой в пять полей куда вводятся пользователем данные, грида в ней нет. Мне это сложно объяснить так как такие требования устанавливала не я. Попробую описать по-другому. Есть две формы. В первой есть грид. Рядом поля для редактирования записей. Есть кнопки обновить и добавить запись. При нажатии на добавить запись ничего, в том числе и строка на номер больше не добавляется. Открывается новая форма в которой поля для добавления не пустой записи в таблицу. При запуске данной формы в первом поле автоматически значение становится на 1 больше максимального. Другие поля должен заполнить пользователь. Если нажать на сохранить, только тогда запись будет сохранена в таблице и стало быть и в грид на первой форме появится заполненная строка. Я буду сейчас читать про то, что Вы указали по буферизации. Если придут иные мысли я готова прочитать и попробовать.
|
Re: Временное отображение в textbox и editbox | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Есть много вариантов такого рода интерфейс делать. Основных подхода два
1) В основной форме (с буферизованной таблицей) выполнить INSERT INTO таблица (ID) VALUES (новое_значение_id) - это добавит запись , но именно в БУФЕР. вызвав вторую форму можно там менять все прочие поля этой записи (вторая форма работает в той же датасессии что и первая, текстбоксы напрямую привязаны к полям этой же таблицы). В принципе ничто не мешает редактировать эту новую запись в тех же самых полях что есть и на первой форме (и даже в самом гриде). Но если зачем то хотят отдельную форму - не проблема. При её закрытии можно либо tableupdate-ом попытаться сохранить таки новую запись в таблицу (кнопка "Сохранить"), либо tablerevert-ом её "отменить" (одноименная кнопка). Как подвариант - делать INSERT INTO в LOAD второй формы - раз уж она сугубо для "добавления новой записи". Да и сам tableupdate вполне себе можно делать лишь в первой форме - т.е. запись будет висеть в буфере до тех пор пока в первой форме не соизволят "всё сохранить". Ключевой момент - две формы работают с одной таблицей/курсором и одним буфером. 2) Сделать в первой форме SCATTER NAME oRecord BLANK, потом oRecord.ID = новое_значение_id и вызвать вторую форму передав ей эту самую переменную oRecord как параметр. Во второй форме в Init принять параметр, "запомнить" его в свойстве формы (можно в редакторе прописать такое свойство, можно программно через AddProperty его добавить). Текстбоксы привязывать к ThisForm.свойство_хранящее_ссылку_на_oRecord.поле1 и т.п. Все изменения вносимые во второй форме будут видны в свойствах объекта oRecord в первой форме. Можно там же по результатам ввода сделать INSERT INTO таблица FROM NAME oRecord. Можно в принципе и во второй форме это же сделать (но тогда она опять должна работать в одной датасессии с первой формой - чтобы видеть открытую таблицу. Либо сама открывать её - что не всегда удобно). Ключевой момент - вторая форма НЕ работает с курсором/таблицей, а просто вводит данные в свойства объекта ей переданного - логику по добавлению записи на основе данных в этом объекте реализуют уже после вводе данных и закрытия второй формы (или во время такого закрытия). Ну и ещё раз повторю - ни в одной нормальной программе НЕ считают "очередной номер" через calc max(), или аналогичны ------------------ WBR, Igor |
Re: Временное отображение в textbox и editbox | |
---|---|
Владимир Максимов Сообщений: 14098 Откуда: Москва Дата регистрации: 02.09.2000 |
Краткая инструкция по созданию формы
1. Создаете новую форму в дизайнере и устанавливаете для нее свойства DataSession = 2 - Private DataSession WindowType = 1 - Modal 2. Открываете DataEnvironment этой формы. Сразу добавляете нужную таблицу в этот DataEnvironment 3. У добавленной таблицы (внутри DataEnvironment это объект Cursor) устанавливаете свойство BufferModeOverride = 5 - Optimistic table buffering 4. Подвиньте окно DataEnvironment так, чтобы оно не загораживало окно формы. Далее щелкаете левой клавишей мыши по одному из полей таблицы внутри окна DataEnvironment и не отпуская клавиши мыши тащите поле на форму. На нужном месте формы отпускаете клавишу мыши. В результате, на форме будет создано два объекта. Объект Label, содержащий название поля из настроек таблицы и объект, ассоциированный с соответствующим типом поля таблицы. Если это текстовое поле, то, скорее всего, это будет объект TextBox. Созданные объекты уже имеют все нужные настройки. Ну, разве что, можно текст у объекта Label поправить, если необходимо Перетащите на форму все нужные поля. После этого закрываете окно DataEnviroment. Больше оно не нужно. Возвращаемся к форме 5. Дважды щелкаете мышкой по свободному месту формы. Открывается окно редактирования методов. Вам нужно выбрать метод init формы (сверху раскрывающийся список методов формы). В этом методу пишите примерно такой код
здесь MyTable - это имя Вашей таблицы 6. Снова возвращаемся на форму и создаем на ней 2 кнопки: Ok, Отмена 7. В методе Click кнопки Ok пишите такой код
8. В методе Click кнопки "Отмена" пишите такой код
9. Собственно, все. С подчиненной формой закончили. Теперь надо организовать ее вызов из формы с Grid. Для этого на форме с Grid создаете кнопку "Новая запись" и в методе Click этой кнопки пишите такой код
Здесь MyForm - это имя файла SCX в котором была создана форма для создания новой записи. Grid1 - это имя объекта Grid, в котором отображается содержимое таблицы ---------------------------------------------------------------------------- Теперь, что это вообще было сделано? DataSession = 2 - Private DataSession Это организация нового, независимого, сеанса данных. Ближайшая аналогия - это другой пользователь запустил то же самое приложение. Т.е. это организация относительно независимой работы с одной и той же таблицей в разных формах, чтобы постоянно не оглядываться на текущий статус и настройки таблицы в родительской форме WindowType = 1 - Modal В этом режиме, пока форма с такой настройкой не будет закрыта невозможно будет переключиться на любую другую форму. Строго говоря, такой режим в современных приложениях используется крайне редко. Здесь это сделано потому, что без этого режима придется писать много кода. А для такой простой задачи - оно того не стоит BufferModeOverride = 5 - Optimistic table buffering Настройка режима буфферизации для таблицы. Буфферизация - это как будто поверх данных положили прозрачную кальку. Все изменения записываются на эту кальку. По завершении редактирования изменения с кальки переносятся в саму таблицу Буфферизация делится на оптимистическую и пессимистическую, а также на строковую и табличную. Разделение на оптимистическую и пессимистическую - это разделение по способу наложения блокировки. Пессимистическая - блокировка накладывается в момент начала внесения изменений. Оптимистическая - в процессе внесения изменений данные не блокируются. Блокировка только на момент записи внесенных изменений в таблицу В сетевых приложения пессимистическая блокировка не используется. Как правило, по той причине, что напрямую с таблицами в таких приложениях никто не работает. Обычно используют выборки. Как следствие, просто нет смысла накладывать блокировку на источник данных. Это не есть исходная таблица Строковая буфферизация отличается тем, что сохранение внесенных изменений выполняется автоматически при переходе на другую запись или при закрытии таблицы. Именно поэтому данный режим используют крайне редко. Из за этого самого автоматизма. Никогда не знаешь, в какой момент произойдет переход на другую запись. Приложение становится слабо-управляемым Табличная буфферизация - сохранение внесенных изменений только по команде TableUpdate() и никак иначе. Закрытие таблицы с не сохраненным буфером приведет к потере всех сделанных в этом буфере изменений. Ничего не будет сохранено Таким образом, как правило, если используют буфферизацию, то используют именно 5 режим буфферизации. Оптимистическая буфферизация таблиц Организация вызова подчиненной формы
this.setFocus() При работе с Grid, если вызывается подчиненная форма, то возможны разнообразные глюки и спец.эффекты, если в момент вызова фокус находится на объекте Grid. Собственно, нажатие кнопки и так переводит фокус на объект кнопки, но на случай программного вызова лучше взять за правило всегда явно уводить фокус из объекта Grid на любой другой объект. В данном случае, фокус был переведен на саму кнопку do form MyForm.scx Поскольку форма модальная, то, в данном случае, код обработки метода Click будет остановлен на данной команде до тех пор, пока вызванная форма не будет закрыта. Все, что написано после этой команды будет выполнено после закрытия этой формы. Т.е. после создания новой строки thisForm.Grid1.refresh() Это обновление картинка на форме. Запись-то создана, но в Grid она по умолчанию отображена не будет. Надо обновить "картинку". Правда, тут еще можно было бы сделать переход к новой записи, но это надо дополнительно писать "обвязку" на предмет того, что запись была создана, а не нажали кнопку "Отмена". В данном случае в этом нет смысла |
© 2000-2024 Fox Club  |