Вопрос пользователя заключается в том, что при работе с формой в Delphi 10.2 Tokyo, которая содержит TreeView, непрерывное скроллинг вверх и вниз приводит к замораживанию формы в операционной системе Windows 10. При этом, несмотря на неработоспособность элементов управления, события таймера продолжают обрабатываться, а клики по TreeView выполняются корректно. Отмечается, что проблема не наблюдается в Windows 7. Переключение фокуса на приложение путем Alt-Tab или возвращение к нему позволяет восстановить работоспособность формы.
Подтвержденный ответ:
Как указано в обновлении, отключение поддержки runtime-тем в настройках компиляции (Enable Runtime Themes) позволяет решить проблему. Это подтверждается сообщениями пользователей, которые сообщили о успешном устранении проблемы после внесения данной настройки в проект.
Альтернативный ответ:
Также было предложено использовать функцию DisableThemesApp, ссылка на которую приведена в контексте вопроса. Этот метод предполагает отключение тем в приложении во время выполнения, что также может помочь в решении проблемы.
Пример кода:
В коде, предоставленном пользователем, можно увидеть, как создается форма с TreeView и таймером, который обновляет содержимое TreeView каждые 2 секунды. Приведенный код можно использовать для воспроизведения проблемы.
unit Win10Freezing;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.ComCtrls;
type
TWin10FreezingForm = class(TForm)
private
FTreeView: TTreeView;
procedure TimerTimer(Sender: TObject);
function HasASecondPassedSinceLastInput: Boolean;
public
constructor Create(AOwner: TComponent); override;
end;
var
Win10FreezingForm: TWin10FreezingForm;
implementation
{$R *.dfm}
constructor TWin10FreezingForm.Create(AOwner: TComponent);
begin
inherited;
Width := 355;
Height := 355;
FTreeView := TTreeView.Create(self);
with FTreeView do
begin
Parent := self;
Align := alClient;
end;
with TTimer.Create(self) do
begin
OnTimer := TimerTimer;
Interval := 2000;
Enabled := True;
end;
TimerTimer(self);
end;
procedure TWin10FreezingForm.TimerTimer(Sender: TObject);
var
i: Integer;
begin
// ...
with FTreeView.Items do
begin
BeginUpdate;
try
Clear;
for i := 0 to 30 + Random(10) do
AddChild(nil, IntToStr(Random(100)));
finally
EndUpdate;
end;
end;
// ...
end;
function TWin10FreezingForm.HasASecondPassedSinceLastInput: Boolean;
var
lii: TLastInputInfo;
begin
lii.cbSize := SizeOf(TLastInputInfo);
Result := GetLastInputInfo(lii) and (GetTickCount - lii.dwTime > 1000);
end;
end.
Рекомендации по решению проблемы:
Отключить поддержку runtime-тем в настройках компиляции.
Использовать функцию DisableThemesApp для отключения тем во время выполнения приложения.
При необходимости, рассмотреть возможность оптимизации обновления данных в TreeView, чтобы избежать конфликтов с другими операциями пользователя.
Заключение:
Проблема заморозки формы в Windows 10 при использовании Delphi 10.2 Tokyo может быть решена путем отключения runtime-тем. Это изменение в настройках компиляции приводит к устранению конфликтов, связанных с обновлением интерфейса пользователя в фоновом режиме. Пользователям, столкнувшимся с подобной проблемой, рекомендуется обратить внимание на эти рекомендации.
Пользователь столкнулся с проблемой заморозки формы в Windows 10 при разработке на Delphi 10.2 Tokyo, которая решается отключением поддержки runtime-тем.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS