Как вызвать процедуру, созданную внутри нового компонента во время реализации
Я создал и реализовал новый компонент, и внутри этого созданного компонента есть процедура, которую нужно вызвать в реализации.
Как мне это сделать?
Вот процедура
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
.