Как вызвать процедуру, созданную внутри нового компонента во время реализации

Я создал и реализовал новый компонент, и внутри этого созданного компонента есть процедура, которую нужно вызвать в реализации.

Как мне это сделать?

Вот процедура InitCombo внутри нового компонента:

      procedure TNewComponent.InitCombo;       //TComboBox ancestor
begin
  FStoredItems.OnChange := nil;
  StoredItems.Assign(Items);
  AutoComplete := False;
  FStoredItems.OnChange := StoredItemsChange;
  doFilter := True;
  StoredItemIndex := -1;
end;

Вот моя попытка вызвать, но возвращает сообщение об ошибке:

      procedure TfrmMain.FormActivate(Sender: TObject);
begin
  TNewComponent.InitCombo;
end;

Error Messages
[dcc32 Error] makeasale_u_v1.pas(84): E2076 This form of method call only allowed for class methods or constructor

Обратите внимание, что компиляция, сборка и установка прошли успешно и все работает. За исключением того, как вызвать процедуру внутри компонента?

1 ответ

Решение

Основываясь только на следующей части первого абзаца вашего вопроса

есть процедура InitCombo, которую нужно вызвать в реализации.

Похоже, вы запутались, по крайней мере, в нескольких вещах о написании компонентов.

Сначала вы инициализируете свойства компонента либо в его конструкторе для инициализации, либо в переопределенном методе, который вызывается после потоковой передачи компонента из файла .dfm, в котором компонент был использован. Обратите внимание, что Loaded изменения не должны касаться свойств или событий, которые пользователь может установить в инспекторе объектов, поскольку это предотвратит использование пользовательских настроек.

      constructor TNewComponent.Create(AOwner: TComponent);
begin
  inherited;
  // Do your stuff here
end;

procedure TNewComponent.Loaded;
begin
  // Do your stuff here
end;

Во-вторых, публикуемые события (которые можно увидеть на вкладке «События» инспектора объектов) принадлежат программисту, который использует компонент, а не автору компонента. Никогда ничего не делайте с этими обработчиками событий. Ваш компонент никогда не должен касаться этих событий, кроме как вызывать их, если конечный пользователь назначил обработчик. Таким образом, приведенный ниже код абсолютно неверен, потому что OnChange событие принадлежит пользователю вашего компонента, а не вашему коду компонента:

      procedure TNewComponent.InitCombo;       //TComboBox ancestor
begin
  FStoredItems.OnChange := nil;
  ...
  FStoredItems.OnChange := StoredItemsChange;
end;

Если это абсолютно необходимо, вам нужно сделать это правильно, сохранив любой обработчик событий, назначенный конечным пользователем, и затем восстановить его:

      procedure TNewComponent.InitCombo;
var
  OldOnChange: TNotifyEvent;
begin
  OldOnChange := Self.OnChange;
  // Do your stuff here
  Self.OnChange := OldOnChange;
end;

В-третьих, если вы не используете class procedure или же class function, вы не можете вызвать метод самого класса (другими словами, вы не можете использовать TNewComponent.DoSomething). Вы вызываете методы или получаете доступ к свойствам экземпляра самого компонента. В коде вашего компонента это можно сделать с помощью Self, который относится к текущему реализованному компоненту, как в Self.DoSomething.

Другие вопросы по тегам