Я постараюсь ответить во второй раз. Не обвиняйте меня, пожалуйста.Как правильно ввести свойство в форму?
Ситуация:
У меня есть форма
TfrmMain = class(TForm)
private
[Inject('IniFileSettings')]
FSettings: ISettings;
public
end;
У меня есть процедура инициализации контейнера:
procedure BuildContainer(const container: TContainer);
begin
container.RegisterType<TIniSettings>.Implements<ISettings>('IniFileSettings');
container.RegisterType<TfrmMain, TfrmMain>.DelegateTo(
function: TfrmMain
begin
Application.CreateForm(TfrmMain, Result);
end);
container.Build;
end;
Так что я инициализирует как TfrmMain, а также TIniSettings через контейнер.
в .dpr у меня есть:
begin
BuildContainer(GlobalContainer);
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TfrmMain, frmMain);
Application.Run;
end.
Также у меня есть помощник для TApplication:
procedure TApplicationHelper.CreateForm(InstanceClass: TComponentClass; var Reference);
var
locator: IServiceLocator;
begin
locator := TServiceLocatorAdapter.Create(GlobalContainer);
if locator.HasService(InstanceClass.ClassInfo) then
TObject(Reference) := GlobalContainer.Resolve(InstanceClass.ClassInfo).AsObject
else
inherited CreateForm(InstanceClass, Reference);
end;
Проблема: когда я пытаюсь
procedure TfrmMain.FormCreate(Sender: TObject);
begin
s := FSettings.ReadString('Connection', 'Server', 'localhost');
end;
я получаю исключение AV потому что FSettings в настоящее время NIL.
Что такое правильный способ получить объект FSettings из контейнера?
UPDATE:
FSettings := GlobalContainer.Resolve<ISettings>;
Эта строка работает отлично ... Как и в прошлый раз у меня есть проблемы в использовании [Inject] атрибут. Даже с решением от Стефана я могу сделать метод работы:
How to initialize main application form in Spring4D GlobalContainer?
Почему вы чувствуете, что 'FSettings' должен быть отличным от' nil'? –
@David выглядит так, как будто я применяю атрибут [Inject] для него ... Пожалуйста, посмотрите первый фрагмент кода в сообщении. Я делаю это неправильно? – mad
Почему вы регистрируете свою основную форму в контейнере? Попытайтесь сделать одно за раз. Забудьте о своей форме и сосредоточьтесь на FSettings. Переместить вызов buildcontainer в событие FormCreate, тогда он работает? – whosrdaddy