Работя на HTTP сървър и използвам TIdHTTPWebBrokerBridge
на Indy с TWebModule
. Капсулирам цялата функционалност на сървъра в един единствен компонент и това включва компонента Indy Server и съответния му уеб модул. Въпреки това имам някои проблеми да разбера как да накарам уеб модула да знае компонента, от който е извикан.
Да предположим, че имам този компонент:
type
TMyComponent = class(TComponent)
private
FServer: TIdHTTPWebBrokerBridge;
end;
implementation
uses
MyWebModule;
Знам, че трябва да инициализирам това, като настроя манипулатора на заявки, и се погрижих за това, като добавих раздел initialization
към този модул:
initialization
if WebRequestHandler <> nil then
WebRequestHandler.WebModuleClass:= WebModuleClass;
След това имам класа на уеб модула в отделна единица:
uses
MyWebServer;
type
TMyWebModule = class(TWebModule)
private
FOwner: TMyComponent;
end;
Обърнете внимание на частното поле, което имам в този уеб модул FOwner: TMyComponent
. Това е мястото, където имам проблеми да разбера къде да отида. Как да присвоя това на подходящия собственик? Уеб модулът се създава и управлява автоматично от HTTP сървъра на Indy, така че, доколкото знам, нямам никакъв контрол, за да задам подобно нещо.
Причината, поради която трябва да имам достъп до неговия собственик, е, че там имам зададени свойства, които уеб модулът трябва да може да чете. Например, едно свойство, което имам на моя компонент, е RootDir
, което е главна директория, където да чета/записвам файлове. Трябва да мога да чета това свойство от уеб модула.
Как мога да накарам уеб модула да може да чете свойствата на своя компонент собственик? Или като цяло, как мога да присвоя това лично поле FOwner
на екземпляра на моя компонент, откъдето е инстанциран?
nil
като негов собственик и веднага след като мостът е създаден, ние регистрираме нашия наследник на уебмодула в него, като използваме методаRegisterWebModuleClass
на предшественика на мостаTIdHTTPWebBrokerBridge
. Работи като чар... :) - person Marjan Venema   schedule 28.02.2013