Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2024, 13:01   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию Программа-окно без конструктора форм

За последние пару лет я наловчился создавать большую часть элементов управления из программы через TButton.Create(self); TEdit.Create(self); TPanel.Create(self) и т.д.
И даже сделал себе много функций для того чтобы это делать быстрее

И на данный момент в большой многофункциональной программе, 90% элементов создаются изнутри. Некоторые при запуски, а некоторые - когда понадобятся (программа то многофункциональная и не всегда надо сразу всё).

Очень удобно то что можно прописывать их массивами
Код:
Buts1: array [0..20] of TButton;
И даже дополнительные окна (а их много) создаются при помощи TForm.Create

И вот на этом моменте у меня возник вопрос: а можно ли при создании программы обойтись вообще без конструктора формы? То есть, создать основное окно через TFrom.Create а дальше запустить программу в стандартном режиме реакций на действия (нажатия на кнопки и т.д.)

То есть, по сути, создать точно такую же по функционалу программу, но у которой ВСЁ, включая основную форму, создано кодом
Kronos913 вне форума Ответить с цитированием
Старый 17.04.2024, 14:37   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
а можно ли при создании программы обойтись вообще без конструктора формы?
Можно. Можно даже без формы вообще.

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
То есть, создать основное окно через TFrom.Create а дальше запустить программу в стандартном режиме реакций на действия (нажатия на кнопки и т.д.)
А вы думаете делфя делает какую-то магию?

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
То есть, по сути, создать точно такую же по функционалу программу, но у которой ВСЁ, включая основную форму, создано кодом
Таки что вас останавливает?
p51x вне форума Ответить с цитированием
Старый 17.04.2024, 14:42   #3
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

создание формы на чистом WinAPI хотите?
вот тут в четвёртом комментарии архив приложен - там создаётся форма в виде кучи кнопок без TForm1 и привычных вам трёх кнопок в верхнем правом углу.
https://www.programmersforum.ru/showthread.php?t=346894
----------
ну, в чистом бассейне покупались, теперь ныряйте в мутный омут с головой... добро жопаловать, как говорится (да, тут печаток нет)
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 17.04.2024 в 14:44.
NetSpace вне форума Ответить с цитированием
Старый 17.04.2024, 14:44   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
а можно ли при создании программы обойтись вообще без конструктора формы?
Конструктор форм это удобный инструмент, ускоряющий разработку. Хотите минимизировать размер ЕХЕ и не использовать конструктор, тогда зачем вам вообще VCL? Пишите на чистом WinAPI.
Arigato на форуме Ответить с цитированием
Старый 17.04.2024, 14:54   #5
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Kronos913,
Удаляете .dfm-файл и директиву {$R *.dfm} из модуля формы (а также, в зависимости от наличия компонентов на конструированной форме, их надо удалить из полей класса формы), и у вас не будет конструктора, но при этом создание пустой формы будет работать как обычно (оно прописано в dpr)

Пы.Сы. если я ничего не путаю, конечно, давно уже не колдовал на формах. Однако, это не уменьшит на какой либо существенный объём экзешку, как и 95% остальных обсуждаемых Вами методов, Вы только придумываете сложности на ровном месте. Динамические интерфейсы это нормально, когда их нужно собирать именно динамически под разные задачи, а вот если задача известна, то наоброт проще создать форму визуально собрав интерфейс, а не ручками в коде

Последний раз редактировалось phomm; 17.04.2024 в 16:20.
phomm вне форума Ответить с цитированием
Старый 17.04.2024, 17:51   #6
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
И даже дополнительные окна (а их много) создаются при помощи TForm.Create
Технически форму нужно создать через TApplication.CreateForm, чтобы она стала главной формой приложения. Тогда дальнейший вызов TApplication.Run запустит цикл обработки сообщений и приложение «запустится», а не завершит работу сразу же, как бывает без главной формы.

Для создания формы TApplication.CreateForm внутри себя вызывает TForm.Create, никакой магии в нем нет. Точнее, «магия» в установке свойства TApplication.MainForm. Если оно равно nil, TApplication.Run не знает, какому окну переправлять получаемые от ОС сообщения, и завершает работу. Для программиста свойство TApplication.MainForm — только для чтения, его значение устанавливается как раз через TApplication.CreateForm.

То есть, код в .dpr-файле, создаваемый Delphi и модифицируемый через окно свойств приложения, не является волшебными заклинаниями, а является обычным кодом на Паскале с логикой, которую я описал. Всё это есть в справке.

Соглашусь с предыдущими ораторами, что избавление от визуальных форм почти не повлияет на размер exe-файла. Если хочется большей автоматизации или декомпозиции, откройте для себя визуальное наследование.

Последний раз редактировалось Vapaamies; 17.04.2024 в 17:53.
Vapaamies вне форума Ответить с цитированием
Старый 18.04.2024, 01:53   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
То есть, код в .dpr-файле, создаваемый Delphi и модифицируемый через окно свойств приложения, не является волшебными заклинаниями, а является обычным кодом на Паскале с логикой, которую я описал. Всё это есть в справке.
+100500
И этот код можно ручками написать в любом простом текстовом редакторе.
northener вне форума Ответить с цитированием
Старый 18.04.2024, 02:09   #8
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Однако, это не уменьшит на какой либо существенный объём экзешку, как и 95% остальных обсуждаемых Вами методов
Я заметил, что перенос процедуры из раздела published в public уменьшает ее код.
Вот только процедуры из public не могут прикрепляться к объектам на форме.

И на сколько я понял, у объекта созданного через конструктор, прописываются все параметры.

В то время как если объект создаётся динамически, можно вызовом одной процедуры настроить махом сразу три свойства
Код:
Function CreateButton(Parent1: TWinControl):TButton;
begin
  Result:=TButton.Create(Parent1);
  Result.Parent:=Parent1;
  Result.Font.Charset:=RUSSIAN_CHARSET;
end;
По поводу Charset - я когда поставил раннюю версию Windows 11 - у программы началась жесткая проблема с кодировкой и единственное решение было на каждом объекте прописывать Charset

Последний раз редактировалось Kronos913; 18.04.2024 в 02:18.
Kronos913 вне форума Ответить с цитированием
Старый 18.04.2024, 14:49   #9
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

В качестве теста сделал вот такую вот программку. Всё ли верно?
Код:
program Project1;
uses
  Forms, SysUtils, MyBase1Unit;
var
  MouseTest1:MouseTest;
begin
  Application.Initialize;
  MouseTest1.Create1(nil);
  MouseTest1.Run(nil);
  Application.Run;
end.
А в юните MyBase1Unit описан такой вот объект
Код:
  MouseTest = object
    Private
      Procedure MD(Sender: TObject; Button: TMouseButton;
                     Shift: TShiftState; X, Y: Integer);
    public
      L:TLabel;
      F:Form;
      Procedure Create1(Owner1: TWinControl);
      Procedure Run(Sender: TObject);
  end;
Kronos913 вне форума Ответить с цитированием
Старый 19.04.2024, 22:04   #10
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Kronos913,
Удаляете .dfm-файл и директиву {$R *.dfm} из модуля формы (а также, в зависимости от наличия компонентов на конструированной форме, их надо удалить из полей класса формы), и у вас не будет конструктора, но при этом создание пустой формы будет работать как обычно (оно прописано в dpr)
Попытался так сделать - программа перестала работать. Пришлось возвращать обратно форму которая к тому моменту уже была пустой
Kronos913 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ Создать структуру пирамида. В структуре предусмотреть создание конструктора по умолчанию, конструктора с параметрами, деструктора Cyber321 Помощь студентам 12 14.12.2018 10:08
Почему в PHP нет визуального конструктора форм как в VB? Ципихович Эндрю PHP 13 10.01.2017 18:55
Пропало окно конструктора формы. как вернуть? Gavri1a Общие вопросы .NET 6 23.09.2016 01:24
Перемена размер окно форм в Access 2007-2010 Тантан Microsoft Office Access 5 29.05.2013 17:17
Автоматическое преобразование на основе первого аргумента конструктора в вызов самого конструктора jennya Visual C++ 8 03.10.2010 19:03