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

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

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

28 ответов

31 просмотр

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

Я примерно так же сделал, табличка с данными на одной панельке, элементы редактирования - на другой. Если запись редактируется, табличка дизейблится. Только не используй глобальную переменную, сделай отдельный тип и приватное поле 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 текущего юзера а еще всякие данные которые мне надо во время работы апки, с любого места я могу обратиться за этими значениями

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
DS
8
Карта сайта