Читает М.Русов. Б.Н.Бабань записывает. Основное - 1) компонент - это наследник iConpanent 2) имя компонента CompId - внешнее FId - внутренее 3) компоненты могут быть вложены друг в друга компонент, в который вложены другие компоненты, называется контейнер. 4) owner - компонент - контейнер, содержащий данный компонент 5) основной способ создания нового компонента - это создание класса и перекрытие у него метода init 6) В проектк DEMO есть примеры создания компонентов Frm.FrmTest.TestForm1 7) В методе init по очереди создаются компоненты и задаются их свойства с помощьюконструктора или специального метода с некоторыми параметрами: имя, описание, размер. В конечном итоге получаем визуальную форму. Можно посмотреть форму Frm.FrmTest.TestForm1 8) Минус такого подхода в неочевидности связи между текстом и тем, что получается на экране 9) Визуальный редактор упрощает создание визуальных форм 10) Минус визуального редактора - невозможность использовать алгоритмические операторы языка 11) Можно совмещать визуальную настройку и использование метода init 12) Визуальный редактор позволяет представлять тескт на xml, содержащий описание метода init. XML иерархичен, представляет собой дерево вложенных тэгов, так же как и компонент, представляющий собой иерархическую структуру вложенных компонентов. Свойства компонентов задаются в виде аттрибутов. 13) Рассмотрен компонент Frm.FrmTest.TestForm3, использующий файл ресурса crf 14) При компиляции файла ресурсов в ошибочном компоненте выдается предупреждение, но копиляция проходит 15) Свойство FormIcon задает иконку формы из ограниченного списка 16) HelpContext - можно указать тему помощи, ее можно выбрать из списка имеющихся тем 17) iEdEx - поле компонента iRecord - в котором можно редактировать поле наследника iRecord. В свойстве Field можно выбрать из списка имя поля, имеющегося в наследника iRecord, заданном в свойстве EdtRec. Это пример ссылочного значения. 18) Визуальный редактор работает на основе компонент, описанных в проекте Турбоо. Это не зашито в ядро. Это описано на прикладном уровне. 19) Компонент, поддерживаемый визуальным редактором может написать пользователь. 20) HeaderFrame - верхняя панель кнопочек 21) Для изменения поведения кнопки описываем в визуальном резакторе обработчик OnClick и пишем в коде формы текст обработчика 22) Как выглядит форма можно только в режиме исполнения 23) CRF можно редактировать во время сессии. Перекомпиляция не требуется. Во время исполнения формы надо нажать Ctrl+D и тогда окно формы делится на две половины и во второй половине откроется окно визуального редактора. В нем можно изменить форму. Изменения отобразятся на самой форме при нажатии на shift+F5. Это возможно только в отладочной сессии. 24) InvoiceRes.crf - пример накладной на визуальном редакторе 25) Com.Frm.Dlg.Message - сообщения на компонентах. Там же другие диалоговые окна. 26) Способы расположения компонентов в одну строку. Их много, говорит Руссов. Com.Ctrl.iGroup - контейнер, позволяющий задавать расположение компонентов. Свойство ByColumn - задает в строку или в колонку располагаются компоненты. iGroup могут быть вложенными. За счет этого можно добиваться разнообразного расположения компонентов на форме. У группы есть свойство Adaptive. Если включить Adaptive=true, размер группы изменяется вместе с размером окна. Кроме того можно задавать минимальную и максимальную ширину minWidth и maWidth. Тогда адаптивность ограничивается диапазоном значений. Сместить компоненты вправо можно добавив перед ними компонент Com.Ctrl.iStatic. Он выполняет роль заполнителя. Для фиксации отступа надо задать его размер Width. Глубина волженности ограничена. 27) EditEx - расширенный редактор поля - рекомендуется. У него есть Caption. По умолчанию HasCaption=True. Если EditEx связан с полем записи, то caption берется из записи. EditEx является контейнером. В него можно добавлять кнопочки. Например, JumpButton. По JumpButton мы переходим на запись, на которую ссылается поле, указанное в EditEx. Можно добамить ListButton для открытия меню. ListButton должен быть круглым, поэтому для него выбираем иконку "крышчка вниз". В ListButton можно вставить кнопки MenuButton. Они откроются в виде списка при нажатии на ListButton. Если EditEx сделать невидимым, то он спрячется со всеми своими кнопками. EditEx объединяет Label слева, сам редактор и дополнительные кнопочки справа, которые можно вложить в EditEx Ширина Caption для EditEx по умолчанию общая для группы. Задается в CaptionWidth группы. Если изменить, меняется ширина всех labels. Есть CaptionAlign - выравнивание может задаваться для надписей всей группы. Примеры в Demo.Forms.Накладная. В EditEx Можно первым добавить Static. Тогда его свойства будут задавать свойства надписи для этого редактора. В Static.Width ширину надо задать явно. Из группы она не берется. В static можно задавать все свойства надписи. При этом не нужно задавать эти свойства в самом EditEx. В static можно задать OnClick, для обработки нажатия на надпись. Также статик нужен, чтобы надпись редактора отличалась от остальных надписей группы. 28) Рассматривается пример работы формы Demo.FrmTest.TestForm1 или Demo.FrmTest.TestForm3 BoxFrame - фрейм, который может скрываться/появляться по нажатию кнопки. Можно создать TableGroup, у которой ByColumns=False, и, потом, в ней уже расположить группы - колонки.Для отступов слева добавляются stitic-и. 29) Взаимодействие визуальной и программной настройки формы. Программная настройка может дополнять визуальную настройку. На примере Demo.Frm.InvoiceRes. Crf загружается внутри самого базового init цепочки наследования. В Com.IComponent.Init if UseResource: LoadResource; fi; По умолчанию UseResource=false В LoadResource вызывается LoadObject. LoadObject - метод UserObject - был давно. Раньше был только формат файла - dbt. Теперь добавили xml. Если файл-параметр имеет расширение crf, то используется формат xml. В файл записываются поля, помеченные модификатором stored. В других языках для полей, которые радактируются визуп=альным редактором применяется модиикатор published. Но в Турбо используется старый модификатор stored. В визуальном редакторе появляются только поля, объявленные как stored. LoadObjec вызывает конструкторы всех компонентов и их setter-ы Причем, реализована возможность как и для TPL. Если в Форме-компоненте объявнено свойство, имя которого совпадает с именем компонента из файла ресурсов CRF, то этому свойству присваивается ссылка на этот одноименный инииализированный компонент. Таким образом, после загрузки файла crf инициализируются компоненты, описанные в ресурсном файле. После LoadObject вызывается AfterLoad. 050:00 Ресурсы поддерживают наследование. В ресурсе можно переопределить свойства базового класса. В файле ресурса сохраняются только измененные свойства. Это визуальное наследование. Наследование на примере базового класса Demo.Frm.InvoiceRes Demo.Frm.InvoiceEx - наследник Demo.Frm.InvoiceRes Если открыть его визуальным редактором, то там присутствуют все компоненты базового класса. В свойстве Inherited задается имя класса предка. Унаследованные свойства имеют бледно-серый цвет. Унаследованный компонент удалить нельзя, но можно поменять его свойства. Измененные классы показываются другим цветом, сами измененные или добавленные свойства показываются уже не бледным, а обычным цветом. При этом в crf файле описываются только измненные или добавленные свойства. Унаследованный компонент описывается не в тэге Component, а в тэге Inherited. Если что-то изменить в базовом классе, то эти изменения автоматически появятся и в наследованном классе. В визуальном наследовании есть тонкости, которые надо учитывать: - в базовом классе может быть изменен или удален компонент,использованный в наследнике. Это делает файл crf не валидным. Он в сессии не загрузится. Эти ошибки диагностируются на этапе компиляции. Будет предупреждение о недопустмом классе компонента. В визуальном редакторе они будут помечены красным значком. Предупреждения компиляции можно объявить как ошибки, чтобы прерывать компиляцию. Расширения и ресурсы. Расширения визуальный редактор не поддерживает. В расширениях нельзя использовать ресурсы. Планируется доделать, чтобы можно было использовать. При этом метод Init в расширениях работать будет. программно компоненты создаваться будут. Но визуально их увидеть не получится. Расширения пока только для программного создания форм. То есть сначала грузится ресурс, потом в Init он программно модифицируется. Можно комбинировать. Часть из ресурса, часть создать программно, используя языковые операторы. Тонкости наследования. Предполагается, что новые формы будут создаваться на основе готовых базовых форм. Тогда необходимо, чтобы базовые формы тоже были настроены с помощью визуального редактора. Иначе визуальное наследование не получится. Программно добавленные компоненты визуальные рдактор не видит и ничего о них не знает. Com.Frm.iEditorWithFrames имеет визуальнную настройку. Только поэтому его наследники видят эти визуальные настройки. Чтобы можно было использовать базовй класс без поддержки визуальной настройки, в методе Init все компоненты, описанные визуально, должны, также, быть созданы программно. То есть, волденные компоненты описываются дважды. На примере com.Frm.iCardForm показано, что компоненты описаны дважды - в файле ресурсов и в методе init, чтобы этот базовй компонент можно было использовать как с визуальной настройкой, так и с программной на стройкой. Следует учесть это при создании своих базовых форм и компонентов. Иллюстрация, как программно настроенную форму переводить на использование визуальной настройки на примере Biz.Frm.Ref.Size на основе Bas.Frm.CodeName. 1) Убедится, что базовый класс переведен на визуальную настройку. 2) Bas.Frm.CodeName не переведен, но переведен com.Frm.iCodeName. В цепочке наследования есть компонент на ресурсе, использовать ресурс можем. 3) создаем Crf, нажав f4. В окне создания указывается базовый класс com.frm.iEditor - указывает на вид формы и базовый ресурс - ближайший предок, у которого есть crf файл. 4) Описываем inclass public var useResourse:logical = true 5) Изменяем Init. Все, что там есть переносим в блок proc init; inherited Init; if not useresouce: тут поместить все, что было раньше в init fi; end; 6) Посматривая на код в init, делаем аналогичные настройки в визуальном редакторе: Name.visible = true Добавляем поля Code value и Brand. Для этого в FieldsFrame вставляем 3 компоненты Com.Ctrl.EditEx В поле field этих компонентов задаем поле. Code выбрать можем. value - не можем. Потому, что список полей задается в так называемом ресурсе библиотеки EdtRec, в котором указан class Com.Rec.iCodeName - наследник Com.Ctrl.iRecord. В наследнике Com.Rec.iCodeName - Biz.Rec.Ref.Size Value должно быть. Меняем на него значкние свойства class ресурса библиотеки EdtRec. После этого, список полей расширяется и в нем уже имеются поля value, brand и basic. Затем, есть смысл переименовать компоненты EditEx[n] на имена полей. Добавляем jumpbutton в basic. Для того, чтобы добится одинакового представления, переключаем форму на использование программной настройки. Делаем скриншот. Возвращаем ресурсную настройку. Визуальным редактором добиваемся аналогичного вида формы. Чтобы код и значение появлялись в однгой строке добапвляем группу и помещаем эти поля в добавленную группу. И так далее.