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

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

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

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

Создание Single Page Application на фреймах

Запись от krapotkin размещена 16.11.2025 в 20:20
Показов 11934 Комментарии 3
Метки delphi, spa

Статья исключительно для начинающих. Подходы оригинальностью не блещут.

В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну главную форму, на которой меняем "начинку".
Разница с "классическим" подходом - каждая страница это не форма, а фрейм, который создается и вставляется в главную форму.
С т.з. программирования фрейм мало чем от формы отличается.
Отдельные формы в приложении будут, в основном, всевозможные диалоги.

Приступим.

1. Пусть в главной форме есть разные панели, меню и всякая другая фигня, типа дерева слева, как в делфи.
Заведем какую-нибудь панель для наших фреймов, пусть pnlMain.

2. Создадим новый пустой фрейм, назовем его BaseFrame (тогда класс автоматически назовется TBaseFrame) и создадим тип TBaseFrameClass. Сохраним в файле UBaseFrame.pas
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
type
TBaseFrame = class(TFrame)
public
  procedure Init;  virtual;
...
end;
TBaseFrameClass = class of TBaseFrame;
...
implementation
procedure TBaseFrame.Init();
begin
  // в базовом фрейме - ничего, а в наследниках скорее всего пригодится
end;

3. В классе формы заводим поле и процедуру
(по-хорошему, надо бы поле вынести отдельной глобальной переменной в отдельный файл, но в целом и так сойдет)
и и метод для смены фреймов
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
uses ....
UBaseFrame;
TForm1 = class(TForm)
public
  CurrentFrame : TBaseFrame;
  procedure CreateFrame(AClass: TBaseFrameClass)
end;
...
implementation 
procedure TFrom1.CreateFrame(AClass: TBaseFrameClass);
begin
  if Assigned(CurrentFrame) then
    CurrentFrame.Free;
 
  CurrentFrame := AClass.Create(Self);
  CurrentFrame.Parent := pnlMain;
  CurrentFrame.Align := alClient;
  CurrentFrame.Init();
end;
4. Теперь о том, как мы будем создавать новые фреймы
File -> New -> Other -> Inheritable Items -> найти класс BaseFrame
Появится новый фрейм, называйте его как угодно - TMyFrame1
Но на нем будет все то, что вы разместите в базовом фрейме.
Ну и всем им нужно будет при старте что-то загружать и настраивать.
Для этого мы придумали метод Init

Delphi
1
2
3
4
5
6
7
8
9
10
TMyFrame1 = class(TBaseFrame)
public
  aaa: integer;
  procedure Init; override;
end;
 
procedure TMyFrame1.Init; 
begin
   aaa := 5;  
end;

5. В программе при необходимости перехода на новую страницу нашего приложения
Delphi
1
2
3
CreateFrame(TFrame1);
...
CreateFrame(TFrame5);
для любого фрейма, которые вы насоздаете.
Метки delphi, spa
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 3
Комментарии
  1. Старый комментарий
    Здравствуйте.
    А код (заполнения списков, sql запросы, нажатия кнопок и т.д.) в этом случае пишется во Frame или с основной форме?
    Запись от Ru_Di размещена 16.11.2025 в 21:37 Ru_Di вне форума
  2. Старый комментарий
    Аватар для krapotkin
    - код как и раньше пишется в том модуле, к которому относится
    - в главной форме должно быть только управление фреймами, логины и прочее, что нужно главной форме
    - в каждом фрейме - то, что происходит именно в этом фрейме
    - работа с базой - либо во фрейме, либо, если общая часть - в датамодуль ее
    - если есть код и данные , которые используются в нескольких фреймах, сразу выносим их в отдельный файл и используем в модулях через uses
    Запись от krapotkin размещена 17.11.2025 в 09:26 krapotkin вне форума
  3. Старый комментарий
    Аватар для Usaga
    Мы делаем одну главную форму, на которой меняем "начинку".
    Разница с "классическим" подходом - каждая страница это не форма, а фрейм, который создается и вставляется в главную форму.
    А какую задачу ты так решаешь? Вообще, это один из подходов организации "микрофонтендов", и не самый удачный, но явно не озвучено это. И будто приложение при этом остаётся одно. Т.е. ни вашим, ни нашим.
    Запись от Usaga размещена 18.11.2025 в 06:49 Usaga вне форума
 
Новые блоги и статьи
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru