LINUX.ORG.RU

tcl/tk - ассоциировать данные с виджетом

 , ,


1

2

Доброго! У меня есть виджет и я хочу навесить на него дополнительные данные. Скажем, виджет .text1 (имя генерируется) и я хочу хранить какую-то переменную, скажем, SendToLisp . Я сделал

set name .text1
text $name
global $name.SendToLisp
set $name.SendToLisp 1

Можно ли сделать, чтобы при закрытии окна переменная уничтожалась? destroy её не уничтожает. Или вообще как-то иным способом ассоциировать данные с виджетом, чтобы они исчезали при destroy?

★★★★★

В принципе вот так сработает:

proc DestroyTextReadonlyInfrastructure { pathName } {
    global $pathName.SendToLisp
    unset $pathName.SendToLisp
}

proc InitTextReadonly { pathName } {
    global $pathName.SendToLisp
    set $pathName.SendToLisp 0
    ...
    bind $pathName <Destroy> "+DestroyTextReadonlyInfrastructure $pathName"
    ...
}

Сломается только в том случае, если кто-нибудь мудрый перешибёт Destroy без плюсика. И ещё недостаток в том, что на других обработчиках Destroy эта информация может быть недоступна. Хотелось бы знать, есть ли канонический способ.

den73 ★★★★★
() автор топика
Последнее исправление: den73 (всего исправлений: 3)
Ответ на: комментарий от MKuznetsov

Плюсую. Если хочется чего-то странного с виджетами - бери Snit и оно перестаёт быть странным.

В данном случае можно сделать Widget Adaptor для text и положить в него все нужные данные.

Gentooshnik ★★★★★
()
Ответ на: комментарий от Gentooshnik

У меня давно начало складываться мнение насчёт вас, что с меня шашлык.А tclOO не подойдёт? В 8.6 это рекламируемая фича номер 1. А snit, хотя и присутствует, но не объявлен мейнстримом.

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Жабство какое-то, зачем отдельная DestroyTextReadonlyInfrastructure? Ниже вешаем обработчик сразу на все виджеты в root-окне, обработчик выполняется в глобальной namespace:

bind . <Destroy> "+catch {unset %W.SendToLisp}"
anonymous
()
Ответ на: комментарий от anonymous

В реальной жизни там не одна команда. А не unset -nocomplain?

den73 ★★★★★
() автор топика
Ответ на: комментарий от den73

Может я его не осилил, но ИМХО TclOO больше для ОО логики. А для околовиджетного ОО Snit более специализирован.

Повторюсь, лучше тогда спросить у кого-то, кто осилил TclOO.

P.S. Не знаю что там самое рекламируемое, но пользы от apply и coroutine/yield больше, чем от стандартизации одной из существующих ОО-систем.

Gentooshnik ★★★★★
()
Ответ на: комментарий от Gentooshnik

Ну что, snit пока показал себя годным, удалось даже улучшить старый текст. Вот это я понимаю, ООП. А не то *****, которое в С++.

method insert ... 
delegate method * to hull

Единственное, конечно, как и в любом ООП, увеличивается степень неявности кода.

den73 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.