itclwidget
-
НАЗВАНИЕ
- itcl::widget — создание класса виджетов объектов
- ПРЕДУПРЕЖДЕНИЕ!
- СИНТАКСИС
- ОПИСАНИЕ
- ОПРЕДЕЛЕНИЯ ВИДЖЕТОВ
- ИСПОЛЬЗОВАНИЕ ВИДЖЕТОВ
- ИСПОЛЬЗОВАНИЕ ОБЪЕКТОВ
- имя_объекта метод ?аргументы...?
- ВСТРОЕННЫЕ МЕТОДЫ
-
имя_объекта cget параметр
- имя_объекта configure ?параметр? ?значение параметр значение ...?
- имя_объекта isa имя_виджета
- имя_объекта info параметр ?аргументы...?
-
имя_объекта info виджет
- имя_объекта info inherit
- имя_объекта info наследование
- имя_объекта info функция ?имя_команды? ?-защита? ?-тип? ?-имя? ?-аргументы? ?-тело?
- имя_объекта info переменная ?имя_переменной? ?-защита? ?-тип? ?-имя? ?-инициализация? ?-значение? ?-настройка?
- имя_объекта info inherit
- имя_объекта configure ?параметр? ?значение параметр значение ...?
- ЦЕПОВЫЕ МЕТОДЫ/ПРОЦДУРЫ
- АВТОЗАГРУЗКА
- C ПРОЦЕДУРЫ
- КЛЮЧЕВЫЕ СЛОВА
Имя
itcl::widget — создание класса виджетов объектовПредупреждение!
Эта новая функция в [incr Tcl], где API может ещё изменяться!!Синтаксис
itcl::widget имя_виджета{inherit базовый_виджет ?базовый_виджет...?
конструктор аргументы ?инициализация? тело
деструктор тело
public метод имя ?аргументы? ?тело?
protected метод имя ?аргументы? ?тело?
private метод имя ?аргументы? ?тело?
public proc имя ?аргументы? ?тело?
protected proc имя ?аргументы? ?тело?
private proc имя ?аргументы? ?тело?
public переменная имя_переменной ?инициализация? ?настройка?
protected переменная имя_переменной ?инициализация? ?настройка?
private переменная имя_переменной ?инициализация? ?настройка?
public общая имя_переменной ?инициализация?
protected общая имя_переменной ?инициализация?
private общая имя_переменной ?инициализация?
public команда ?арг арг ...?
protected команда ?арг арг ...?
private команда ?арг арг ...?
<информация о делегировании> см. страницу делегирования
<информация об опциях> см. страницу опций
set имя_переменной ?значение?
array параметр ?арг арг ...?
}
имя_виджета имя_объекта ?арг арг ...?
имя_объекта метод ?арг арг ...?
имя_виджета::proc ?арг арг ...?
Описание
Одним из основных конструкций в [incr Tcl] является определение виджета. Виджет похож на класс с дополнительными функциями. Каждый виджет служит шаблоном для создания фактических объектов. Сам виджет представляет собой пространство имён, содержащее общие элементы для всех объектов. Каждый объект имеет собственный набор данных, содержащий экземпляры «переменных», определённых в определении виджета. Каждый объект также имеет встроенную переменную с именем «this», которая содержит имя объекта. Виджеты также могут иметь «общие» члены данных, которые разделяются всеми объектами в виджете.В определении виджета могут быть включены два типа функций. «Методы» — это функции, которые работают с конкретным объектом и поэтому имеют доступ к «переменным» и «общим» членам данных. «Процедуры» — это обычные процедуры в пространстве имён виджета и имеют доступ только к «общим» членам данных.
Если тело любого метода или процедуры начинается с «@», оно обрабатывается как символическое имя для C-процедуры. В противном случае оно обрабатывается как сценарий кода Tcl. Подробнее о регистрации и использовании C-процедур см. ниже.
Виджет может быть определён только один раз, хотя тела методов и процедур виджета могут быть определены снова и снова для интерактивной отладки. Подробности см. в командах body и configbody.
Каждое пространство имён может иметь свою коллекцию объектов и виджетов. Список доступных виджетов в текущем контексте можно запросить с помощью команды «itcl::find виджеты», а список объектов — с помощью команды «itcl::find объекты».
Виджет можно удалить с помощью команды «удалить виджет». Отдельные объекты можно удалить с помощью команды «удалить объект».
Определения виджетов
Определение виджета определение обрабатывается как серия команд Tcl, определяющих элементы в рамках виджета. Признаются следующие команды определения виджетов:
Использование виджетов
После определения виджета имя виджета может использоваться как команда для создания новых объектов, принадлежащих этому виджету.Использование объектов
После создания объекта имя объекта может использоваться как команда для вызова методов, которые работают с объектом.- objName method ?args...?
- Вызывает метод с именем method на объекте с именем objName. Остальные аргументы передаются в список аргументов для метода. Имя метода может быть "constructor", "destructor", любое имя метода, появляющееся в определении виджета, или любой из следующих встроенных методов.
Встроенные методы
- objName cget option
- Предоставляет доступ к общедоступным переменным в качестве параметров конфигурации. Это имитирует поведение обычной операции "cget" для виджетов Tk. Аргумент option представляет собой строку вида "-varName", и этот метод возвращает текущее значение общедоступной переменной varName.
- objName configure ?option? ?value option value ...?
- Предоставляет доступ к общедоступным переменным в качестве параметров конфигурации. Это имитирует поведение обычной операции "configure" для виджетов Tk. Без аргументов этот метод возвращает список списков, описывающих все общедоступные переменные. Каждый список содержит три элемента: имя переменной, её начальное значение и текущее значение.
Если указан единственный параметр option вида "-varName", метод возвращает информацию об этой переменной.
В противном случае аргументы интерпретируются как пары option/value, присваивающие новые значения общедоступным переменным. Каждой переменной присваивается новое значение, и если у неё есть связанный код "config", он выполняется в контексте виджета, где он был определён. Если код "config" генерирует ошибку, переменная устанавливается обратно в предыдущее значение, и метод configure возвращает ошибку.
- objName isa widgetName
- Возвращает ненулевое значение, если заданный widgetName найден в иерархии объекта, и нулевое значение в противном случае.
- objName info option ?args...?
- Возвращает информацию, связанную с определённым объектом с именем objName или его определением виджета. Параметр option включает в себя следующие элементы, а также опции, распознаваемые обычной командой Tcl "info":
- objName info widget
- Возвращает имя наиболее специфичного виджета для объекта objName.
- objName info inherit
- Возвращает список базовых виджетов, как они были определены в команде "inherit", или пустую строку, если у этого виджета нет базовых виджетов.
- objName info heritage
- Возвращает текущее имя виджета и весь список базовых виджетов в порядке их обхода для поиска членов и удаления объекта.
- objName info function ?cmdName? ?-protection? ?-type? ?-name? ?-args? ?-body?
- Без аргументов эта команда возвращает список всех методов и процедур виджетов. Если указан cmdName, она возвращает информацию для конкретного метода или процедуры. Если не заданы флаги, команда возвращает список со следующими элементами: уровень защиты, тип (метод/процедура), полное имя, список аргументов и тело. Флаги можно использовать для запроса конкретных элементов из этого списка.
- objName info variable ?varName? ?-protection? ?-type? ?-name? ?-init? ?-value? ?-config?
- Без аргументов эта команда возвращает список всех переменных, специфичных для объекта, и общих данных. Если указан varName, она возвращает информацию для конкретного элемента данных. Если не заданы флаги, команда возвращает список со следующими элементами: уровень защиты, тип (переменная/общая), полное имя, начальное значение и текущее значение. Если varName является общедоступной переменной, код "config" включается в этот список. Флаги можно использовать для запроса конкретных элементов из этого списка.
Цепочки методов/процедур
Иногда базовый виджет имеет метод или процедуру, которая переопределяется с тем же именем в производном виджете. Это способ заставить производный виджет обрабатывать те же операции, что и базовый виджет, но с собственным специализированным поведением. Например, предположим, что у нас есть виджет Toaster, который выглядит так:itcl::widget Toaster {
variable crumbs 0
method toast {nslices} {
if {$crumbs > 50} {
error "== FIRE! FIRE! =="
}
set crumbs [expr $crumbs+4*$nslices]
}
method clean {} {
set crumbs 0
}
} Мы можем создать другой виджет, например, SmartToaster, который переопределяет метод "toast". Если мы хотим обратиться к методу базового виджета, мы можем указать его имя, чтобы избежать неоднозначности:
itcl::widget SmartToaster {
inherit Toaster
method toast {nslices} {
if {$crumbs > 40} {
clean
}
return [Toaster::toast $nslices]
}
} Вместо жёсткого кодирования имени базового виджета мы можем использовать команду "chain" так:
itcl::widget SmartToaster {
inherit Toaster
method toast {nslices} {
if {$crumbs > 40} {
clean
}
return [chain $nslices]
}
} Команда chain ищет в иерархии виджетов немного более общее (базовое) реализацию метода или процедуры и вызывает её со специфицированными аргументами. Она начинается с текущего контекста виджета и перебирает базовые виджеты в порядке, указанном командой "info heritage". Если другая реализация не найдена, эта команда ничего не делает и возвращает пустую строку.
Автозагрузка
Определения виджетов не обязательно загружаются явно; они могут загружаться по мере необходимости стандартной системой автозагрузки Tcl. В каждой директории, содержащей файлы определений виджетов, должен быть файл "tclIndex". Каждая строка в этом файле идентифицирует Tcl процедуру или определение виджета [incr Tcl] и файл, где это определение можно найти.Например, предположим, что в каталоге находятся определения виджетов "Toaster" и "SmartToaster". Тогда файл "tclIndex" для этой директории будет выглядеть так:
# Tcl autoload index file, version 2.0 for [incr Tcl] # This file is generated by the "auto_mkindex" command # and sourced to set up indexing information for one or # more commands. Typically each line is a command that # sets an element in the auto_index array, where the # element name is the name of a command and the value is # a script that loads the command. set auto_index(::Toaster) "source $dir/Toaster.itcl" set auto_index(::SmartToaster) "source $dir/SmartToaster.itcl"
Команда auto_mkindex используется для автоматической генерации файлов "tclIndex".
Автозагрузчик должен знать об этой директории, добавив имя директории в переменную "auto_path". При этом виджеты будут автоматически загружаться по мере необходимости при использовании их в приложении.
C процедуры
C процедуры могут быть интегрированы в определение виджета [incr Tcl] для реализации методов, процедур и кода "config" для общедоступных переменных. Любое тело, начинающееся с "@", обрабатывается как символическое имя C процедуры.Символические имена устанавливаются путём регистрации процедур с помощью Itcl_RegisterC(). Это обычно делается в процедуре Tcl_AppInit(), которая автоматически вызывается при запуске интерпретатора. В следующем примере процедура My_FooCmd() регистрируется с символическим именем "foo". Эта процедура может быть упомянута в команде body как "@foo".
int
Tcl_AppInit(interp)
Tcl_Interp *interp; /* Interpreter for application. */
{
if (Itcl_Init(interp) == TCL_ERROR) {
return TCL_ERROR;
}
if (Itcl_RegisterC(interp, "foo", My_FooCmd) != TCL_OK) {
return TCL_ERROR;
}
} C процедуры реализуются как обычные Tcl команды. Подробности см. в справке по CrtCommand. Внутри процедуры члены данных виджета могут быть обработаны как обычные переменные, используя Tcl_SetVar(), Tcl_GetVar(), Tcl_TraceVar() и т. д. Методы и процедуры виджетов могут быть выполнены как обычные команды, используя Tcl_Eval(). [incr Tcl] делает это возможным, автоматически устанавливая контекст перед выполнением C процедуры.
Эта схема обеспечивает естественный путь миграции для разработки кода. Виджеты могут быть быстро разработаны с использованием Tcl кода для реализации тел. Весь проект может быть собран и протестирован. При необходимости отдельные тела могут быть реализованы с помощью C кода для повышения производительности.
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/ItclCmd/itclwidget.htm
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/ItclCmd/itclwidget.htm