Многострочное текстовое поле в диалоге
Как я могу создать текстовое поле, которое позволяет разрывать строки (нажав Enter) и копирует это в строку?
Я пытаюсь создать диалоговое окно, похожее на текстовое поле "Информация об изображении" в "Цифровой микрофотографии". Это текстовое поле будет использоваться для создания текстовой аннотации, которая создается на самом переднем изображении.
DLGCreateTextBox может создать многострочное текстовое поле, но оно не допускает разрывов строк.
Я искал страницу DM Scripting и страницу базы данных сценариев TU Graz, но не увидел ничего, что использовало бы такое текстовое поле.
1 ответ
К сожалению, диалоговые TextBoxes - не самые удобные диалоговые элементы в диалоговых окнах DigitalMicrograph. Есть несколько моментов, которые нужно знать:
- Текст может быть установлен только (или считан из) элемента, пока отображается диалоговое окно.
- Текстовое поле указывается шириной и высотой, а также параметром длины.
- Пока текст в текстовом поле короче длины, любое нажатие клавиши возврата будет сохраняться как символ.
- Однако, если предел достигнут, нажатие клавиши возврата передается в диалоговое окно. В случае, если это модальный диалог (т.е. отображается
pose()
), нажатие клавиши return будет немедленно действовать как "хорошо" и закроет диалог!
Имея это в виду, следующий пример сценария создает текстовое поле-поле, в котором могут быть разрывы (возвраты) строк. Однако только с помощью действия "копировать", прикрепленного к кнопке, текст "сохраняется" в переменной, доступ к которой можно получить после закрытия диалога.
class myDLG : UIFrame
{
string textBuffer
tagGroup CreateDLGSelf( object self )
{
number width = 20 // line width of box
number height = 10 // number of lines
number length = 500 // maximum length (characters) of content
TagGroup textBox = DLGCreateTextBox( width, height, length )
textBox.DLGIdentifier( "textBox" )
TagGroup StoreButton = DLGCreatePushButton( "Store" , "StoreText" )
TagGroup DLG, DLGitems
DLG = DLGCreateDialog( "TestBox", DLGitems )
DLGitems.DLGAddElement( textBox )
DLGitems.DLGAddElement( StoreButton )
return DLG
}
void StoreText( object self )
{
textBuffer = self.GetTextElementData( "textBox" )
}
string GetBufferedText( object self )
{
return textBuffer
}
object Init( object self )
{
return self.Super.Init( self.CreateDLGSelf() )
}
}
// Main script
{
object testDLG = Alloc(myDLG).Init()
if ( testDLG.pose() )
OKDialog( "Text:" + testDLG.GetBufferedText() )
}
Если диалог немодальный (т.е. отображается через display()
) поля могут быть доступны напрямую. Следующий скрипт демонстрирует это, а также то, как такой диалог может создать аннотацию на изображении.
class annoTool : UIFrame
{
tagGroup CreateToolDlg( object self )
{
number width = 50 // line width of box
number height = 5 // number of lines
number length = 300 // maximum length (characters) of content.
TagGroup textBox = DLGCreateTextBox( width, height, length )
textBox.DLGIdentifier("textBox")
TagGroup CreatAnnoButton = DLGCreatePushButton( "Copy to Image" , "CreateAnno" )
TagGroup InitTextButton = DLGCreatePushButton( "Intitialze" , "InitTextField" )
TagGroup DLG, DLGitems
DLG = DLGCreateDialog( "TestBox", DLGitems )
DLGitems.DLGAddElement( textBox )
DLGitems.DLGAddElement( DLGGroupItems( InitTextButton, CreatAnnoButton ).DLGTableLayout(2,1,0) )
return DLG
}
void InitTextField( object self )
{
string init = ""
init += "Date:" + GetDate(1) + "\n"
init += "Time:" + GetTime(0) + "\n"
init += "(c) My TEM Institute"
self.SetTextElementData( "textBox", init )
}
void CreateAnno( object self )
{
image front
string textBuffer = self.GetTextElementData("textBox")
if ( GetFrontImage(front) )
{
CreateTextAnnotation( front, 0, 0, textBuffer)
}
}
object Init( object self )
{
return self.Super.Init( self.CreateToolDlg() )
}
}
// Main script
{
Alloc(annoTool).Init().display( "Annotation Creater" )
}