в DBGrid на форме. И есть форма, с помощью которой можно как добавить запись, так и отредактировать. Делать две формы - не серьезно. Сделал одну, подтягиваю в событии OnShow в неё информацию по ID, на которой сейчас строка в DataSource. Так вот. Я реализовал это так. Имеется глобальная переменная gActivityType, в которую помещаю значение Add или Edit, в зависимости на какую кнопку нажал пользователь (Добавить или Редактировать). А в событии единой формы для добавление и редактирования проверяю значение в глобальной переменной. Если Add, то соответственно чищу Editы на форме, если Edit, то заполняю поля из активной записи. Аналогично и при нажатии на кнопку сохранить. Если в переменной Add, то делаю Insert, если в переменной Edit, то делаю Update записи. А как вы реализовывали подобное в своих проектах? Рисовали две формы или с одной и аналогично, как сделал я? Или может ещё какой интересный вариант?
Мне не нравится когда редактирование таблицы идет через отдельную форму. Я обычно использую фреймы. У меня один суперфрейм включает повторяющуюся между таблицами логику, а потом я делаю его потомки под каждую таблицу со своим набором полей ввода
Я примерно так же сделал, табличка с данными на одной панельке, элементы редактирования - на другой. Если запись редактируется, табличка дизейблится. Только не используй глобальную переменную, сделай отдельный тип и приватное поле Type TEditMode = (emAdd, emEdit) ... private FEditMode: TEditMode; ... Этому полю присваивай соответствующее значение в зависимости от того, добавляешь или редактируешь данные.
Конечно одной формы достаточно. Не понятно, зачем глобальная переменная, лучше ими не злоупотреблять. Я обычно делаю у формы редактирования class function ShowTheForm(AOwner: TForm; IsAdd: Boolean; Params....): Boolean
Это попахивает каким-то высшим пилотажем или серебряной пулей) Почитаю про фреймы
А потом к этому типу обращаться при открытии формы и сохранении? Принцип как с глобальной описывал?
Не надо подтягивать отдельно, просто тот же датасет указывай и создавай новую запись, если новая или просто начинай редактирование и открывай форму
Ну вот у меня на редактирование запускается хранимка, которая тащит данные по ID активного DataSet. Интуитивно понимаю, что эти данные у меня уже есть и зачем я повторно их тяну с БД. Но как лучше реализовать было, вот думал. Типа ссылаться на DataSource и тянуть отсюда: DataSource.DataSet.FieldByName('fieldName').AsString и тд?
Не при открытии, а при модификации твоих данных. Но, если полей у записи много, иногда разумнее отдельную форму заводить для их модификации
Количество полей 4, равных как при создании так и для редактирования записи. А при открытии, я имел ввиду, что мне ведь надо понимать в событии OnShow, я её открываю на редактирование или на добавление записи. В первом случае мне необходимо заполнить поля будет, а во втором очистить (от предыдущего открытия, если оно было)
Ну вот на, отредактируй данные в табличке или в форме с гридом 😁
А если это другая форма? У меня из одной, вызывается другая. Я получается в каждой вызываемой форме должен сделать тип и сделать поле публичным? Чтобы при вызове формы, я мог бы передать значение Add или Edit. А форма при открытии в событии OnShow посмотрела бы на значение этого типа и понимала бы, это новая запись или редактирование.
можно просто поле Tag пользовать ;-)
если форма знает про редактируемый датасет, выбор тривиален: если ключевое поле равно Null — значит, происходит добавление записи, если число — значит, редактирование
Это импрувемент в моей практике. Однозначно. Спасибо за идею)
даже ещё проще — у датасета есть состояние dsInsert/dsEdit и т.д.
Может ещё поделитесь опытом, где храните ID авторизованного пользователя? Его много где нужно использовать в хранимках, как параметр. Я пока использую глобальную переменную. Но может есть что-то более оригинальное
Но это если редактировать через DataSet. А в моем случае все на ХП. И я к датасету не обращаюсь
если нужно передавать один..три значения, то обычно tag хватает у контролов на форме, чтобы их использовать. Например делаю один обработчик и вешаю его на Х контролов, а что именно выполнять решается именно как Case TControl(Sender).Tag of (ну перед тим конечно с проверкой, что Sender всеже контрол)
Да, tag вообще красиво. Убрал глобальную переменную и уже переписал на него. Все отлично работает. Спасибо тебе за наводку. По поводу id пользователя вопрос все ещё актуален. Вот, например, в твоей программе произошла успешная авторизация и ты получил id авторизованного пользователя. Куда его записываешь? Чтобы потом в программе использовать его, подставляя, например, в параметр ХП
Тип на главной форме создаешь? Просто я тут ещё в практику себе ввел писать подобные штуки исключительно в DataModule. В него все-равно за query идти, поэтому модуль так или иначе подключен, ну а там уже и процедуры имеются. В одном месте все. Удобно. Раньше я отдельный модуль создавал для специфических процедур проекта
да. иенно в датамодуле обычно и пихаю.
Тип ты можешь описать в какой-нибудь одной форме, а потом в interface uses поддерживать ее в другой. И в этой другой заводить ещё одно поле этого типа
Делай в каждой вызываемой форме проперть CurrentUserID и пихай туда ID юзера, с которым работаешь
У меня синглтон, где в полях не только id текущего юзера а еще всякие данные которые мне надо во время работы апки, с любого места я могу обратиться за этими значениями
Обсуждают сегодня