Пытаюсь организовать редактирование связанных таблиц средствами Clipper. Идея такова: На экране представлены три таблицы, связанные по общему ключевому полю. То есть область экрана разделена на три части, в каждой по одной таблице. Перемещение по таблицам должно быть синхронным. Также должна быть возможность редактирования любой из этих таблиц.
Попробовал использовать dbedit() Однако вывести содержимое всех трех таблиц одновременно не удалось, только по очереди, в итоге курсор находится внутри третьего dbedit() - третьей таблицы. Как перемещаться между таблицами - непонятно. В документации сказано, что dbedit() позволяет вложенные вызовы. Это как? Я понял так, что к первому dbedit() привязана пользовательская функция, внутри которой вызывается второй dbedit() и т.д. Попробовал сделать, из функции первого dbedit() вызывал второй dbedit(), из его функции, в свою очередь вызывал третий, а оттуда снова первый. Но это приводит к ошибке переполнения. Связал вызов дочерних dbedit() с клавишей TAB - в этом случае все три таблицы не отображаются, только первая, остальные по нажатию TAB, зато получилось циклическое перемещение между таблицами, но опять-таки после нескольких переходов возникает переполнение. На данный момент задача-минимум - вывод на экран трёх связанных таблиц с возможностью перехода между ними по клавише TAB.
Допускаю, что TBrowse() подходит лучше, но с ним пока вообще не разобрался. Посмотрел пример из поставки Clipper (tbdemo.prg) - как-то слишком уж развесистый код для отображения всего одной таблицы.
Итак, вопрос: Возможно ли с помощью нескольких dbedit() отображать на одном экране и редактировать несколько связанных таблиц одновременно? Прошу объяснить в общих чертах, как это делается. Либо ткните меня носом в статью/документацию/рабочий пример, ибо сам я ничего толком найти не смог.
Однако вывести содержимое всех трех таблиц одновременно не удалось, только по очереди,
Это все равно что ездить сразу на 3-х машинах ! Hephaestus пишет:
цитата:
На данный момент задача-минимум - вывод на экран трёх связанных таблиц с возможностью перехода между ними по клавише TAB.
Вот сделай вывод на экран по этой задаче, а переход между ними по клавише таб делаем в обработке каждого dbedit(). Как пример сваяешь, так и показывай код. А там дальше поможем.
Отправлено: 27.11.14 12:35. Заголовок: Andrey пишет: Это в..
Andrey пишет:
цитата:
Это все равно что ездить сразу на 3-х машинах !
Я имел в виду, что заполнен только первый dbedit, остальные пустые. Второй заполняется, только когда прерывается первый, третий заполняется, когда прерывается второй. Оно может и правильно, но если первый dbedit прервать, как потом в него вернуться?
Вот мой тестовый модуль. Выводит на экран одну таблицу с помощью dbedit. Прерывается по нажатию Esc.
function table1 param mod, nom do case case mod<4 return 1 case lastkey()=27 return 0 otherwise return 1 endcase return 1
Вот как вывести вторую таблицу - это вопрос. Второй dbedit откуда вызывать? Следом за первым или всё-таки из функции table1? Пока не понял.
Dima пишет:
цитата:
что то типа этого CLIPPER\SOURCE\TBROW\SKIPDBF\TBR21.prg
Да, именно так. Этот пример делает то, что нужно. Но это всё-таки TBrowse, а я пока мучаю dbedit. Тем не менее, за пример спасибо, не исключено, что возьму на вооружение.
Кстати, поясню, почему именно dbedit. У нас есть много приложений, созданных с помощью clipper. Они все имеют единый стиль интерфейса. И одни созданы на основе других. Там часто используется dbedit. Но там нигде не было параллельного просмотра таблиц в dbedit. Вот свою задачу я начал решать, также с помощью dbedit. Ради единообразия, ну и часть кода уже написана.
Вот если с dbedit можно сделать также как в tbr21.prg, то я хочу понять, как. Если же однозначно нет, тогда мне следует выкинуть нафиг dbedit и не тратить на него время, а разбираться с TBrowse.
Вот если с dbedit можно сделать также как в tbr21.prg, то я хочу понять, как.
Нельзя ! Это старая технология, в вашем случае использовать не нужно. Зря потратите время. Хотя поизвращаться можете. Примерно так:
lQuit := .T. M->nDBedit := 1 Do While lQuit // здесь сделать прорисовку каждого dbedit // т.е. в функции обработки сделать выход из dbedit при первом входе в него. // можно завести M->lFirsView := 0 и анализировать эту паблик переменную... DO CASE CASE M->nDBedit == 1 dbedit(2,1,9,78,fields,"table1",formats,titles,'-',,'','') CASE M->nDBedit == 2 dbedit(2,1,9,78,fields2,"table2",formats2,titles2,'-',,'','') CASE M->nDBedit == 3 dbedit(2,1,9,78,fields2,"table3",formats3,titles3,'-',,'','') ENDCASE
ENDDO
Значения M->nDBedit по TAB увеличивать на 1 и делать выход по TAB. Можно сделать ОДНУ обработку функции на все dbedit(), а можно и сделать отдельный функции. На ваше усмотрение. Координаты каждого dbedit() сделайте сами.
Это старая технология, в вашем случае использовать не нужно.
Знаю, что старая. Но была у меня дохленькая надежда.
цитата:
Зря потратите время.
Видимо, да. Собственно, я выше писал об этом.
цитата:
Хотя поизвращаться можете.
Не, не хочу. Лучше уж тогда TBrowse. Тем более, что в tbr21.prg более-менее внятный код. В совокупности со справочником нормально получается. Разбираюсь. Не так уж там всё запутано оказалось.
цитата:
Переходите лучше на хХарбор !!! Там проще...
А что сильно проще? Думал и об этом варианте тоже. Но конвертация кода в сишный с последующей компиляцией не выглядит проще, честно говоря.
Вообще я сейчас в ситуации Буриданова осла. Но на Clipper я уже кое-что делал, а (x)Harbour не щупал толком. Опять-таки нужна внятная литература, статьи в Сети , конечно, есть (читал Кресина), но... как-то недостаточно оказалось. Чего-то не хватает. С одной стороны - рассматриваются элементарные вещи а ля "ваши первые шаги в Harbour", с другой - уклон больше в сторону "как перевести вашу Clipper-программу на Harbour". И потом, если переходить на Harbour - это ж по-хорошему весь наш клипперный софт надо перетаскивать. Не потяну. Слишком много.
Dima пишет:
цитата:
Вообще имея свой TBrowse можно было бы все вывести в одной таблице тем более что они связаны общим ключом.
А вот это вряд ли. Пример, который я привёл - искусственный, данные взяты из книги Попова по FoxPro 2.5. Реальные таблицы - их три штуки, из каждой взято по шесть полей. Если в одном элементе всё выводить - не поместится на экране. А это только одна задача. Есть ещё две задачи - с теми же таблицами, но с другими наборами полей. Я планирую все три задачи реализовать в одной оболочке.
В итоге пока останавливаюсь на варианте с TBrowse.
Все даты в формате GMT
3 час. Хитов сегодня: 903
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет