Блог. Двадцать пять лет Делфи-практики
В этом блоге я буду публиковать ответы на вопросы, которые постоянно приходится повторять на форуме.
Здесь можно это сделать более развернуто и спокойно.
Все, что здесь написано, не является истиной в последней инстанции, скорее, это результат моих размышлений над архитектурой проектов, маленьких и больших, которых я сделал на Делфи более дюжины.
Начав с Делфи-2 двадцать пять лет назад, я прошел все версии, испробовал массу технологий, включая работу с БД, с графикой DirectX, связью с серверами и интернетом, разработку на Андроид и IOS, и многое, многое другое.
________________________________________ ________________________________________ ____
P.S. все, о чем здесь написано, всего лишь измышления из головы.
совпадения с реальными людьми и фактами случайны.
В этом блоге я буду публиковать ответы на вопросы, которые постоянно приходится повторять на форуме.
Здесь можно это сделать более развернуто и спокойно.
Все, что здесь написано, не является истиной в последней инстанции, скорее, это результат моих размышлений над архитектурой проектов, маленьких и больших, которых я сделал на Делфи более дюжины.
Начав с Делфи-2 двадцать пять лет назад, я прошел все версии, испробовал массу технологий, включая работу с БД, с графикой DirectX, связью с серверами и интернетом, разработку на Андроид и IOS, и многое, многое другое.
________________________________________ ________________________________________ ____
P.S. все, о чем здесь написано, всего лишь измышления из головы.
совпадения с реальными людьми и фактами случайны.
Что нужно знать о датасетах и DB-компонентах
Запись от krapotkin размещена 16.05.2018 в 09:10
Показов 6678
Комментарии 18
|
Ахтунг! Аттеншн! Внимание! 1. Все DB-компоненты ОТОБРАЖАЮТ текущую запись и поле датасета, к которому они подключены. НЕ ХРАНЯТ!!! Они являются элементами ИНТЕРФЕЙСА - т.е. штуками для работы пользователя! Не программиста!!! Нет смысла брать текст из DBEdit, его надо брать из поля датасета, к которому этот DBEdit подключен. И наоборот, писать туда значение - такая же дичь. Если узнаю, что вы так делаете, вычислю по IP и оборву что-нибудь важное! ) P.S. Для тех, кто обзывает компоненты DBEdit1, в аду стоит отдельный котел. 2 если ваши компоненты подключены к датасету через Datasource то при любом перемещении по компоненту, происходит перемещение и по датасету. И наоборот. Таким образом, датасет всегда стоит на той записи, которую видно в гриде поэтому данные просто берете из датасета 3. если у вас несколько компонентов подключены к одному датасету, то изменения и перемещения происходят во всех подключенных компонентах одновременно. поэтому сколько бы форм не ссылалось на один датасет, если изменятся данные в одной, то и в другой тоже 4. каждый датасет никак не связан с БД откуда он вытащил данные поэтому если два одинаковых датасета забрали одинаковые данные из БД, и в одном что-то поменять, или в БД что-то поменять, всем остальным пофиг. Для обновления данные нужно тащить заново. |
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 18
Комментарии
-
Запись от SatanaXIII размещена 16.05.2018 в 12:38
-
Запись от Avazart размещена 16.05.2018 в 12:39
-
Запись от krapotkin размещена 16.05.2018 в 14:14
-
Запись от Avazart размещена 16.05.2018 в 15:47
-
Вычислить IP - этого сегодня мало для того, чтобы получить дистанционный доступ к другому ПК при условии, что там не установлены специфичные программы.Запись от iner7 размещена 16.05.2018 в 17:16
-
DBEdit125.text :='Моя строка данных'; => не давно кстати так делал ( если, что - я не дебил ))) )
- в Query сидел сложный запрос (join из нескольких табличек)
- на форме dbaware компоненты настроенные на поля из разных табличек этого запроса
- при переходе в режим cashupdate и переводе датасета в режим редактирования
пришлось те из контролов что привязаны к полям приджоиных таблиц временно отключить от источника
данных и по сути использовать как обычные edit предварительно считав их содержимое в переменную
... ну при нажатии - "сохранить" соответственно в БД залить через другой запрос либо хранимкой - на выбор
хочу совет - изначально юзал ehlib - (обожаю эти компоненты)
так вот они без гемароя позволяют сделать из dbedit - обычный edit без усилий просто занилив datasource
понадобилось вместо них воткнуть альфа скиновые acDBedit - вот эти красивые но ни черта не умеют
что бы сделать аналогичное действо понадобилось
- динамически создать на форме обычные acEdit разместить их в тех же местах и отображать только при редактировании
ну соответственно куча костыльного кода типа findcomponent и тд. и тп.
нет можно конечно было в базе еще создать фейковую временную (tempolary) табличку - живущую на время транзакции
но ради такой задачи создавать объекты в БД это уж совсем изврат
еще вариант полностью от dbaware уйти - но блин они удобные быстрые функциональные и т.д.
подскажите есть ли способ альфа скиновый dbadit отвязать на время от бызы - но так чтобы в нем можно было текст
редактировать - то что он его не за поммнит мне - пофиг - нужно просто как форма ввода - так ведь не дает же
СОБАКА - заставляет огороды городить на пустом месте )))))))))))Запись от kebot размещена 30.05.2018 в 16:22
-
Запись от krapotkin размещена 30.05.2018 в 16:26
-
Запись от kebot размещена 30.05.2018 в 23:04
-
Запись от Avazart размещена 30.05.2018 в 23:47
-
не совсем понятно, что означает "валидировать" - т.е. пользователь вводит данные , а вы их перед записью в БД
корректируете ?
вообще конечно интересно кто как подходит к решению этой типичной для работы с БД задачей - как ввод и отображение
данных на клиенте.
вот допустим есть некая анкета и в ней полей 50 с данными
а рядом с анкетой некий контрол - dblokupbox, dbgrid..... - не суть неважно
просто то в чем можно записи скролить
ну и анкета напрямую или через мастер-детейл связана с этим списком/контролом
что эффективней в событии aftescroll - вручную обновлять - обычные TEdit
или отдать эту работу на откуп dbaware компонентов ?
ps/ из практики мной подмечено - что dbaware позволяют не загромождать код
смотришь на код проекта а там - сплошная бизнес логика и изредка островки того что все таки пришлось допилить )))
ну и по скорости хорошо проработанные компоненты от известных разработчиков как правило лучше - самописного
чудо велосипеда,
вообще считаю что любой "тра...дром" должен быть обоснованным
нужно ваять с нуля только те вещи которых просто нет в доступности или они очень специфичны
лучше посвятить время - обучению, получению прибыли и другим крайне полезным вещам )))Запись от kebot размещена 31.05.2018 в 13:44
-
Проверять правильность, например есть условие что в поле должны числа быть от 1 и до 10.
Т.е. тут нужен либо спинбокс либо комбобокс, а не эдит.
Или же поле bool и нужно вводить True / False опять же тут ли комбо бокс или чекбокс нужен.
Кроме того диапазон может быть вообще быть динамическим и меняться в зависимости от других полей или другой таблицы БД.
Такие вещи приходится разруливать "руками" т.е. рассматривать каждый случай, реализовывать его через обычные компоненты результаты и подставлять в запрос.Запись от Avazart размещена 31.05.2018 в 21:33
-
Не вижу связи между проверкой валидности и отказом от DBedit (покрайней мере в данном конкретном случае)
достаточно повесить на onChange дбэдита обработчик что то вроде такого
и все - пользователь просто физически не сможет ввести неверные данныеDelphi 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
//Контроль ввода неккоретных данных procedure TCalculateCountBitForm.InputRules(Sender: TObject); var i : Integer; s : string; begin with Sender as TDBEdit do begin s:= Text; if ( (s<>'') and not (StrToInt(s) in [0..255]) ) or ( (Length(Text)>1) and (Text[1]='0') ) then begin SetLength(s,Length(s)-1); Text:=s; SelStart:= Length(Text); SelLength:=0; end else if s<>'' then fINparam:=StrToInt(s); end; end;
но при этом все плюшки "автосинхрона" с БД остаются
к тому же спинбокс либо комбобокс,..чекбокс.. радиогруп.. все это есть в db варианте, выбор большойЗапись от kebot размещена 01.06.2018 в 08:47
-
DB контролы как раз подменяют нормальную модель данных своими прямыми связями с БД
в нормальной модели вы можете делать все что угодно, а тут вам приходится работать только с полями датасета
Никакой "бизнес-логики" в Dataset1Price.asCurrency * Dataset1Qty.AsFloat нет )))
Связывать сложную модель в 20-MASTER-100-DETAIL - это получить ужасного монстра.
А если еще добавить сложности работы с транзакциями, все становится вообще печально.
Так что разделение - наше всё.
Несмотря на это, для небольших программ DB компоненты вполне себе.
Но этот запас быстро исчерпывается.Запись от krapotkin размещена 01.06.2018 в 09:14
-
...ну не знаю, мне кажется это более сложившийся формат мышления - чем истинна
db контролы они же - в помощь, а не вопреки....
что кто то запретил писать запросы ? ))) или как то ограничивать себя в бизнес логике полями компонентов ?
за то если на форме сотни элементов отображающих текущее состояние данных
то нет необходимости вручную отслеживать и корректировать их состояние при каждом чихеЗапись от kebot размещена 01.06.2018 в 09:58
-
Запись от krapotkin размещена 01.06.2018 в 10:04
-
Запись от kebot размещена 01.06.2018 в 10:17
-
Запись от Avazart размещена 01.06.2018 в 11:13
-
Запись от kebot размещена 01.06.2018 в 12:00

Здорово.

