Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Für ein plattformübergreifendes Projekt musste ich für die erweiterten Funktionen die Windows API-Befehle umgehen.
Die einzige wirklich praktikable Lösung war ein eigenes Editor Gadget zu erstellen:
Extended EditorGadget Module
Automatischer Zeilenumbruch & Silbentrennung
'Weiches' Trennzeichen bzw. bedingter Trennstrich
Manueller Zeilenumbruch für WordWrap/Silbentrennung (Return bzw. Ctrl-Return bei vorhandenem automatischen Umbruch)
Fließtext für automatische Silbentrennung und WordWrap
Undo / Redo
Einfache Syntax-Hervorhebung (z.B. für Rechtschreibkontrolle)
(Automatische) Rechtschreibkontrolle (Highlighting u./o. Liste mit falschen Wörtern)
; EditEx::AddItem() - Add text row at 'Position' (or #FirstRow / #LastRow)
; EditEx::AddToUserDictionary() - Add a new word to user dictionary
; EditEx::AddWord() - Add word to syntax highlighting
; EditEx::AttachPopup() - Attach 'PopUpMenu' to gadget
; EditEx::ClearWords() - Delete the list with the words for syntax highlighting
; EditEx::ClearUndo() - Delete the list with Undo/Redo steps
; EditEx::Copy() - Copy selected text to clipboard
; EditEx::Cut() - Cut the selected text and copy it to the clipboard
; EditEx::DeleteSelection() - Delete selected text (Remove selection: #True/#False)
; EditEx::DeleteWord() - Delete word from syntax highlighting
; EditEx::EnableAutoSpellCheck() - Activate automatic spelling correction
; EditEx::EnableSyntaxHighlight() - Enable syntax highlighting (#False/#CaseSensitiv/#NoCase)
; EditEx::EnableUndoRedo() - Enable 'Undo/Redo' function (#True/#False)
; EditEx::FreeDictionary() - Removes the loaded dictionary from memory
; EditEx::GetAttribute() - Returns value of attribute (#ReadOnly/#WordWrap/#Hyphenation/#AutoHide/#Border/#CtrlChars)
; EditEx::GetColor() - Returns color of attribute (#FrontColor/#BackColor/#SyntaxColor/#SelectionColor)
; EditEx::GetItemText() - Returns text row at 'Position'
; EditEx::GetSelection() - Returns selected text (Remove selection: #True/#False)
; EditEx::GetText() - Returns all text rows seperated by 'Seperator'
; EditEx::InsertText() - Insert text at cursor position (or replace selection)
; EditEx::IsRedo() - Checks if an redo is possible
; EditEx::IsSelected() - Returns whether a selection exists
; EditEx::IsUndo() - Checks if an undo is possible
; EditEx::LoadDictionary() - Load the dictionary for spell checking
; EditEx::LoadHyphenationPattern() - Load hyphenation pattern for selected language (#Deutsch/#English/#French)
; EditEx::Redo() - Perform Redo
; EditEx::ReDraw() - Redraw the gadget
; EditEx::RemoveGadget() - Releases the used memory and deletes the cursor thread
; EditEx::Paste() - Inserting text from the clipboard
; EditEx::SaveUserDictionary() - Save user dictionary
; EditEx::SetAttribute() - Enable/Disable attribute (#ReadOnly/#WordWrap/#Hyphenation/#AutoHide/#Border/#CtrlChars)
; EditEx::SetColor() - Set or change color of attribute (#FrontColor/#BackColor/#SyntaxColor/#SelectionColor)
; EditEx::SetFont() - Set or change font FontID(#Font)
; EditEx::SetItemText() - Replace text row at 'Position'
; EditEx::SetText() - Set or replace all text rows
; EditEx::SpellCheck() - Checks the spelling of the word (returns: #True/#False)
; EditEx::SpellChecking() - Check the spelling in the editor gadget (#Highlight/#WrongWords)
; EditEx::Undo() - Perform Undo
; -----------------------
; EditEx::Gadget() - Creates an editor gadget
; -----------------------
Puuh ein EditorGadget mit einem CanvasGadget... darüber hatte ich auch mal (kurz) nachgedacht, aber da gab es mir ehrlich gesagt viel zu viele Stolpersteine.
Mit Deiner Version hier sind mir bei einem kurzen Test die folgenden Merkwürdigkeiten aufgefallen:
Setze den Cursor hinter das letzte Zeichen einer Zeile (mit der Maus!), und drücke "DEL" ->die ganze Zeile wird gelöscht, anstatt das letzte Zeichen
Setze den Cursor an die letzte Stelle hinter "Affenschar" mit der Maus und drücke Enter -> keine neue Zeile, der Cursor springt an den Anfang besagter Zeile
Wenn ich ein paar Leerzeilen am Ende habe und den Cursor in die letzte (leere) Zeile bewege, kann ich per Enter keine neuen Zeilen mehr erzeugen
Diese Fehler hier hatte ich auch mal, weiss gerade nicht mehr, wie ich sie heraufbeschworen habe:
[20:07:02] [ERROR] EditorEx.pbi (Zeile: 1889)
[20:07:02] [ERROR] SelectElement(): SelectElement(): Index-Wert kann nicht negativ sein.
und
[20:11:00] [ERROR] EditorEx.pbi (Zeile: 1719)
[20:11:00] [ERROR] Die Liste hat kein aktuelles Element.
Doppelklicke unterhalb der letzten Zeile mit "Affenschar" ->
[20:24:17] [ERROR] EditorEx.pbi (Zeile: 1936)
[20:24:17] [ERROR] Die Liste hat kein aktuelles Element.
Füge ein paar Leerzeilen ans Ende dazu (bis sie ausserhalb des sichtbaren sind), dann gehe per Cursor-Up mit dem Cursor nach oben -> Da ist kein Cursor mehr
(übrigens sollte der Text hier auch nach oben herausscrollen)
Du hast völlig recht, so ein Editor Gadget ist wirklich tückisch und hat mich schon einige Nerven gekostet mit plötzlich auftretenden seltsamen Phänomen.
Ich versuche deinen Beobachtungen auf den Grund zu gehen.
Download of PureBasic - Module Download of PureBasic - Programmes
Schiebe (in Deinem Beispiel) die Scrollbar ganz nach rechts, um das letzte Wort zu sehen, platziere den Cursor mit der Maus ganz hinten und drücke Enter -> Die Scrollbar sollte wieder nach links rücken und der Text sich entsprechend verschieben
Bewege ich danach den Cursor mit Pfeil-Links, bewegt er sich aus dem Sichtfeld.
Setze den Cursor mit der Maus nach Affen, drücke Enter. -> Erst mal der Effekt von oben, das "schar" sieht man nicht. Aber ich würde erwarten einmal "Entf" zu drücken, würde die "schar" wieder herholen, ich muss aber zweimal drücken
Füge einige Leerzeilen ans untere Ende ein, und klicke in eine beliebige leere Zeile -> Der Cursor ist ein Zeichen zu weit rechts, und ich muss auch wieder zweimal Pfeil links drücken, um an den Rand zu kommen.
Selbes Beispiel, diesmal doppelklicken auf eine beliebige leere Zeile -> der Cursor verschwindet, bei einem Editor sollte der Cursor eigentlich nie verschwinden oder aus dem sichtbaren Bereich entschwinden
Kopiere die ersten beiden Zeilen und füge sie ans Ende ein -> Der Zeilenumbruch ist verschwunden.
Wenn's Dich nervt höre ich auf, im Moment würde ich das eh nicht brauchen, aber hier und da hätte ich sicherlich Verwendung dafür.
Aber dann sollte es sich schon wie ein "echter" Editor anfühlen und verhalten.
Nachdem ich mich tagelang mit der Selektion mittels Cursor-Tasten (v.a. hoch/runter) herumgeschlagen habe und "nur knapp dem Wahnsinn entronnen bin", hier ein neues Update zum Testen.
(Wer weiß, vielleicht gibt es ja noch eine Ausnahme bei der Selektion, die mir bisher entgangen ist. Also bitte gründlich testen.)
;{ ----- History -----
; [22/11/18] Syntax highlighting improved / Selection and cursor routines completely revised / Problems with unvisible control characters fixed
;} -------------------
; EditEx::EnableSyntaxHighlight() - Enable syntax highlighting (#False/#CaseSensitiv/#NoCase)
; EditEx::AddWord() - Add word To syntax highlighting
; EditEx::DeleteWord() - Delete word from syntax highlighting
; EditEx::ClearWords() - Delete the list with the words for syntax highlighting
; EditEx::SetColor() - Set or change color of attribute (#FrontColor/#BackColor/#SelectionColor/#SyntaxColor)
; EditEx::GetColor() - Returns color of attribute (#FrontColor/#BackColor/#SelectionColor/#SyntaxColor)
Kopiere die ersten beiden Zeilen und füge sie ans Ende ein -> Der Zeilenumbruch ist verschwunden.
Das ist beabsichtigt (wg. WordWrap). Man kann nachträglich aber einen 'manuelle Zeilenumbruch' (Return bzw. Ctrl-Return) einfügen, die mitkopiert werden sollten.
Download of PureBasic - Module Download of PureBasic - Programmes
; EditEx::LoadDictionary() - Load the dictionary for spell checking
; EditEx::SpellCheck() - Checks the spelling of the word (returns: #True/#False)
; EditEx::SpellChecking() - Check the spelling in the editor gadget (#Highlight/#WrongWords)
Download of PureBasic - Module Download of PureBasic - Programmes
[02/12/18] Continuous text for hyphenation and wordwrap & many Bugfixes[02/12/18] Continuous text for hyphenation and wordwrap & Resize Handler & many Bugfixes
Download of PureBasic - Module Download of PureBasic - Programmes