powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FormShow задержка
25 сообщений из 26, страница 1 из 2
FormShow задержка
    #40108376
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, подскажите, есть форма настроек (грузятся из ini-файла), на ней расположены radiogroup rgParam1, rgParam2 и т.д.
Проблема в том, что некоторые элементы radiogroup не успевают инициализироваться, а форма уже показывается с неправильными настройками radiogroup.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
procedure TFrmParam.FormShow(Sender: TObject);
begin
  LoadParam;
end;

procedure TFrmParam.LoadParam;
var
  IniFile: TIniFile;
begin
  IniFile := TIniFile.Create('Params.ini');
  try
    Param1 := IniFile.ReadInteger('Razdel1', 'Param1', 0);
    rgParam1.ItemIndex := Param1;
    ......
    //ShowMessage('test');
    Param20 := IniFile.ReadInteger('Razdel20', 'Param20', 0);
    rgParam20.ItemIndex := Param20;
 finally
    FreeAndNil(IniFile);
  end;
end;



Проблема в том, что форма отображается раньше чем грузятся параметры в LoadParam.
Если раскоментировать //ShowMessage('test'); тогда форма успевает отобразить параметры загруженные из Ini файла в radiogroup.

Каким образом правильнее избежать такого поведения?
Пробовал Application.ProcessMessage добавить в TFrmParam.LoadParam это не привело к результату.
...
Рейтинг: 0 / 0
FormShow задержка
    #40108377
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

Не верю ни одному слову.

Впрочем, LoadParam вызывать надо в FormCreate. Хотябы потому, что FormShow может вызываться несколько раз.
...
Рейтинг: 0 / 0
FormShow задержка
    #40108386
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock, ваше право верить или нет, нет форма глобальная и в create я вызвать loadparam не могу.
...
Рейтинг: 0 / 0
FormShow задержка
    #40108387
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

осталось показать код создания и отображения формы и народ подтянется и накидает ошибок...
...
Рейтинг: 0 / 0
FormShow задержка
    #40108391
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
форма глобальная и в create я вызвать loadparam не могу.
Не знаю, чем отличаются локальные формы от глобальных, но событие OnCreate есть у всех.
...
Рейтинг: 0 / 0
FormShow задержка
    #40108402
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как только закрываю форму FrmParam (крестик), параметры меняются, а не должны.
На OnClose и onCreate - пусто.

type
TFrmParam = class(TForm)

public
Param1: Integer;
....
Param20: Integer;
var
FrmParam: TFrmParam;

implementation

Код: pascal
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.
procedure TFrmParam.FormShow(Sender: TObject);
begin
 LoadParam;
 UpdateParams;
end;

procedure TFrmParam.LoadParam;
var
  IniFile: TIniFile;
begin
  IniFile := TIniFile.Create('Params.ini');
  try
    Param1 := IniFile.ReadInteger('Razdel1', 'Param1', 0);
    ......
    //ShowMessage(IntToStr(Param1)); -- 0
    Param20 := IniFile.ReadInteger('Razdel20', 'Param20', 0);
 finally
    FreeAndNil(IniFile);
  end;
end;

procedure TFrmParam.UpdateParams;
begin
  rgParam20.ItemIndex := Param20;
end;
...
Рейтинг: 0 / 0
FormShow задержка
    #40108410
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetКак только закрываю форму FrmParam (крестик), параметры меняются, а не должны.

Ты всерьёз думаешь, что здесь кто-то способен догадаться что именно из
приведённого кода ты называешь словом "параметры" и где/каким манером они
"меняются"?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
FormShow задержка
    #40108416
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покажите тот кусок кода, где вы вызываете PostMessage и расскажите, зачем вы это делаете?
...
Рейтинг: 0 / 0
FormShow задержка
    #40108426
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Проблема в том, что форма отображается раньше чем грузятся параметры в LoadParam

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

Форма MDI-ная или обычная?
...
Рейтинг: 0 / 0
FormShow задержка
    #40108470
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer, обычная форма.
...
Рейтинг: 0 / 0
FormShow задержка
    #40108473
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
wsnet
Проблема в том, что форма отображается раньше чем грузятся параметры в LoadParam

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

Форма MDI-ная или обычная?
"Глобальная", сказали же :)
А так-то это не важно. MDI тоже показываются после OnShow, и чайлды и клиент.
...
Рейтинг: 0 / 0
FormShow задержка
    #40108475
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
softwarer, обычная форма.

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

YuRock
А так-то это не важно. MDI тоже показываются после OnShow, и чайлды и клиент.

У MDI-ных Visible связан с Create, и это вносит в процесс определённую путаницу. Поэтому на всякий случай спросил, вдруг там чего намудрили.
...
Рейтинг: 0 / 0
FormShow задержка
    #40108486
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet

Проблема в том, что некоторые элементы radiogroup не успевают инициализироваться

Кто и когда меняет ini?
...
Рейтинг: 0 / 0
FormShow задержка
    #40108508
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot softwarer#22390689]
wsnet
softwarer, обычная форма.

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

если cxRadioGroup то все хорошо, если просто TRadioGroup то плохо.

https://disk.yandex.ru/d/Tz2-uvEQeuSGVA
...
Рейтинг: 0 / 0
FormShow задержка
    #40108513
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
// MDI тоже показываются после OnShow, и чайлды и клиент.

Ога, но:
у обычной срабатывает ОнКриейт , потом ОнШоу ,
у МДИ сначала срабатывает ОнШоу , а потом ОнКриейт .

Кажется странным, но это вполне логично.
И незнание этого иногда приводит к неприятным ошибкам.
Н-р в формах, которые могут быть и модальными и МДИ (переделан конструктор).
...
Рейтинг: 0 / 0
FormShow задержка
    #40108527
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
FormShow задержка
    #40108529
northener
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторПроблема в том, что некоторые элементы radiogroup не успевают инициализироваться, а форма уже показывается с неправильными настройками radiogroup.
wsnet вы путаете инициализацию с визуальной отрисовкой компонента/контрола.
Инициализируются-то они вовремя, а вот отрисовка запаздывает.
О чём вам и говорит разница между Tcx и обычным контролом.
Так что у вас два варианта. Либо вы используете Tcx, либо пишете свой контрол.
...
Рейтинг: 0 / 0
FormShow задержка
    #40108531
northener
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr, вы привели скриншот уже открытой формы. И там всё нормально. Но если вы внимательно посмотрите показ открывания формы, то увидите что в момент показа выбранное значение TRadioGroup не такое, которое должно быть. Через несколько долей секунды оно принимает правильное значение. Вероятно именно это и нервирует ТС.
...
Рейтинг: 0 / 0
FormShow задержка
    #40108594
AleksR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wsnet
Как только закрываю форму FrmParam (крестик), параметры меняются, а не должны.
На OnClose и onCreate - пусто.

type
TFrmParam = class(TForm)

public
Param1: Integer;
....
Param20: Integer;
var
FrmParam: TFrmParam;

implementation

Код: pascal
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.
procedure TFrmParam.FormShow(Sender: TObject);
begin
 LoadParam;
 UpdateParams;
end;

procedure TFrmParam.LoadParam;
var
  IniFile: TIniFile;
begin
  IniFile := TIniFile.Create('Params.ini');
  try
    Param1 := IniFile.ReadInteger('Razdel1', 'Param1', 0);
    ......
    //ShowMessage(IntToStr(Param1)); -- 0
    Param20 := IniFile.ReadInteger('Razdel20', 'Param20', 0);
 finally
    FreeAndNil(IniFile);
  end;
end;

procedure TFrmParam.UpdateParams;
begin
  rgParam20.ItemIndex := Param20;
end;




А ты случайно не сохраняешь параметры на OnClick у rgParam1, rgParamX ... ?
...
Рейтинг: 0 / 0
FormShow задержка
    #40108685
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
northener
Через несколько долей секунды оно принимает правильное значение.

Простите, я несколько долей секунды глазом не воспринимаю.
...
Рейтинг: 0 / 0
FormShow задержка
    #40108729
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

лабуда какая-то. FormShow не надо трогать. И Load и UpdateParams должны вызываться в FormCreate, и не будет никакого моргания.
В противном случае поставьте брейкпойнт на вашем коде в FormShow, и вы задолбаетесь F8 в отладчике нажимать.
Это же окно с параметрами, которые грузятся из файла. Оно показываться должно с УЖЕ загруженными и установленными параметрами.
...
Рейтинг: 0 / 0
FormShow задержка
    #40108730
northener
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 DimaBr
Человеческий глаз не замечает изменений картинки происходящих за менее ~2мс. А тут примерно 0.5 секунды. Даже я их замечаю, хотя я всего на три года моложе ЮЗ. Правда в отличии от ЮЗ у меня уже три года как глаза искусственные. :)
...
Рейтинг: 0 / 0
FormShow задержка
    #40108731
northener
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv
wsnet,

лабуда какая-то. FormShow не надо трогать. И Load и UpdateParams должны вызываться в FormCreate, и не будет никакого моргания.
В противном случае поставьте брейкпойнт на вашем коде в FormShow, и вы задолбаетесь F8 в отладчике нажимать.
Это же окно с параметрами, которые грузятся из файла. Оно показываться должно с УЖЕ загруженными и установленными параметрами.

У ТС форма создаётся только один раз. В дальнейшем несколько раз вызывается её ShowModal. Вы считаете это неправильным?
...
Рейтинг: 0 / 0
FormShow задержка
    #40108733
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

не, я наврал. Давно Дельфи в руках не держал. Глянул свой код, у меня сделано так:
Код: pascal
1.
2.
3.
4.
procedure TfrmOptions.FormShow(Sender: TObject);
begin
  UpdateControls;
end;



В UpdateControls действительно всем контролам присваиваются значения параметров.
В FormCreate только "подготовительные" действия.
Параметры считываются сразу при старте приложения.
Форма параметров создается по кнопке в меню. И форма показывается как диалог (ShowModal).
При этом ничего не "моргает", и никогда не моргало, я не знаю, почему.
И контролов на этой форме штук тридцать, плюс цветные TLabel.
...
Рейтинг: 0 / 0
FormShow задержка
    #40108735
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня никакого моргания нет. Ни так, как написал автор, ни в случае, если меняю на

Код: pascal
1.
Param1 := IniFile.ReadInteger('Razdel1', 'Param1', 1);


На всякий случай записал видео и проверил на покадровой промотке - не моргает. Возможно, дело в темах, скинах и прочей хрени.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FormShow задержка
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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