iarspider писал(а):
В пакете же Web компоненты являются продолжением кодогенератора: скриптами на внутреннем языкеЭто не совсем так... Каждый такой скрипт выполняется в контексте элемента среды и поэтому с точки зрения ООП в широков смысле слова представляет из себя не статический кусок, а полноценный экземпляр класса. У этого скрипта всегда есть свой уникальный ID(в некотором роде это self или this в языках высокого уровня), у него есть свой конструктор(метод Init).
iarspider писал(а):
При таком подходе мы получим по два файла кодов на каждый компонентПрощу прощения, а KOL аналог завернутый в обертку hiasm компонента стандартного пакета это не по два файла От реализации ядра компонента в отдельном модуле и его применения в виде интерфейса взаимодействия с другими элементами мы никуда не денемся.
Ну и наконец замена прямой вставки кода посредством перевязки событий и методов делается так. Во-первых, приложения построенные на основе обработки системных сообщений(событий) требуют от кодогенератора некоторого знания того, какие компоненты могут генерировать левые события сами по себе. Либо всегда для всех компонент вызывать некий метод, в котором такая проверка будет осуществляться самим компонентом. Имея такую возможность для схемы:
Add(MainForm,16083304,21,105)
{
Left=20
Top=105
Width=453
Height=293
Point(onMouseDown)
link(onMouseDown,5255915:doMessage,[(68,153)(68,97)])
}
Add(Message,5255915,84,91)
{
}
с условием, что оба элемента у нас классы, мы получит код вроде такого:
// mainform
func _GlobalInit_()
// ....
if(linked(onMouseDown))
event(onMouseDown)
end
if(linked(onMouseUp))
println('procedure onMouseUp', _id_, '(MouseX, MouseY);')
println('begin')
event(onMouseUp, 'MouseX' & 'MouseY')
println('end;')
end
if(linked(onMouseMove))
event(onMouseMove)
end
// ....
end
// message
func Init()
// тут объявляем и создаем переменную класса TMessage с именем mes + code(_id_)
end
func doMessage()
prrintln('mes', _id_, '.doMessage(', _data, ');')
event(onMessage)
end
вот вроде бы и вся кухня. Очевидно, что я убрал код по разбивке файла на блоки, создание общего глобального класса контейнера, создание мостов от событий внешних компонент к событиям hiasm и прочие мелочи.
Собственно это пример того, как:
Galkov писал(а):
Этим способом можно совершенно запросто воспроизвести сегодняшний пакет Дельфипросто ф-ции кодогенератора по линковке точек перенесены в сам компонент и все.