2016-05-26 11 views
1

Я увидел введение TActivityIndicator в Delphi 10 Seattle и подумал, что я могу использовать это где-то. Я хотел использовать это, чтобы показать, что некоторые динамически созданные разделы моей формы все еще загружали данные перед заполнением формы. Поэтому я думал, что сделаю это, прежде чем загружать свои данные в FormShow, где self - это форма.Ошибка создания TActivityIndicator в Runtime

indicator := TActivityIndicator.Create(self); 
indicator.IndicatorSize := TActivityIndicatorSize.aisLarge; 

К сожалению, когда я пытаюсь создать их динамически и установить затем TActivityIndicator.IndicatorSize я получаю исключение ... EInvalidOperation with message 'Control '<name>' has no parent window' Какие пошагового VCL берет меня Vcl.Controls TWinControl.CreateWnd специально

if (WndParent = 0) and (Style and WS_CHILD <> 0) then 
    if (Owner <> nil) and (csReading in Owner.ComponentState) and 
    (Owner is TWinControl) then 
    WndParent := TWinControl(Owner).Handle 
    else 
    raise EInvalidOperation.CreateFmt(SParentRequired, [Name]); 

Я проверил Owner это форма, конечно, TWinControl, но (csReading in Owner.ComponentState) возвращает false. Переход через Owner.ComponentState = [] в FormCreate и [csFreeNotification] в FormShow.

Я обнаружил, что если вы попытаетесь изменить IndicatorSize TActivityIndicator, который был создан во время разработки, он отлично работает. Итак, что мне здесь не хватает или невозможно создать TActivityIndicators во время выполнения?

ответ

4

Сообщение об ошибке довольно ясно. Вам необходимо назначить Parent, на котором будет отображаться индикатор активности. Owner - это компонент, ответственный за освобождение контроля при уничтожении Владельца; Parent - это элемент управления, на котором будет отображаться элемент управления (для воспроизведения).

Решение состоит в том, чтобы назначить этот родитель в коде:

Indicator := TActivityIndicator.Create(Self); 
Indicator.Parent := Self; // <-- here 
// Set any other properties here 

Та же проблема является общим для всех визуальных элементов управления (например, TEdit, TLabel, TMemo, и так далее), которые все должны иметь Parent назначены для того, чтобы иметь место для рисования. И в некоторых случаях для правильного функционирования различных свойств дочернего элемента управления требуется Parent, когда они зависят от ребенка, имеющего окно HWND, для которого требуется окно Parent и т. Д.

Если я понимаю ваши намерения, я думаю, вы будете разочарованы. TActivityIndicator довольно статичен; он не является потоковым, что означает, что он перестанет обновляться, если ваша форма занята и не обрабатывает сообщения таймера (которые он использует внутри).

+0

Да, я знаю, что данные загружаются в другой поток, а затем, когда они закончены, загружаются. Я прошу поток пользовательского интерфейса заполнить поля. Также вы легенда :), которая решила проблему –