powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Быстрое создание форм
25 сообщений из 67, страница 1 из 3
Быстрое создание форм
    #39923463
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В проекте создается 200 инстансов одной формы (тяжелое наследие) примерно таким кодом
Код: pascal
1.
2.
for i := 0 to 200 do
  MyForm := TMyForm.Create;



В итоге на это все уходит 12 секунд. "Тормозит" метод ReadState. Т.е. непосредственно вычитывание формы из dfm. Можно это как-то ускорить?

Про создавать одну форму и перенастраивать ее знаю. Когда-то сделаю. Создавать форму при первом обращении к ней, пожалуй, еще сложнее, чем создавать одну. Тяжелый легаси код. Сейчас интересует именно как ускорить чтение dfm. Может Можно как-то клонировать уже созданную форму?

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923465
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Повесить окно "Загрузка форм"
Это значительно ускорит процесс чтения
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923470
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr
Повесить окно "Загрузка форм"
Это значительно ускорит процесс чтения
Это в смысле шутка такая? Чтобы пользователь не нервничал?
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923471
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если 200 форм не видны на экране, то зачем их создавать ?
Проще потратить время на вычистку Автосоздаваемых форм, чтем пытаться что-то изменить
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923474
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr
Проще потратить время на вычистку Автосоздаваемых форм, чтем пытаться что-то изменить
Они не в автосоздаваемых формах
DimaBr
Если 200 форм не видны на экране, то зачем их создавать ?
Каждая форма привязана к управляющему объекту. И для каждого объекта создается своя форма. Потом показывается форма для выбранного объекта. При изменении состояния объекта он изменяет что-то на своей форме.

Еще раз
_Vasilisk_
Про создавать одну форму и перенастраивать ее знаю. Когда-то сделаю.
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923478
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Сейчас интересует именно как ускорить чтение dfm


вы точно уверены, что именно чтение .dfm занимает столько время, а не пост-обработка?

Возможно, там дело в датасетах, у которых свойство .Active = true. Или еще что-нибудь долгое происходит в конструкторе.
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923479
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

создавать контролы в рантайме?
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923484
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Чтобы пользователь не нервничал?
да, за наблюдением анимации прогресса им возможно будет комфортнее
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923485
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семён
вы точно уверены, что именно чтение .dfm занимает столько время, а не пост-обработка?
Да. Основное время это между вызовом ReadState и до вызова Loaded
Кроик Семён
Возможно, там дело в датасетах,
Их на форме нет вообще
Кроик Семён
Или еще что-нибудь долгое происходит в конструкторе.
FormCreate для всех форм в сумме выполняется за 600 миллисекунд
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923487
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, автовыравнивание/сайзинг контролов на форме используется?
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923494
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavan
автовыравнивание/сайзинг контролов на форме используется?
Да. Массово
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923500
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Да. Массово
думаю это скорости тоже не добавляет
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923505
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не лечите йодом, лучше рубите.
Лучше день потерять, потом за 5 минут долететь.
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923507
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavan
думаю это скорости тоже не добавляет
По исходникам как бы так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure TCustomForm.ReadState(Reader: TReader);
var
  NewTextHeight: Integer;
  Scaled: Boolean;
begin
  DisableAlign;
  try
    ..............
    inherited ReadState(Reader);
    ..............
  finally
    EnableAlign;
  end;
end;
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923509
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr
Не лечите йодом, лучше рубите.
Да похоже, что все к тому идет
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923510
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каждая форма привязана к управляющему объекту. И для каждого объекта создается своя форма. Потом показывается форма для выбранного объекта. При изменении состояния объекта он изменяет что-то на своей форме
Мне это напоминает пост про шестиугольники.
Вместо того чтобы нарисовать 200 объектов на одной канве, человек создаёт 200 контролов, потому что ОДИН нужно двигать
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923524
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_> В проекте создается 200 инстансов одной формы (тяжелое наследие)

В сторону - меня всегда удивляли дебри, в которых ты
оказываешься и пытаешься выбраться. Это то прежнее
место работы или уже новое?

_Vasilisk_> "Тормозит" ... вычитывание формы из dfm. Можно это как-то ускорить?

Можно, вариантов несколько.

1. Переработать архитектуру от вычитывания 200 форм.
При чём вряд ли "не создавать одну и перенастраивать" -
ибо тогда все объекты будут в очереди к 1 инстансу?
Я бы скорее предложил создавать (вычитывать из dfm) 1
форму, а потом в цикле создавать новые чистые инстансы
и клонировать/копировать в них первую форму.

2. Сделать своего наследника, который читать будет не из
dfm, а из своего стрима - с учетом файлового кеша не знаю
насколько это ускорит, но проверить как вариант можно.

3. Сделать своего наследника, который будет не читать из
dfm, а тупо клонировать объект, переданный параметром -
этакая вариация п.1.

_Vasilisk_> Создавать форму при первом обращении к ней,
_Vasilisk_> пожалуй, еще сложнее, чем создавать одну.

Это я не понял.

_Vasilisk_> Может Можно как-то клонировать уже созданную форму?

Конечно, можно. RTTI, например. В последних версиях и
готовые методы появились, наверное.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923528
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
В проекте создается 200 инстансов одной формы (тяжелое наследие)

Я не спрашиваю, кто это придумал - и так ясно, что инопланетянин. Но мне очень интересно - зачем? Какую задачу он решал таким образом?

_Vasilisk_
"Тормозит" метод ReadState.

Точно он сам? Или таки выполнение различных методов свойств и прочих инициализаций из него?

_Vasilisk_
Т.е. непосредственно вычитывание формы из dfm. Можно это как-то ускорить

Единственное, что мне приходит в голову - взять из Classes.pas исходники TReader и на их основе сделать свой reader, применяющий каждую считанную строчку к 200-м формам разом.
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923534
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
Это то прежнее место работы или уже новое?
Прежнее. Проект огромен и куски рефракторятся только если прижмет и есть свободное время.
Гаджимурадов Рустам
При чём вряд ли "не создавать одну и перенастраивать" - ибо тогда все объекты будут в очереди к 1 инстансу?
Там даже очередей не нужно будет. Нет формы - ничего не делаем. Только потом когда форма у объекта появится ее нужно будет довести до текущего состояния объекта
Гаджимурадов Рустам
Я бы скорее предложил создавать (вычитывать из dfm) 1 форму, а потом в цикле создавать новые чистые инстансы и клонировать/копировать в них первую форму.
Вот этого и хочу. RTFM что?
Гаджимурадов Рустам
2. Сделать своего наследника, который читать будет не из dfm, а из своего стрима - с учетом файлового кеша не знаю насколько это ускорит, но проверить как вариант можно.
А смысл? Если dfm тянется из ресурсов экзешника, который уже загружен в память. Где здесь вообще файловая система?
Гаджимурадов Рустам
_Vasilisk_> Создавать форму при первом обращении к ней,
_Vasilisk_> пожалуй, еще сложнее, чем создавать одну.
Это я не понял
Код: pascal
1.
2.
3.
4.
5.
6.
function TMyObject.GetForm: TMyForm;
begin
  if  FForm = nil then
    FForm := TMyForm.Create(nil);
  Result := FForm;
end;


Гаджимурадов Рустам
Конечно, можно. RTTI, например
И куда смотреть? Тупо рекурсивно перебирать все published свойства и копировать их с эталона?
Гаджимурадов Рустам
В последних версиях и готовые методы появились, наверное.
Пока XE3
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923535
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
_Vasilisk_> Может Можно как-то клонировать уже созданную форму?

Конечно, можно. RTTI, например. В последних версиях и
готовые методы появились, наверное.

Я думаю, коллеге стоит уточнить вопрос: "Можно ли клонировать уже созданную форму так, чтобы это получилось быстрее, чем десериализацией?"
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923539
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
Но мне очень интересно - зачем? Какую задачу он решал таким образом?
Независимость отображения каждого объекта. На старте проекта объектов было не более 10.
softwarer
Точно он сам?
Ну как точно? В Classes тайминги особо не поставишь. Смотрю по двум чекпойнам: вызов TForm.ReadState и вызов TForm.Loaded. По идее, вся инициализация должна происходить в методе Loaded
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923544
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Ну как точно? В Classes тайминги особо не поставишь.

Думаю, если скомпилировать с отладочными dcu, AQTime ответил на этот вопрос. А так очень легко может быть, что оптимизироваться будет то, что и так проскакивает за доли секунды.

_Vasilisk_
Смотрю по двум чекпойнам: вызов TForm.ReadState и вызов TForm.Loaded. По идее, вся инициализация должна происходить в методе Loaded

Это какая-то в высшей степени странная идея.
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923548
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_> Вот этого и хочу. RTFM что? И куда смотреть?
_Vasilisk_> Тупо рекурсивно перебирать все published свойства
_Vasilisk_> и копировать их с эталона?

Типа того, там несложно. Примеры приводились и у нас IIRC,
и на SO наверняка есть. Я помню упоминания, что соотв. код
есть где-то и внутрях VCL (или RTL), но в каком методе -
искать лень. Для примера https://habr.com/en/post/204678


_Vasilisk_> А смысл? Если dfm тянется из ресурсов экзешника, который
_Vasilisk_> уже загружен в память. Где здесь вообще файловая система?

Ну да, считай то же самое. Я думал ты их снаружи (из БД и пр.)
читаешь, собираешь. Тогда забудь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923550
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer> чтобы это получилось быстрее, чем десериализацией?"

Это довольно редкая прикладная задача: если кто-то не
сталкивался с ней реально - вряд ли сможет подсказать точно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Быстрое создание форм
    #39923555
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
AQTime
Где его искать? Он вроде установлен, но я нигде его не вижу
...
Рейтинг: 0 / 0
25 сообщений из 67, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Быстрое создание форм
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]