Многострочное текстовое поле в диалоговом окне

Как я могу создать текстовое поле, которое позволяет разрывы строк (нажав Enter) и скопировать его в строку?

Я пытаюсь создать диалоговое окно, похожее на текстовое поле «Информация об изображении» в Digital Micrograph. Это текстовое поле будет использоваться для создания текстовой аннотации, которая создается на самом переднем изображении.

DLGCreateTextBox может создавать многострочное текстовое поле, но, похоже, не допускает разрывов строк.

Я искал DM Scripting и база данных скриптов TU Graz, но не видел ничего, что использовало бы такое текстовое поле.


person AWag    schedule 11.02.2015    source источник


Ответы (1)


К сожалению, диалоговые текстовые поля не являются наиболее удобными диалоговыми элементами в диалоговых окнах, написанных по сценарию DigitalMicrograph. Есть несколько моментов, которые нужно знать:

  • Текст может быть установлен (или прочитан) только для элемента, пока отображается диалоговое окно.
  • Текстовое поле определяется параметрами width и height, а также параметром length.
  • Пока текст в текстовом поле короче length, любое нажатие клавиши возврата будет сохранено как символ.
  • Однако, если предел достигнут, нажатие клавиши возврата передается в диалог. В случае, если это модальный диалог (т.е. отображается pose()), нажатие клавиши возврата немедленно сработает как «хорошо» и закроет диалог!

Имея это в виду, следующий пример сценария создает поле текстового поля, в котором могут быть разрывы строк (возвраты). Однако только с помощью действия «копировать», прикрепленного к кнопке, текст «сохраняется» в переменной, к которой можно получить доступ после закрытия диалогового окна.

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" )
}
person BmyGuest    schedule 12.02.2015