The class TextArea (gb. qt4) implements a multiline text field.
Figure 16.14.0.1: Value table in a TextArea
Selected properties of the TextArea class are described in the following table:
Property | Type | Description |
---|---|---|
Alignment | Integer | Returns or sets the text alignment. The following constants can be used: Align.Normal (0), Align.Left (1), Align.Right (2) or Align.Center (3). |
Background | Integer | Sets the background color or reads the color value. |
Foreground | Integer | Sets the text color or reads the current text color. |
Font | Font | Sets the text font or reads the current text font. |
Column | Integer | Returns the text column in the current text line or sets the defined text column. |
Line | Integer | Returns the current text line or sets the defined text line. |
Pos | Integer | Returns the current cursor position or sets the cursor to the defined position in the text. If the text was saved in UTF-8, you must use the string class to convert the position to the byte index in the string. |
Drop | Boolean | Determines or specifies whether the TextArea accepts the insertion of text by drag & drop. |
Length | Integer | Returns the length of the text as the number of characters in the text. |
ReadOnly | Boolean | Determines or determines whether the user can change the text. |
Selected | Boolean | Returns True if text is selected. |
Text | String | Returns or sets the text displayed in the TextArea. |
Wrap | Boolean | Determines or determines whether the text is wrapped depending on the width of the TextArea. There is no hyphenation! |
Table 16.14.0.1.1.1: Overview of selected properties of the TextArea class (gb. qt4)
Hints:
Only the two properties Foreground and Font are available for marking the text in a TextArea. They always apply globally for the entire TextArea!
txaArea.Foreground = Color.RGB(0, 0, 0) ' Font color black txaArea.Font = Font["Monospace, 10"] ' calligraphic font ' Zur Kontrolle: ' Print txaArea.Font.ToString()
The overview of the selected methods of the TextArea class contains three methods for reciprocal conversion of values of the properties Pos, Column and Line.
Print "Zeile = "; txaTest.ToLine(91) Print "Spalte = "; txaTest.ToColumn(91) Print "Cursor-Position = "; txaTest.ToPos(1, 30)
The property TextArea. ReadOnly = True is used if text is only to be displayed and manual text changes in the text field are not allowed. Examples: Help texts, display of measured values, console outputs or similar…
A description of selected methods of the class TextArea can be found here:
Method | Description |
---|---|
Clear | Deletes the entire text. |
Copy | The selected text is copied to the ClipBoard. |
Cut | The selected text is cut out and inserted into the ClipBoard. |
Paste | Inserts the (text) content of the ClipBoard at the cursor position. |
Insert (text As String) | Inserts the specified text from the current cursor position into the TextArea. |
Select ([ Start As Integer, Length As Integer]) | Marks text from cursor position Start in the length of Length.“ Start is the position of the first selected character in the text.” Length is the length of the text to be selected. If no argument is specified, the entire text is selected. |
SelectAll | Selects the entire text. |
Unselect | Resets the selection of the text. |
ToColumn (Pos As Integer) As Integer | Converts a cursor position to a column number in a text line? method ToLine (..). |
ToLine (Pos As Integer) As Integer | Converts a cursor position into a line number. |
ToPos (Line As Integer, Column As Integer) As Integer | Converts a combination of text line number and text column number (in this text line!) into a cursor position. |
Undo | Reverses the last action. |
Redo | Resets the last undone action. |
Table 16.14.0.2.1: Selected methods of the TextArea class (gb. qt4)
Hint:
These two events are particularly important for the practical work with a TextArea:
Event | Description |
---|---|
Change | Is triggered when the text has been changed. |
Cursor | The event is triggered when the cursor position has changed. |
Table 16.14.0.3.1: Overview of selected events of the TextArea class (gb. qt4)
Hints:
Note that changing the text does not necessarily change the cursor position, but the example Gambas program Notepad (text editor) implements the above mentioned properties, methods and events very well, so that it will be worthwhile for you to test this example intensively in any case.
The context menu of a TextArea, together with the short cuts - even without menus and toolbars - guarantees a fast working with texts:
Figure 16.14.0.4.1: Context menu
You can insert text into a TextArea at any cursor position in several ways:
Inserting Text Using Drag&Drop
Inserting text using drag & drop was successfully tested in the editors 'gedit', 'bluefish' and in the Internet browser 'firefox'. The selected text in the source is dragged over the text field while holding the mouse button down. Then the mouse button is released and the selected text is located in the TextArea and can be edited there.
Text import from a text file
Minisini said on this topic in a forum that you can only enter UTF-8 strings in a TextArea and emphasized: “If another character set works…, then the benevolence of QT or coincidence.
With this section of source code you are always on the right page:
[1] ... [2] Dim sMimeTypeCharSet, sCharSet, sMime As String [3] Dim sFilePath As String [4] [5] Dialog.Title = "Wählen Sie eine Text-Datei aus!" [6] Dialog.Filter = ["*.ini", "INI-Dateien", "*.txt", "Text-Dateien", "*", "Alle Dateien"] [7] Dialog.Path = "/etc/odbcinst.ini" [8] If Dialog.OpenFile() Then Return [9] sFilePath = Dialog.Path [10] [11] Exec ["file", "-bi", sFilePath] To sMimeTypeCharSet ' Ermittlung MimeTyp und Zeichensatz [12] Wait [13] Print sMimeTypeCharSet [14] sMime = Split(sMimeTypeCharSet, ";")[0] [15] Print "Mime-Typ = "; Trim(sMime) [16] sCharSet = Trim(Split(Split(sMimeTypeCharSet, ";")[1], "=")[1]) [17] Print "CharSet = "; Trim(sCharSet) [18] [19] If sCharSet <> "utf-8" Then [20] Try txaArea.Text = Conv(File.Load(sFilePath), sCharSet, "UTF-8") [21] ' Try txaArea.Insert(Conv(File.Load(sFilePath), sCharSet, "UTF-8")) [22] Else [23] txaArea.Text = File.Load(sFilePath) [24] ' txaArea.Insert(File.Load(sFilePath)) [25] Endif [26] [27] txaArea.Pos = 0 [28] ...
Comment:
The configuration file odbcinst. ini provided the following combined value from mime type and character set:
text/plain; charset=us-ascii
The character set of the file was therefore converted to UTF-8 according to the requirement in line 19. This was not necessary in the case of us-ascii because ASCII is included in UTF-8.
Text changes using the Text Property and the Insert(..) method
In this section, on the one hand, text is inserted into a TextArea, in which a change of the property TextArea.Text = text string the old text is completely overwritten by the new text and on the other hand, it is shown how to add text at the current text cursor position:
TextArea.Text = "Ich bin der neue Text!" TextArea.Text = TextArea.Text & "Ich bin weiterer Text!" TextArea.Text &= "Ich bin weiterer Text!" TextArea.Text &= gb.NewLine ' erzwingt einen Zeilenwechsel TextArea.Text &= gb.NewLine & gb.NewLine ' erzeugt eine Leerzeile nach dem Text
TextArea.Insert("Ich bin Text – an der aktuellen Cursor-Position eingefügt!")
Text export
If you want to save text via the ClipBoard, this only creates an apparent security, because the content of the ClipBoard is automatically deleted when you exit the program with the TextArea!
The easiest way to save the contents of a TextArea is to use a file save dialog:
Public Sub btnTextToFile_Click() Dialog.Filter = ["*.txt", "Text-Dateien"] If Dialog.SaveFile() Then Return File.Save(Dialog.Path, txaArea.Text) CATCH Message.Info(Error.Text) END
Useful information
The following commented source code sections are helpful when working with a TextArea:
Print "Number of characters = "; txaTest.Length Print "Number of lines = "; Split(txaTest.Text, gb.NewLine).Count Print "Number of lines = "; txaTest.ToLine(txaTest.Length) + 1
Public Sub btnSetWrapping_Click() txaTest.Wrap = Not txaTest.Wrap ' Alternative change of the wrap property (line break) End
TextArea.Text = "" ' deletes the entire text TextArea.Clear ' deletes the entire text
Public Sub txaTest_Cursor() Print "Zeile = "; txaTest.Line Print "Spalte = "; txaTest.Column Print "Position = "; txaTest.Pos Print "Cursor in row "; txaTest.Line; " in column "; txaTest.Column; " at position "; txaTest.Pos End
txaTest.Pos = 0 ' Jump to the first line (physical 1) to column 0 txaTest.Pos = txaTest.Length ' Jump to the last line
Public Sub txaTest_Cursor() lblAktuelleZeile.Text = "Z: " & txaTest.Line ' Display of the current line lblAktuelleSpalte.Text = "S: " & txaTest.Column ' Display of the current column (in the row) lblCursorPosition.Text = "P: " & txaTest.Pos ' Display of the current cursor position End
Limited Text
An SMS normally comprises a maximum of 160 characters. You can guarantee this number of characters with this section of the source code. Also the case that there is too much text in the TextArea by copying and pasting has been taken into account:
Public Const MAX_CHAR As Integer = 160 Public Sub txaTest_Change() ' If Len(Last.Text) < MAX_CHAR Then ' Alternative If txaTest.Length < MAX_CHAR Then txaTest.Foreground = &00007FFF& If MAX_CHAR - txaTest.Length = 1 Then FMain.Text = Subst$("Exactly 1 character is still available!") Else FMain.Text = Subst$("There are still &1 characters available!", MAX_CHAR - txaTest.Length) Endif Else If txaTest.Length = MAX_CHAR txaTest.Foreground = &00007FFF& txaTest.ReadOnly = True FMain.Text = Subst$("The maximum number of characters " & Str(MAX_CHAR) & " has been reached!") Else txaTest.Foreground = Color.Red FMain.Text = Subst$("&1 characters are inserted too many.", - MAX_CHAR + txaTest.Length) Endif End ' txaTest_Change() ... Public Sub txaTest_KeyPress() If Key.Code = Key.BackSpace Or Key.Code = Key.Delete Then txaTest.ReadOnly = False End ' txaTest_KeyPress()
The topic 'Finding and replacing text in a TextArea' is dealt with in the next chapter.
Articles