169 похожих чатов

Доброй ночи. Вопрос знатокам. Имеется некая таблица, результат которой выведен

в DBGrid на форме. И есть форма, с помощью которой можно как добавить запись, так и отредактировать. Делать две формы - не серьезно. Сделал одну, подтягиваю в событии OnShow в неё информацию по ID, на которой сейчас строка в DataSource. Так вот. Я реализовал это так. Имеется глобальная переменная gActivityType, в которую помещаю значение Add или Edit, в зависимости на какую кнопку нажал пользователь (Добавить или Редактировать). А в событии единой формы для добавление и редактирования проверяю значение в глобальной переменной. Если Add, то соответственно чищу Editы на форме, если Edit, то заполняю поля из активной записи. Аналогично и при нажатии на кнопку сохранить. Если в переменной Add, то делаю Insert, если в переменной Edit, то делаю Update записи. А как вы реализовывали подобное в своих проектах? Рисовали две формы или с одной и аналогично, как сделал я? Или может ещё какой интересный вариант?

28 ответов

43 просмотра

Мне не нравится когда редактирование таблицы идет через отдельную форму. Я обычно использую фреймы. У меня один суперфрейм включает повторяющуюся между таблицами логику, а потом я делаю его потомки под каждую таблицу со своим набором полей ввода

Я примерно так же сделал, табличка с данными на одной панельке, элементы редактирования - на другой. Если запись редактируется, табличка дизейблится. Только не используй глобальную переменную, сделай отдельный тип и приватное поле Type TEditMode = (emAdd, emEdit) ... private FEditMode: TEditMode; ... Этому полю присваивай соответствующее значение в зависимости от того, добавляешь или редактируешь данные.

Конечно одной формы достаточно. Не понятно, зачем глобальная переменная, лучше ими не злоупотреблять. Я обычно делаю у формы редактирования class function ShowTheForm(AOwner: TForm; IsAdd: Boolean; Params....): Boolean

Евгений- Автор вопроса
Александр
Мне не нравится когда редактирование таблицы идет ...

Это попахивает каким-то высшим пилотажем или серебряной пулей) Почитаю про фреймы

Евгений- Автор вопроса
Ed Doc
Я примерно так же сделал, табличка с данными на од...

А потом к этому типу обращаться при открытии формы и сохранении? Принцип как с глобальной описывал?

Не надо подтягивать отдельно, просто тот же датасет указывай и создавай новую запись, если новая или просто начинай редактирование и открывай форму

Евгений- Автор вопроса
Hemul GM
Не надо подтягивать отдельно, просто тот же датасе...

Ну вот у меня на редактирование запускается хранимка, которая тащит данные по ID активного DataSet. Интуитивно понимаю, что эти данные у меня уже есть и зачем я повторно их тяну с БД. Но как лучше реализовать было, вот думал. Типа ссылаться на DataSource и тянуть отсюда: DataSource.DataSet.FieldByName('fieldName').AsString и тд?

Евгений
А потом к этому типу обращаться при открытии формы...

Не при открытии, а при модификации твоих данных. Но, если полей у записи много, иногда разумнее отдельную форму заводить для их модификации

Евгений- Автор вопроса
Ed Doc
Не при открытии, а при модификации твоих данных. ...

Количество полей 4, равных как при создании так и для редактирования записи. А при открытии, я имел ввиду, что мне ведь надо понимать в событии OnShow, я её открываю на редактирование или на добавление записи. В первом случае мне необходимо заполнить поля будет, а во втором очистить (от предыдущего открытия, если оно было)

Евгений
Количество полей 4, равных как при создании так и ...

Ну вот на, отредактируй данные в табличке или в форме с гридом 😁

Евгений- Автор вопроса
Ed Doc
Я примерно так же сделал, табличка с данными на од...

А если это другая форма? У меня из одной, вызывается другая. Я получается в каждой вызываемой форме должен сделать тип и сделать поле публичным? Чтобы при вызове формы, я мог бы передать значение Add или Edit. А форма при открытии в событии OnShow посмотрела бы на значение этого типа и понимала бы, это новая запись или редактирование.

Евгений
А если это другая форма? У меня из одной, вызывает...

если форма знает про редактируемый датасет, выбор тривиален: если ключевое поле равно Null — значит, происходит добавление записи, если число — значит, редактирование

Евгений- Автор вопроса
Alex
можно просто поле Tag пользовать ;-)

Это импрувемент в моей практике. Однозначно. Спасибо за идею)

Igor
если форма знает про редактируемый датасет, выбор ...

даже ещё проще — у датасета есть состояние dsInsert/dsEdit и т.д.

Евгений- Автор вопроса
Alex
можно просто поле Tag пользовать ;-)

Может ещё поделитесь опытом, где храните ID авторизованного пользователя? Его много где нужно использовать в хранимках, как параметр. Я пока использую глобальную переменную. Но может есть что-то более оригинальное

Евгений- Автор вопроса
Igor
даже ещё проще — у датасета есть состояние dsInser...

Но это если редактировать через DataSet. А в моем случае все на ХП. И я к датасету не обращаюсь

Евгений
Может ещё поделитесь опытом, где храните ID автори...

если нужно передавать один..три значения, то обычно tag хватает у контролов на форме, чтобы их использовать. Например делаю один обработчик и вешаю его на Х контролов, а что именно выполнять решается именно как Case TControl(Sender).Tag of (ну перед тим конечно с проверкой, что Sender всеже контрол)

Евгений- Автор вопроса
Alex
если нужно передавать один..три значения, то обычн...

Да, tag вообще красиво. Убрал глобальную переменную и уже переписал на него. Все отлично работает. Спасибо тебе за наводку. По поводу id пользователя вопрос все ещё актуален. Вот, например, в твоей программе произошла успешная авторизация и ты получил id авторизованного пользователя. Куда его записываешь? Чтобы потом в программе использовать его, подставляя, например, в параметр ХП

Евгений- Автор вопроса
Alex
TUser.ID :=)

Тип на главной форме создаешь? Просто я тут ещё в практику себе ввел писать подобные штуки исключительно в DataModule. В него все-равно за query идти, поэтому модуль так или иначе подключен, ну а там уже и процедуры имеются. В одном месте все. Удобно. Раньше я отдельный модуль создавал для специфических процедур проекта

Евгений
А если это другая форма? У меня из одной, вызывает...

Тип ты можешь описать в какой-нибудь одной форме, а потом в interface uses поддерживать ее в другой. И в этой другой заводить ещё одно поле этого типа

Евгений
Может ещё поделитесь опытом, где храните ID автори...

Делай в каждой вызываемой форме проперть CurrentUserID и пихай туда ID юзера, с которым работаешь

Евгений
Может ещё поделитесь опытом, где храните ID автори...

У меня синглтон, где в полях не только id текущего юзера а еще всякие данные которые мне надо во время работы апки, с любого места я могу обратиться за этими значениями

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта