Блог. Двадцать пять лет Делфи-практики
В этом блоге я буду публиковать ответы на вопросы, которые постоянно приходится повторять на форуме.
Здесь можно это сделать более развернуто и спокойно.
Все, что здесь написано, не является истиной в последней инстанции, скорее, это результат моих размышлений над архитектурой проектов, маленьких и больших, которых я сделал на Делфи более дюжины.
Начав с Делфи-2 двадцать пять лет назад, я прошел все версии, испробовал массу технологий, включая работу с БД, с графикой DirectX, связью с серверами и интернетом, разработку на Андроид и IOS, и многое, многое другое.
________________________________________ ________________________________________ ____
P.S. все, о чем здесь написано, всего лишь измышления из головы.
совпадения с реальными людьми и фактами случайны.
В этом блоге я буду публиковать ответы на вопросы, которые постоянно приходится повторять на форуме.
Здесь можно это сделать более развернуто и спокойно.
Все, что здесь написано, не является истиной в последней инстанции, скорее, это результат моих размышлений над архитектурой проектов, маленьких и больших, которых я сделал на Делфи более дюжины.
Начав с Делфи-2 двадцать пять лет назад, я прошел все версии, испробовал массу технологий, включая работу с БД, с графикой DirectX, связью с серверами и интернетом, разработку на Андроид и IOS, и многое, многое другое.
________________________________________ ________________________________________ ____
P.S. все, о чем здесь написано, всего лишь измышления из головы.
совпадения с реальными людьми и фактами случайны.
Создание и использование форм
Запись от krapotkin размещена 13.08.2017 в 08:09
Показов 15086
Комментарии 23
Метки delphi
|
Формы это то что придумано для взаимодействия вашей модели данных с пользователем. Совсем НЕ для хранения глобальных переменных, настроек и прочей требухи. Они должны создаваться в тот момент, когда понадобились, и уничтожаться после использования. Поэтому первое, что мы должны сделать, создав новую форму, зайти в Project - Options - Forms и удалить ВСЕ формы, кроме главной, из Auto-Create Второе. Если какая-то ваша форма требует данных с главной формы, вы неправильно строите архитектуру! Никаких "обратных" связей между формами не должно быть. MainForm uses Form2 и всё. Наоборот - ни-ни. Возможно, что нужны какие-то общие данные для этой формы. но тогда выносим данные в отдельный юнит и включаем его в uses у обеих форм. После этого все просто как мычание.
| |||||
Метки delphi
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 23
Комментарии
-
Чем плохи обратные связи?Запись от GringoV размещена 15.08.2017 в 13:50
-
Запись от krapotkin размещена 15.08.2017 в 13:59
-
В смысле "делайте независимые сущности" ?) Видимо это только с опытом познается, я 3 года кодю, но что-то об этом не задумывался. Спс за пост.Запись от GringoV размещена 15.08.2017 в 14:01
-
Вы кстати часто говорили про модель данных, как в эту концепцию вписываются DBAware компоненты - они же вынуждены в себе хранить данные?Запись от GringoV размещена 15.08.2017 в 14:08
-
Я вот наоборот, все делал эти обратные связи))) Казалось, что удобно, примерно так...
Delphi 1 2 3 4 5 6
var ownerform:TOwnerForm; begin ownerform:=(Self.Owner as TOwnerForm); // do... end;
Запись от GringoV размещена 15.08.2017 в 14:10
-
Или это правило справедливо только для MainForm? А для Owner форм Ок?)Запись от GringoV размещена 15.08.2017 в 14:16
-
Запись от Avazart размещена 15.08.2017 в 14:36
-
DBAware компоненты вообще не вписываются в современную концепцию программирования
RAD-стиль программирования умирает. Это очевидно
1. Клиент-сервер почти мертв. Только приложения локальной сети. Их все меньше
2. Мобильные приложения вообще не имеют постоянного коннекта с сервером
3. Свойства объекта раздергиваются на части и состояние открытых датасетов заменяет нам состояние модели данных
4. Открытые коннекты к БД мухой ставят на колени сервера
отсюда миграция парадигмы на http подход
запрос - заполнение объектов данными - работа с объектами
Если вам написать простое приложение для одного - двух пользователей, пофиг, можно писать как попало.
Если приложение > 10, клиентов, форм, бизнес процессов, то все надо делать по уму, иначе придется потом разгребать завалы...Запись от krapotkin размещена 15.08.2017 в 14:48
-
Ну а как Вам UniGUI подход ? Там в основе всё тот же RAD и клиент-сервер и под мобилу можно писать. Библиотека плавно развивается вверх и вправо. RC недавно выпустили.
Они идут против течения, но успешно, на мой взгляд. Сам недавно писал магазин на нёй, прямо очень хорошо пошло)Запись от GringoV размещена 15.08.2017 в 14:57
-
А по поводу "Открытые коннекты к БД мухой ставят на колени сервера" Cachedupdates режим в помощь, нет?)Запись от GringoV размещена 15.08.2017 в 15:15
-
Запись от krapotkin размещена 15.08.2017 в 15:22
-
"Реализуйте в CachedUpdates получение уникального ID из базы для ключевых полей"
Тут какой-то тонкий намек, но я его видимо не вижу.
Обычно делаю что-то вроде
В чем подвох?Delphi 1 2 3 4 5 6 7 8
with someQuery do begin connection:=FFDConnection; cachedUpdates:=true; params.paramValues['someParam']:=FSomeParam; Disconnect; Open; id:=fieldByName('id').Asinteger; end;
Запись от GringoV размещена 15.08.2017 в 16:56
-
или вы имелли ввиду новый ID ? для вставки новой записи? тогда так...
Delphi 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
//add scale here with qSelectScalesWhereTestID do begin Connection:=FFDConnection try Params.ParamValues['tests_id']:=FTestID; CachedUpdates:=true; Open(); trWrite.StartTransaction(); Insert(); FieldByName('name').AsString:=scaleName; if ApplyUpdates<>0 then raise Exception.Create(RowError.Message); trWrite.Commit(); scaleID:=getLastInsertID(); except on E:Exception do begin if trWrite.Active then trWrite.Rollback; Cancel; CancelUpdates; Application.ShowException(E); end; end; end;
Ну а само получение ID через "select LAST_INSERT_ID() as lastInsertID;" скажем в MySQL в текущей сессии
открыли, получили, закрыли, как-то так...Запись от GringoV размещена 15.08.2017 в 17:03
-
Возвращаясь к основное теме, выходит если нужно выдернуть данные из формы owner, необходимо их продублировать в 3-й сущности? А если скажем, мне никогда никогда не понадобится дергать этот класс в другой проект, вопрос трудозатрат встает, хотя в целом подход прикольный )Запись от GringoV размещена 15.08.2017 в 19:16
-
Запись от DenNik размещена 18.08.2017 в 16:50
-
вопрос трудозатрат встает всегда
когда у вас что-то тесно связано с формой. например запись в базу повешена на кнопку, то первое, что вам придет в голову, когда нужно будет записать в базу в другой момент, это сделать Button.Click();
при этом форму еще и сделаете скрытой
и этот ком нелепостей будет расти
это я привожу пример с реального коммерческого проекта
а по поводу ID - как вы получите уникальный ID из базы, если вы отключены???Запись от krapotkin размещена 18.08.2017 в 20:04
-
ну отделять представление от модели - идея понятная, согласен на все 100.
По поводу ID - в общем случае - подключился, получил, отключился.
В частном, скажем в мускуле, с которым я работаю - подключился, вставил запись, получил ID, отключился
В чем подвох, так и не могу понять? В случае модели данных - ведь тоже надо будет с базы как-то его получать?Запись от GringoV размещена 18.08.2017 в 21:30
-
Кстати, про UniGUI, там когда создаешь новый проект, создается MainForm, MainModule и ServerModule, я всё думал, зачем этот MainModule, так так и выходит, что это модель данных. Там, скажем можно соединение хранить и прочие данные.Запись от GringoV размещена 18.08.2017 в 21:39
-
Продолжая тему, всё таки интересно, для взаимодействия 2-х форм, создайте 3-й объект, а как это на практике?
Создается MainModule на уровне глобальной переменной, в который "спихиваются" все общеиспользуемые данные или этот 3-й объект создается динамически на время жизни, необходимое 1 и 2?Запись от GringoV размещена 20.08.2017 в 13:17
-
Такой пример можно посмотреть в заметке Программа и ее настройкиЗапись от krapotkin размещена 20.08.2017 в 21:29


