Форум программистов, компьютерный форум, киберфорум
krapotkin
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
Блог. Двадцать пять лет Делфи-практики

В этом блоге я буду публиковать ответы на вопросы, которые постоянно приходится повторять на форуме.
Здесь можно это сделать более развернуто и спокойно.

Все, что здесь написано, не является истиной в последней инстанции, скорее, это результат моих размышлений над архитектурой проектов, маленьких и больших, которых я сделал на Делфи более дюжины.

Начав с Делфи-2 двадцать пять лет назад, я прошел все версии, испробовал массу технологий, включая работу с БД, с графикой DirectX, связью с серверами и интернетом, разработку на Андроид и IOS, и многое, многое другое.
________________________________________ ________________________________________ ____
P.S. все, о чем здесь написано, всего лишь измышления из головы.
совпадения с реальными людьми и фактами случайны.

Создание и использование форм

Запись от krapotkin размещена 13.08.2017 в 08:09
Показов 15086 Комментарии 23
Метки delphi

Формы это то что придумано для взаимодействия вашей модели данных с пользователем.
Совсем НЕ для хранения глобальных переменных, настроек и прочей требухи.
Они должны создаваться в тот момент, когда понадобились, и уничтожаться после использования.
Поэтому первое, что мы должны сделать, создав новую форму, зайти в Project - Options - Forms и удалить ВСЕ формы, кроме главной, из Auto-Create

Второе.
Если какая-то ваша форма требует данных с главной формы, вы неправильно строите архитектуру!
Никаких "обратных" связей между формами не должно быть.
MainForm uses Form2 и всё. Наоборот - ни-ни.
Возможно, что нужны какие-то общие данные для этой формы. но тогда выносим данные в отдельный юнит и включаем его в uses у обеих форм.
После этого все просто как мычание.

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
25
26
27
28
29
uses USecondForm;
...
procedure TMainForm.Button1Click(Sender:TObject);
begin
  RunSecondForm();
end;
 
procedure TMainForm.RunSecondForm();
var f:TSecondForm;
  aa,bb,cc....
begin
  f:=TSecondForm.Create(NIL);
  try
    // подготавливаем форму к показу. заполняем ее поля. настраиваем настройки
    f.field1 := xxxx;
    f.field2 := yyyy;
    f.Init();
    // показываем модально и ждем результата
    if f.ShowModal()=mrOK then
    begin
      //забираем из полей формы все что нам нужно
      aa:=f.field5;
      bb:=f.field6;
    end;
  finally
    // и уничтожаем форму
    f.free;
  end;
end;
99% форм подпадают под этот сценарий
Метки delphi
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 23
Комментарии
  1. Старый комментарий
    Чем плохи обратные связи?
    Запись от GringoV размещена 15.08.2017 в 13:50 GringoV вне форума
  2. Старый комментарий
    Аватар для krapotkin
    Когда вам захочется одну форму в соседний проект вставить, окажется, что вы вставили все формы соседнего проекта
    Запись от krapotkin размещена 15.08.2017 в 13:59 krapotkin вне форума
  3. Старый комментарий
    В смысле "делайте независимые сущности" ?) Видимо это только с опытом познается, я 3 года кодю, но что-то об этом не задумывался. Спс за пост.
    Запись от GringoV размещена 15.08.2017 в 14:01 GringoV вне форума
  4. Старый комментарий
    Вы кстати часто говорили про модель данных, как в эту концепцию вписываются DBAware компоненты - они же вынуждены в себе хранить данные?
    Запись от GringoV размещена 15.08.2017 в 14:08 GringoV вне форума
  5. Старый комментарий
    Я вот наоборот, все делал эти обратные связи))) Казалось, что удобно, примерно так...

    Delphi
    1
    2
    3
    4
    5
    6
    
    var ownerform:TOwnerForm;
     
    begin
       ownerform:=(Self.Owner as  TOwnerForm);
      // do...
    end;
    Запись от GringoV размещена 15.08.2017 в 14:10 GringoV вне форума
  6. Старый комментарий
    Или это правило справедливо только для MainForm? А для Owner форм Ок?)
    Запись от GringoV размещена 15.08.2017 в 14:16 GringoV вне форума
  7. Старый комментарий
    Аватар для Avazart
    Чем плохи обратные связи?
    Тем что нельзя вырвать класс формы из одного проекта и вставить в другой или наоборот.
    Т.е это неправильный подход к проектированию.

    Классы по возможности не должны иметь взаимных связей.
    Но естественно так должно быть не во всех случаях.
    Запись от Avazart размещена 15.08.2017 в 14:36 Avazart вне форума
  8. Старый комментарий
    Аватар для krapotkin
    DBAware компоненты вообще не вписываются в современную концепцию программирования
    RAD-стиль программирования умирает. Это очевидно

    1. Клиент-сервер почти мертв. Только приложения локальной сети. Их все меньше
    2. Мобильные приложения вообще не имеют постоянного коннекта с сервером
    3. Свойства объекта раздергиваются на части и состояние открытых датасетов заменяет нам состояние модели данных
    4. Открытые коннекты к БД мухой ставят на колени сервера

    отсюда миграция парадигмы на http подход
    запрос - заполнение объектов данными - работа с объектами

    Если вам написать простое приложение для одного - двух пользователей, пофиг, можно писать как попало.
    Если приложение > 10, клиентов, форм, бизнес процессов, то все надо делать по уму, иначе придется потом разгребать завалы...
    Запись от krapotkin размещена 15.08.2017 в 14:48 krapotkin вне форума
  9. Старый комментарий
    Ну а как Вам UniGUI подход ? Там в основе всё тот же RAD и клиент-сервер и под мобилу можно писать. Библиотека плавно развивается вверх и вправо. RC недавно выпустили.
    Они идут против течения, но успешно, на мой взгляд. Сам недавно писал магазин на нёй, прямо очень хорошо пошло)
    Запись от GringoV размещена 15.08.2017 в 14:57 GringoV вне форума
  10. Старый комментарий
    А по поводу "Открытые коннекты к БД мухой ставят на колени сервера" Cachedupdates режим в помощь, нет?)
    Запись от GringoV размещена 15.08.2017 в 15:15 GringoV вне форума
  11. Старый комментарий
    Аватар для krapotkin
    Реализуйте в CachedUpdates получение уникального ID из базы для ключевых полей
    Запись от krapotkin размещена 15.08.2017 в 15:22 krapotkin вне форума
  12. Старый комментарий
    "Реализуйте в 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 GringoV вне форума
  13. Старый комментарий
    или вы имелли ввиду новый 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 GringoV вне форума
  14. Старый комментарий
    Возвращаясь к основное теме, выходит если нужно выдернуть данные из формы owner, необходимо их продублировать в 3-й сущности? А если скажем, мне никогда никогда не понадобится дергать этот класс в другой проект, вопрос трудозатрат встает, хотя в целом подход прикольный )
    Запись от GringoV размещена 15.08.2017 в 19:16 GringoV вне форума
  15. Старый комментарий
    Аватар для DenNik
    Поэтому первое, что мы должны сделать, создав новую форму, зайти в Project - Options - Forms и удалить ВСЕ формы, кроме главной, из Auto-Create
    вообще отключить автосоздаваемые формы в настройках
    Запись от DenNik размещена 18.08.2017 в 16:50 DenNik вне форума
  16. Старый комментарий
    Аватар для krapotkin
    вопрос трудозатрат встает всегда
    когда у вас что-то тесно связано с формой. например запись в базу повешена на кнопку, то первое, что вам придет в голову, когда нужно будет записать в базу в другой момент, это сделать Button.Click();
    при этом форму еще и сделаете скрытой
    и этот ком нелепостей будет расти
    это я привожу пример с реального коммерческого проекта

    а по поводу ID - как вы получите уникальный ID из базы, если вы отключены???
    Запись от krapotkin размещена 18.08.2017 в 20:04 krapotkin вне форума
  17. Старый комментарий
    ну отделять представление от модели - идея понятная, согласен на все 100.
    По поводу ID - в общем случае - подключился, получил, отключился.
    В частном, скажем в мускуле, с которым я работаю - подключился, вставил запись, получил ID, отключился
    В чем подвох, так и не могу понять? В случае модели данных - ведь тоже надо будет с базы как-то его получать?
    Запись от GringoV размещена 18.08.2017 в 21:30 GringoV вне форума
  18. Старый комментарий
    Кстати, про UniGUI, там когда создаешь новый проект, создается MainForm, MainModule и ServerModule, я всё думал, зачем этот MainModule, так так и выходит, что это модель данных. Там, скажем можно соединение хранить и прочие данные.
    Запись от GringoV размещена 18.08.2017 в 21:39 GringoV вне форума
  19. Старый комментарий
    Продолжая тему, всё таки интересно, для взаимодействия 2-х форм, создайте 3-й объект, а как это на практике?
    Создается MainModule на уровне глобальной переменной, в который "спихиваются" все общеиспользуемые данные или этот 3-й объект создается динамически на время жизни, необходимое 1 и 2?
    Запись от GringoV размещена 20.08.2017 в 13:17 GringoV вне форума
  20. Старый комментарий
    Аватар для krapotkin
    Такой пример можно посмотреть в заметке Программа и ее настройки
    Запись от krapotkin размещена 20.08.2017 в 21:29 krapotkin вне форума
 
Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru