[B3D] [Draw3D] Eingabefeld (Dialog) mit Syntaxhighlighting

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

FireballFlame

Betreff: [B3D] [Draw3D] Eingabefeld (Dialog) mit Syntaxhighlighting

BeitragDi, Feb 24, 2009 2:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallihallo!
Für den Mapeditor, den ich für unser Spieleprojekt geschrieben habe, brauchte ich einen Eingabedialog,
in dem ich sowohl einzelne Zahlen/Namen als auch ganze Skriptcodes schreiben kann.

Da ich im Codearchiv und auch sonstwo keinen fand, der meinen Ansprüchen
genügte, schrieb ich selbst einen und stelle ihn nun hier zur Verfügung.



Er lässt sich in zwei verschiedenen Modi aufrufen: "einfach" und "komplex".


Features:

    Im einfachen Modus:
  • selbstverständlich Eingabe von Text, Zahlen etc.
  • freie Bewegung des Cursors und Textmarkierung mit der Tastatur oder der Maus
  • ausschneiden, löschen, kopieren und Einfügen des markierten Textes an beliebiger Stelle
  • horizontales Scrollen durch Benutzung des Scrollbalkens/Buttons mit der Maus oder Bewegen des Cursors aus dem Sichtfeld
  • beliebig wählbare Position und Größe des Eingabefeldes
  • kurze Animation beim Öffnen und Schließen
  • Vorgabetext, der standardmäßig im Textfeld steht

    Im komplexen Modus:
  • alle Features aus dem einfachen Modus
  • mehrzeiliger Text, vertikal scrollbar (Scrollbalken/Buttons, Cursorbewegung, Mausrad)
  • Anzeige von Zeilennummern
  • Syntaxhighlighting, z.B. für Quellcode
  • automatische Korrektur von Groß- und Kleinschreibung beim Syntaxhighlighting




Benutzung:

Die Textbox benutzt und benötigt hectics Draw3D, da die (/das) GUI meines Mapeditors darauf basiert.
Die bekannte blitzsys.dll ist nicht unbedingt erforderlich, ermöglicht aber das Benutzen der Windows-Zwischenablage und eine Sicherheitsabfrage vor dem Schließen das Feldes.

Die Kernfunktion des Eingabefeldes ist die folgende:
Code: [AUSKLAPPEN]
Eingabefeld(Titel$,Standardtext$,Modus,PosX#,PosY#,BreiteZ,HoeheZ,StartposX#,StartposY#)
  • Titel ist der einzige notwendige Parameter und gibt eine Überschrift für das Textfeld an, um dem Nutzer zu sagen, welche Art von Eingabe erwartet wird
  • Standardtext gibt an, welchen Text das Feld beim Öffnen enthalten soll (nur im einfachen Modus)
  • Modus gibt an, in welchem Modus das Feld geöffnet werden soll (0 oder nicht angegeben=einfach, 1=komplex)
  • PosX und PosY geben an, wo das Textfeld sich befinden soll (in Draw3D-Koordinaten)
  • BreiteZ und HoeheZ geben an, wie groß das Textfeld sein soll (in Zeichen/Zeilen)
  • StartposX und StartposY geben an, von wo aus das Textfeld geöffnet werden soll (nur für die Animation relevant; Standard ist Mausposition)


Für den einfachen Modus reicht als Aufruf der Code: [AUSKLAPPEN]
rueckgabewert$=Eingabefeld(Titel$)
Zurückgegeben wird bei Bestätigung (Eingabetaste) der Inhalt des Textfeldes und bei Abbruch (ESC) der Inhalt von Standardtext (ein leerer String, falls nicht angegeben).

Für den komplexen Modus sieht ein Aufruf so aus: Code: [AUSKLAPPEN]
Eingabefeld_clear
Eingabefeld_addZeile Null,Zeile1$
Eingabefeld_addZeile Null,Zeile2$
; ...

rueckgabewert=Eingabefeld(Titel$,"",1)
In diesem Fall wird bei Bestätigung der Änderungen (ESC) 1 zurückgegeben, bei Abbruch (auch ESC, geht aber nur mit blitzsys.dll) 0. Den Inhalt der Textbox muss man dann selbst aus dem Type "EingabefeldZeile" auslesen.
Vor dem Aufruf der Hauptfunktion sollte das Eingabefeld mit "Eingabefeld_clear" geleert und anschließend, wenn es beim Öffnen Text enthalten soll, mit "Eingabefeld_addZeile" gefüllt werden. Der 1. Parameter dieser Funktion gibt an, vor welcher Zeile die neue Zeile hinzugefügt werden soll; statt Null (=ganz am Ende) kann man hier auch einen Typeeintrag vom Typ .EingabefeldZeile angeben ("Eingabefeld_addZeile" gibt immer einen solchen zurück), um eine Zeile oben oder irgendwo in der Mitte einzufügen. Bereits bestehende Zeilen können mit der Funktion "Eingabefeld_modifyZeile(Zeile.EingabefeldZeile,neuer_Text$)" geändert oder mit "Delete Zeile.EingabefeldZeile" gelöscht werden.

Alles was man sonst noch wissen muss, dürfte aus dem oberen Teil der Quelltext-Datei hervorgehen.



Download:

Ohne passende Draw3D-Texturen geht natürlich nix, deshalb hier das ganze als handliches kleines Archiv mit Testprogramm:
https://www.blitzforum.de/upload/file.php?id=6201



Bugmeldungen und Feedback sind natürlich willkommen! Smile







Und da wir hier im Codearchiv sind, gibts auch noch den puren Quelltext:
Eingabefeld.bb
Testprogramm Code: [AUSKLAPPEN]



Include "Draw3D.bb"
Include "Eingabefeld.bb"



Graphics3D 1024,768,0,2
SetBuffer BackBuffer()


Global cam=CreateCamera()
DrawInit3D cam
Origin3D 1024,768      ; <- Eingabefeld ist für 1024,768 optimiert
Eingabefeld_Texturen_laden



Print "Taste drücken für einfache Textbox..."
WaitKey()









Local rueckgabewert1$=Eingabefeld("Einfache Textbox","Standardtext")

Locate 0,0
Print "Du hast "+Chr(34)+rueckgabewert1+Chr(34)+" eingegeben."
Print ""
Print "Taste drücken für komplexe Textbox..."
WaitKey()







Local datei=ReadFile("Eingabefeld - Beispielinhalt.txt")
Eingabefeld_clear
While Not Eof(datei)
   Eingabefeld_addZeile Null,ReadLine(datei)
Wend

Local rueckgabewert2=Eingabefeld("Komplexe Textbox","",1)

Locate 0,0
If rueckgabewert2=1
   Print "Der Inhalt der Textbox lautet nun wie folgt:"
   Print ""
   Local inhalt.EingabefeldZeile
   For inhalt=Each EingabefeldZeile
      Print inhalt\Text
   Next
Else
   Print "Du hast die Eingabe abgebrochen."
End If


WaitKey()
End




  • Zuletzt bearbeitet von FireballFlame am Mo, Okt 26, 2009 14:49, insgesamt 23-mal bearbeitet

D2006

Administrator

BeitragDi, Feb 24, 2009 10:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Rolling Eyes

Die Benutzung von Leerzeichen in der Auflistung von Funktionsparametern wäre nicht nur der Übersicht dienlich, sondern würde auch das hier vorliegende Foren-Layout-Problem lösen.

Ich war mal so frei und hab ein paar eingefügt.
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2

flona

BeitragDi, Feb 24, 2009 12:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow gute Performance Exclamation

Du könntest vll noch eine Rückgängig/Wiederholen Funktion mit einbauen, dann wärs perfekt.
www.Dreier-Florian.kilu.de
Intel Core 2 Quad Q9400 | Zotac 9800GT | 4GB RAM | 1TB HDD | Windows 7 Professional 32bit

ozzi789

BeitragDi, Feb 24, 2009 12:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kann es leider nicht testen, sieht aber ganz gut aus (vom code her)
Was bei den meisten Eingabefeldern/routinen/gui's hier fehlt ist das man mit dem Tabulator ins nächste Feld springen kann, nur so als Tipp am Rande Smile


mfg
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

FireballFlame

BeitragDi, Feb 24, 2009 17:17
Antworten mit Zitat
Benutzer-Profile anzeigen
@Dee: Huch, gute Idee - ich dachte, das Codefeld kann keine Zeilenumbrüche, schließlich hat es ja nen horizontalen Scrollbalken Rolling Eyes

@flona: Ne Rückgängig-Funktion ist nicht ganz einfach, aber ich überleg mir mal, wie man das machen könnte...

@ozzi: Mein Eingabefeld ist nicht als GUI-Element gedacht, sondern als Dialogbox, d.h. es wird immer nur ein Exemplar zur gleichen Zeit angezeigt. Tabs kann man in das Feld eingeben, sie werden aber automatisch in eine passende Anzahl Leerzeichen umgewandelt.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

coolo

BeitragDi, Feb 24, 2009 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow! Fireballflame, du hast ja schon im Chat angekündigt, aber jetzt wos draußen ist ists noch besser! Jetzt kann man seinen Mapeditor mit einem komfortabeln Texteditor hinzufügen.
http://programming-with-design.at/ <-- Der Preis ist heiß!
That's no bug, that's my project!
"Eigenzitate sind nur was für Deppen" -Eigenzitat

FireballFlame

BeitragMi, Feb 25, 2009 23:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Update!
Mir ist aufgefallen, dass das Öffnen eines Eingabefeldes mit viel Text aufgrund des Synaxhighlightings sehr lange dauerte.
Deshalb habe ich folgende Optimierung vorgenommen:
Das Syntaxhighlighting wird jetzt nicht mehr für das ganze Eingabefeld auf einmal berechnet, sondern nur noch für 1-3 Zeilen pro Hauptschleifendurchlauf; Zeilen, die gerade im Bild sind, haben dabei eine höhere Priorität als die anderen.
Nun können auch sehr große Mengen an Text problemlos verarbeitet werden.
(Ich hab mal Crysis.exe ausprobiert ... es lädt und läuft trotz Syntaxhighlighting und Debugger schneller als Microsoft Windows Notepad Razz)

Das Highlighting im lässt sich jetzt übrigens auch mit einer globalen Variable abschalten.



Ich habe den Quellcode sowohl in den Codetags als auch im Archiv aktualisiert.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

flona

BeitragSa, Feb 28, 2009 2:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Das wird ja immer besser Very Happy
Wäre es noch möglich in der CodeBox Zeilennummern anzuzeigen Question

mfg Florian
www.Dreier-Florian.kilu.de
Intel Core 2 Quad Q9400 | Zotac 9800GT | 4GB RAM | 1TB HDD | Windows 7 Professional 32bit

FireballFlame

BeitragSo, März 01, 2009 0:06
Antworten mit Zitat
Benutzer-Profile anzeigen
So, neue Version, auf Wunsch jetzt mit Zeilennummern.

Die Funktionen zum Löschen und Einfügen von Text habe ich auch nochmal überarbeitet, sie sind jetzt deutlich schneller als vorher. Ab fünfstelligen Zeilenzahlen wirds trotzdem lahm, aber soviel sollte man normalerweise nicht brauchen Smile
Außerdem hab ich einen Bug behoben, durch den das Einfügen von Text nicht richtig funktionierte, wenn dieser mit einem Zeilenumbruch endete.

Die neue Version gibt es momentan nur als Download. Wenn ich den Code einfüge, wird der Beitrag in der Mitte abgeschnitten und ich weiß nicht, wieso Evil or Very Mad
Allerdings hab ich die Datei hier ins BBP-Archiv geladen, sodass der Download zeitlich uneingeschränkt verfügbar sein sollte.

EDIT:
Offenbar ist die Beitragslänge begrenzt o.O
Der Code hat jetzt nen Extrapost... Smile
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit
  • Zuletzt bearbeitet von FireballFlame am Mo, Jun 29, 2009 23:40, insgesamt 3-mal bearbeitet

hamZta

Administrator

BeitragSo, März 01, 2009 2:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Eingabefeld.bb Code: [AUSKLAPPEN]


;                             +-------------------------------+                           
;                             | Eingabefeld von FireballFlame |                           
;                             +-------------------------------+                           

; ----- Einstellungen: --------------------------------------------------------------------

Const Eingabefeld_BlitzSys_vorhanden   = 0         ; Kann die blitzsys.dll genutzt werden?
Function DLLMessageBox(m, i, a, u):End Function      ; <-,
Function DLLSetClipboardText(muh):End Function      ; <-+- wenn ja, diese drei Zeilen auskommentieren
Function DLLEZGetClipboardText():End Function      ; <-'



Const Eingabefeld_Texturpfad$         = "Eingabefeld - Texturen\"

Const Eingabefeld_Schriftart_Datei$      = Eingabefeld_Texturpfad+"Eingabefeld_verdana1_mod.png"   ; Schriftart
Const Eingabefeld_Schriftskalierung#   = 1.1      ; Darstellungsgrˆfle der Zeichen (SetFont3D)
Global Eingabefeld_Zeichenbreite      = 10      ; <-, _ diese beiden Werte m¸ssen angepasst werden, wenn die
Global Eingabefeld_Zeichenhoehe         = 18      ; <-'  Schriftskalierung oder die Schriftart ge‰ndert wird





Global Eingabefeld_Standardbreite_einfach   = 40      ; Angabe in Zeichen
Global Eingabefeld_Standardbreite_komplex   = 80      ; Angabe in Zeichen
Global Eingabefeld_Standardhoehe_komplex   = 30      ; Angabe in Zeilen


Global Eingabefeld_Animationsdauer_einfach   = 100      ; Angabe in Millisekunden
Global Eingabefeld_Animationsdauer_komplex   = 250      ; Angabe in Millisekunden





Global Eingabefeld_CursorBlinkgeschwindigkeit#   = 1      ; Angabe in Hertz

Global Eingabefeld_KeyRepeatDelay   = 500   ; Zeit in Millisek. bis zum 2. Anschlag bei gedr¸ckt gehaltener Taste
Global Eingabefeld_KeyRepeatInterval= 75   ; Zeit in Millisek. vom n. bis zum (n+1). Anschlag bei gedr¸ckt gehaltener Taste (n>=2)




Global Eingabefeld_Tabbreite = 4      ; Grˆfle des maximalen Tabulator-Abstandes in Zeichen




Global Eingabefeld_Zeilennummern = 1   ; Zeilennummern im komplexen Modus?




Global Eingabefeld_Syntaxhighlighting            = 1      ; Syntaxhighlighting im komplexem Modus?

Global Eingabefeld_Syntaxhighlighting_CaseSensitive   = -1
         ;  1=Syntaxhighlights werden nur bei korrekter Grofl-/Kleinschreibung erkannt
         ;  0=Syntaxhighlights werden bei jeder Schreibweise erkannt
         ; -1=Syntaxhighlights werden bei jeder Schreibweise erkannt, aber die Grofl-/Kleinschreibung wird automatisch korrigiert

Const EFSFarbe_normal         =$10000*0   +$100*0      +0      ; Farbcodes nach dem Muster $10000*R +$100*G +B
Const EFSFarbe_Datentyp         =$10000*130   +$100*50   +170
Const EFSFarbe_Schluesselwort   =$10000*0   +$100*40   +120
Const EFSFarbe_MathFunktion      =$10000*70   +$100*120   +150
Const EFSFarbe_Funktion         =$10000*80   +$100*40   +0
Const EFSFarbe_Operator         =$10000*70   +$100*70   +70
Const EFSFarbe_Relation         =$10000*70   +$100*70   +70
Const EFSFarbe_Klammer         =$10000*70   +$100*70   +70
Const EFSFarbe_Sprungmarke      =$10000*230   +$100*70   +70
Const EFSFarbe_String         =$10000*50   +$100*180   +0
Const EFSFarbe_Kommentar      =$10000*170   +$100*170   +0
Const EFSFarbe_keine         = -1   ; keine Farbver‰nderung, nur Grofl-/Kleinschreibkorrektur
Const EFSFarbe_Zeilennummer      =$10000*180   +$100*180   +180
Const EFSFarbe_Auswahl         =$10000*233   +$100*233   +100

Const EFSTyp_Wort      = 1   ; "highlighted" den gesuchten String; aber nur, wenn er zwischen Trennzeichen steht
Const EFSTyp_Wortteil   = 2   ; "highlighted" den gesuchten String ¸berall, wo er gefunden wird
Const EFSTyp_Kommentar   = 3   ; "highlighted" alles vom gesuchten String bis zum Zeilenende
Const EFSTyp_String      = 4   ; "highlighted" alles bis einschliefllich zum n‰chsten Auftauchen des gesuchten Strings (oder Zeilenende)
Const EFSTyp_Label      = 5   ; "highlighted" alles bis zum n‰chsten Trennzeichen

Global Eingabefeld_Trennzeichenliste$=":., ; +-*/%=!<>()\~^"+Chr(34)


Function Eingabefeld_setSyntaxhighlights()   ; Deklaration aller Syntaxhighlights - diese Funktion wird automatisch bei jedem
                                 ; ÷ffnen eines komplexen Eingabefeldes durchlaufen und kann auch jederzeit manuell
                                 ; aufgerufen werden; somit werden dynamische Syntaxhighlights ermˆglicht: z.B.
                                 ; kˆnnte man, f¸r das Schreiben von Skripten oder Quellcode, eine Suche nach
                                 ; Variablendeklarationen in die Funktion Eingabefeld_verarbeite_Zeile einbauen,
                                 ; alle gefundenen Variablen in einem Type speichern, und dann mit dieser Funktion
                                 ; alle Eintr‰ge des Types als Syntaxhighlights deklarieren...
   
   Eingabefeld_clearSyntaxhighlights
   
   
   
   ; ich habe hier zu Demonstrationszwecken mal einige BlitzBasic-Code-kompatible Highlights eingetragen:
   
   ; Programmablaufkontrolle
   Eingabefeld_addSyntaxhighlight "If"         , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Then"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Else"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "EndIf"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Select"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Case"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Default"   , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "While"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Wend"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Repeat"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Until"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Forever"   , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "For"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "To"         , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Step"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Each"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Next"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Exit"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight ". "         , EFSFarbe_Sprungmarke,    EFSTyp_Label
   Eingabefeld_addSyntaxhighlight "Goto"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Function"   , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Return"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Delay"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "End"      , EFSFarbe_Schluesselwort
   
   ; Datentypen
   Eingabefeld_addSyntaxhighlight "%"      , EFSFarbe_Datentyp,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight "#"      , EFSFarbe_Datentyp,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight "$"      , EFSFarbe_Datentyp,       EFSTyp_Wortteil
   
   ; Variablendeklarationen
   Eingabefeld_addSyntaxhighlight "Global"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Const"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Local"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Type"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Field"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "New"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Delete"      , EFSFarbe_Schluesselwort
   
   ; globale Konstanten
   Eingabefeld_addSyntaxhighlight "True"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "False"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Null"      , EFSFarbe_Schluesselwort
   
   ; Bitoperatoren
   Eingabefeld_addSyntaxhighlight "Not"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "And"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Or"         , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Xor"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Shr"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Sar"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Shl"      , EFSFarbe_Schluesselwort
   
   ; mathematische Funktionen
   Eingabefeld_addSyntaxhighlight "Mod"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Int"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Float"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Ceil"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Floor"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Abs"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Sgn"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Sqr"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Exp"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Log"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Log10"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Sin"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Cos"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Tan"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "ASin"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "ACos"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "ATan"      , EFSFarbe_MathFunktion
   
   ; andere Funktionen
   Eingabefeld_addSyntaxhighlight "Graphics"            , EFSFarbe_Funktion
   Eingabefeld_addSyntaxhighlight "SetBuffer"            , EFSFarbe_Funktion
   Eingabefeld_addSyntaxhighlight "BackBuffer"            , EFSFarbe_Funktion
   Eingabefeld_addSyntaxhighlight "Cls"               , EFSFarbe_Funktion
   Eingabefeld_addSyntaxhighlight "Print"               , EFSFarbe_Funktion
   Eingabefeld_addSyntaxhighlight "LoadImage"            , EFSFarbe_Funktion
   Eingabefeld_addSyntaxhighlight "DrawImage"            , EFSFarbe_Funktion
   Eingabefeld_addSyntaxhighlight "Flip"               , EFSFarbe_Funktion
   Eingabefeld_addSyntaxhighlight "WaitKey"            , EFSFarbe_Funktion
   
   ; sonstiges
   Eingabefeld_addSyntaxhighlight "+"      , EFSFarbe_Operator,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight "-"      , EFSFarbe_Operator,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight "*"      , EFSFarbe_Operator,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight "/"      , EFSFarbe_Operator,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight "^"      , EFSFarbe_Operator,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight "="      , EFSFarbe_Relation,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight ">"      , EFSFarbe_Relation,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight "<"      , EFSFarbe_Relation,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight "("      , EFSFarbe_Klammer,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight ")"      , EFSFarbe_Klammer,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight "\"      , EFSFarbe_Operator,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight Chr(34)   , EFSFarbe_String,       EFSTyp_String
   Eingabefeld_addSyntaxhighlight ";"      , EFSFarbe_Kommentar,    EFSTyp_Kommentar
End Function















Function DrawCursor()
   ; wenn HidePointer angewandt wurde oder das Programm im Vollbildmodus l‰uft, muss in dieser
   ; Funktion der Mauszeiger gezeichnet werden (ob mit DrawImage oder DrawImage3D ist egal)
End Function





; -----------------------------------------------------------------------------------------






















;[Block] interne Variablen
Global Eingabefeld_hgpixel
Global Eingabefeld_hgpanel
Global Eingabefeld_feldtex
Global Eingabefeld_scrollbutton
Global Eingabefeld_scrollpfeil
Global Eingabefeld_pixel
Global Eingabefeld_schriftart
Global Eingabefeld_screencap


Global Eingabefeld_Timer=CreateTimer(60)
Global Eingabefeld_Trennzeichenliste_Len
Global Eingabefeld_ScrollX#, Eingabefeld_ScrollY#
Global Eingabefeld_ScrollMaus=0   ; f¸r das Verschieben das Scrollbalkens mit der Maus; 1=horizontal, 2=vertikal
Global Eingabefeld_horizScrollbalkenbreite#, Eingabefeld_vertScrollbalkenhoehe#
Type EingabefeldZeile
   Field Text$
   Field Len
   Field Text_mit_Farbcodes$
End Type
Global Eingabefeld_CursorS, Eingabefeld_CursorZ      ; Spalte und Zeile, Beginn bei 1
Global Eingabefeld_lastCursorS, Eingabefeld_lastCursorZ
Global Eingabefeld_AuswahlAS, Eingabefeld_AuswahlAZ   ; Startpunkt der Markierung; 0=keine Markierung
Global Eingabefeld_AuswahlES, Eingabefeld_AuswahlEZ   ; Endpunkt der Markierung; 0=keine Markierung
Global Eingabefeld_CursorBlink#      ; >=0 und <2, bei >=1 ist der Cursor sichtbar
Global Eingabefeld_Mausaktion
Global Eingabefeld_lastMillisecs
Global Eingabefeld_komplex
Global Eingabefeld_Clipboard$=""
Global Eingabefeld_Verarbeitung.EingabefeldZeile
Dim Eingabefeld_KeyDown(237)   ; speichert in Millisekunden, wie lange die Taste schon gedr¸ckt gehalten wurde
Type EingabefeldSyntaxhighlight
   Field Text$
   Field Farbcode
   Field Typ
End Type
;[End Block]

























Function Eingabefeld$(Titel$, Standardtext$="", Modus=0, PosX#=0, PosY#=0, BreiteZ=-1, HoeheZ=-1, StartposX#=-9999929, StartposY#=-9999929)
   If StartposX=-9999929 Then StartposX=MouseX3D
   If StartposY=-9999929 Then StartposY=MouseY3D
   Eingabefeld_komplex=Modus
   
   Eingabefeld_Auswahl_aufheben
   Eingabefeld_CursorS=1:Eingabefeld_CursorZ=1
   Eingabefeld_Trennzeichenliste_Len=Len(Eingabefeld_Trennzeichenliste)
   
   If Eingabefeld_komplex
      Eingabefeld_setSyntaxhighlights
      
      If First EingabefeldZeile=Null Then Eingabefeld_addZeile Null, ""
      Local uz.EingabefeldZeile:For uz=Each EingabefeldZeile:Eingabefeld_verarbeite_Zeile uz:Next
      
      ;[Block] Cursor ins Textfeld setzen, falls auflerhalb
      Local s_z_anz_z.EingabefeldZeile=First EingabefeldZeile, s_z_anz=0
      While s_z_anz_z<>Null
         s_z_anz=s_z_anz+1
         s_z_anz_z=After s_z_anz_z
      Wend
      If Eingabefeld_CursorZ>s_z_anz Then Eingabefeld_CursorZ=s_z_anz
      If Eingabefeld_CursorZ<1 Then Eingabefeld_CursorZ=1
      If Eingabefeld_CursorS>Eingabefeld_getZeilenlaenge(Eingabefeld_CursorZ)+1 Then Eingabefeld_CursorS=Eingabefeld_getZeilenlaenge(Eingabefeld_CursorZ)+1
      If Eingabefeld_CursorS<1 Then Eingabefeld_CursorS=1
      If Eingabefeld_AuswahlAS=0 And Eingabefeld_AuswahlAZ=0 And Eingabefeld_AuswahlES=0 And Eingabefeld_AuswahlEZ=0 Then Eingabefeld_Auswahl_aufheben
      ;[End Block]
      
      If BreiteZ=-1 Then BreiteZ=Eingabefeld_Standardbreite_komplex
      If HoeheZ=-1 Then HoeheZ=Eingabefeld_Standardhoehe_komplex
   Else
      Eingabefeld_clearSyntaxhighlights
      Eingabefeld_clear
      Eingabefeld_addZeile Null, Standardtext
      Eingabefeld_AuswahlAS=1
      Eingabefeld_AuswahlAZ=1
      Eingabefeld_AuswahlES=Len(Standardtext)+1
      Eingabefeld_AuswahlEZ=1
      Eingabefeld_CursorS=Eingabefeld_AuswahlES
      Eingabefeld_CursorZ=Eingabefeld_AuswahlEZ
      If BreiteZ=-1 Then BreiteZ=Eingabefeld_Standardbreite_einfach
      HoeheZ=1
   End If
   
   
   
   
   Local zeichenbreite=Eingabefeld_Zeichenbreite
   Local zeichenhoehe=Eingabefeld_Zeichenhoehe
   Local Breite#=((BreiteZ+1)*zeichenbreite)/2
   Local Hoehe#=(HoeheZ*zeichenhoehe)/2
   Local grenze_l#=PosX-Breite
   Local grenze_r#=PosX+Breite
   Local grenze_o#=PosY+Hoehe
   Local grenze_u#=PosY-Hoehe
   
   Local zeilenanzahl, max_zeilenbreite, z.EingabefeldZeile
   Local maushit_
   Eingabefeld_ScrollX=0:Eingabefeld_ScrollY=0
   Eingabefeld_ScrollMaus=0
   Eingabefeld_CursorBlink=1
   Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
   Eingabefeld_Verarbeitung=Null
   
   
   
   
   
   CopyRect 0, 0, GraphicsWidth(), GraphicsHeight(), 0, 0, BackBuffer(), ImageBuffer(Eingabefeld_screencap)
   FlushKeys : FlushMouse
   
   Local b_dauer:If Eingabefeld_komplex Then b_dauer=Eingabefeld_Animationsdauer_komplex Else b_dauer=Eingabefeld_Animationsdauer_einfach
   ;[Block] Textbox einblenden
   Local b_zeitpunkt#
   If b_dauer>0
      Local b_startzeit=MilliSecs()
      Repeat
         b_zeitpunkt=1-(b_startzeit+b_dauer-MilliSecs())/Float(b_dauer)
         If b_zeitpunkt>1 Then b_zeitpunkt=1
         Eingabefeld_zeichnen(Titel, PosX, PosY, Breite, Hoehe, BreiteZ, HoeheZ, StartposX, StartposY, Eingabefeld_screencap, b_zeitpunkt, grenze_l#, grenze_r#, grenze_o#, grenze_u#, zeichenbreite, zeichenhoehe, max_zeilenbreite, zeilenanzahl, 0, 0)
         DrawCursor
         Flip
      Until b_zeitpunkt=1
   End If
   b_zeitpunkt=1
   ;[End Block]
   
   ;[Block] Textbox ist geˆffnet
   Local tbreturn
   Repeat
      maushit_=MouseHit(1)
      zeilenanzahl=0:max_zeilenbreite=0
      For z=Each EingabefeldZeile
         zeilenanzahl=zeilenanzahl+1
         If Len(z\Text)>max_zeilenbreite Then max_zeilenbreite=Len(z\Text)
      Next
      tbreturn=Eingabefeld_zeichnen(Titel, PosX, PosY, Breite, Hoehe, BreiteZ, HoeheZ, StartposX, StartposY, Eingabefeld_screencap, 1, grenze_l#, grenze_r#, grenze_o#, grenze_u#, zeichenbreite, zeichenhoehe, max_zeilenbreite, zeilenanzahl, maushit_, 1)
      DrawCursor
      Flip
   Until tbreturn
   ;[End Block]
   
   ;[Block] Textbox ausblenden
   If b_dauer>0
      b_startzeit=MilliSecs()
      Repeat
         b_zeitpunkt=(b_startzeit+b_dauer-MilliSecs())/Float(b_dauer)
         If b_zeitpunkt<0 Then b_zeitpunkt=0
         Eingabefeld_zeichnen(Titel, PosX, PosY, Breite, Hoehe, BreiteZ, HoeheZ, StartposX, StartposY, Eingabefeld_screencap, b_zeitpunkt, grenze_l#, grenze_r#, grenze_o#, grenze_u#, zeichenbreite, zeichenhoehe, max_zeilenbreite, zeilenanzahl, 0, 0)
         DrawCursor
         Flip
      Until b_zeitpunkt=0
   End If
   b_zeitpunkt=0
   ;[End Block]
   
   Eingabefeld_AuswahlAS=0:Eingabefeld_AuswahlAZ=0:Eingabefeld_AuswahlES=0:Eingabefeld_AuswahlEZ=0
   Clear3D
   FlushKeys : FlushMouse
   If Eingabefeld_komplex
      Return (tbreturn=1)
   Else
      If tbreturn=1
         Local rzeile.EingabefeldZeile=First EingabefeldZeile
         Return rzeile\Text
      Else
         Return Standardtext
      End If
      Eingabefeld_clear
   End If
End Function


Function Eingabefeld_Texturen_laden()
   Eingabefeld_hgpixel      = LoadImage3D(Eingabefeld_Texturpfad+"Eingabefeld_pixel.png")
   Eingabefeld_hgpanel      = LoadImage3D(Eingabefeld_Texturpfad+"Eingabefeld_panel.png")
   Eingabefeld_feldtex      = LoadImage3D(Eingabefeld_Texturpfad+"Eingabefeld_textfeld.png")
   Local Eingabefeld_stex   = LoadImage3D(Eingabefeld_Texturpfad+"Eingabefeld_textfeld_scroll.png")
   Eingabefeld_scrollbutton= GrabImage3D(Eingabefeld_stex, 0, 0, 26, 26)
   Eingabefeld_scrollpfeil   = GrabImage3D(Eingabefeld_stex, 27, 23, 5, 9)
   Eingabefeld_pixel      = LoadImage3D(Eingabefeld_Texturpfad+"Eingabefeld_pixel.png")
   Eingabefeld_schriftart   = LoadFont3D(Eingabefeld_Schriftart_Datei)
   Eingabefeld_screencap   = CreateImage(GraphicsWidth(), GraphicsHeight())
End Function


Function Eingabefeld_addZeile.EingabefeldZeile(nachfolgerzeile.EingabefeldZeile, z_text$)
   Local z.EingabefeldZeile=New EingabefeldZeile
   If nachfolgerzeile.EingabefeldZeile<>Null Then Insert z Before nachfolgerzeile
   Eingabefeld_modifyZeile z, z_text
   Return z
End Function


Function Eingabefeld_modifyZeile(zeile.EingabefeldZeile, neuer_text$)
   zeile\Text=neuer_text
   Return Eingabefeld_verarbeite_Zeile(zeile)
End Function


Function Eingabefeld_getZeile.EingabefeldZeile(zeilennr)
   If zeilennr<1 Then Return Null
   Local zeile.EingabefeldZeile=First EingabefeldZeile
   
   Local znr
   For znr=1 To zeilennr-1
      If zeile=Null Then Return Null
      zeile=After zeile
   Next
   Return zeile
End Function


Function Eingabefeld_getZeilenlaenge(zeilennr)
   Local zeile.EingabefeldZeile=Eingabefeld_getZeile(zeilennr)
   If zeile=Null Then Return 0 Else Return zeile\Len
End Function


Function Eingabefeld_clear()
   Delete Each EingabefeldZeile
End Function


Function Eingabefeld_zeichnen(Titel$, PosX#, PosY#, Breite#, Hoehe#, BreiteZ, HoeheZ, StartposX#, StartposY#, bg, zeitpunkt#, grenze_l#, grenze_r#, grenze_o#, grenze_u#, zeichenbreite, zeichenhoehe, max_zeilenbreite, zeilenanzahl, maushit, eingabe)
   WaitTimer(Eingabefeld_Timer)
   
   ;[Block] Box mit Beschriftung
   DrawBlock bg, 0, 0
   ColorN3D 0, 0, 0, zeitpunkt*.35
   Rect3D Eingabefeld_hgpixel, 0, 0, 1000, 1000, 1, 0
   ColorN3D 230, 230, 230, zeitpunkt
   Rect3D Eingabefeld_hgpanel, zeitpunkt*(PosX+10)+(1-zeitpunkt)*StartposX, zeitpunkt*(PosY+12-10)+(1-zeitpunkt)*StartposY, zeitpunkt*(Breite+3+10), zeitpunkt*(Hoehe+15+10), 1, 3*zeitpunkt
   ColorN3D 255, 255, 255, zeitpunkt
   Rect3D Eingabefeld_feldtex, zeitpunkt*PosX+(1-zeitpunkt)*StartposX, zeitpunkt*PosY+(1-zeitpunkt)*StartposY, zeitpunkt*Breite, zeitpunkt*Hoehe, 1, 3*zeitpunkt
   ColorN3D
   SetFont3D 1.1, 1.25
   ColorT3D 0, 0, 0
   Text3D Eingabefeld_schriftart, zeitpunkt*(PosX-Breite+4)+(1-zeitpunkt)*StartposX, zeitpunkt*(PosY+Hoehe+16)+(1-zeitpunkt)*StartposY, Eingabefeld_Begrenzung(Titel, (2*Breite-8)*zeitpunkt)
   ;[End Block]
   
   If zeitpunkt>.99
      Local zeilennummerbreite=(Eingabefeld_komplex And Eingabefeld_Zeilennummern)*Len(zeilenanzahl)
      BreiteZ=BreiteZ-zeilennummerbreite
      If KeyHit(221) Then Eingabefeld_Zeilennummern=1-Eingabefeld_Zeilennummern
      ;[Block] Scrollbalken
      Local sba1=Breite-18
      If Eingabefeld_Scrollbalken_zeichnen(PosX, PosY-Hoehe-13, 0, sba1, (max_zeilenbreite>BreiteZ), Breite, Hoehe, zeichenbreite, zeichenhoehe, max_zeilenbreite+zeilennummerbreite, zeilenanzahl, grenze_l, grenze_r, grenze_o, grenze_u)
         If maushit Then Eingabefeld_ScrollMaus=1
      End If
      Local sba2=Hoehe-18
      If Eingabefeld_Scrollbalken_zeichnen(PosX+Breite+13, PosY, 1, sba2, (Eingabefeld_komplex And zeilenanzahl>HoeheZ), Breite, Hoehe, zeichenbreite, zeichenhoehe, max_zeilenbreite+zeilennummerbreite, zeilenanzahl, grenze_l, grenze_r, grenze_o, grenze_u)
         If maushit Then Eingabefeld_ScrollMaus=2
      End If
      If Not MouseDown(1) Then Eingabefeld_ScrollMaus=0
      If Eingabefeld_ScrollMaus=1 Then Eingabefeld_ScrollX=(.5*(((MouseX3D-PosX)-Eingabefeld_horizScrollbalkenbreite)/1024.*(GraphicsWidth()/Float(sba1)))+.5)*(max_zeilenbreite*zeichenbreite)
      If Eingabefeld_ScrollMaus=2 Then Eingabefeld_ScrollY=(.5*((-(MouseY3D-PosY)-Eingabefeld_vertScrollbalkenhoehe)/768.*(GraphicsHeight()/Float(sba2)))+.5)*(zeilenanzahl*zeichenhoehe)
      
      If Eingabefeld_Scrollbutton_zeichnen(PosX-Breite+7, PosY-Hoehe-13, 180, (max_zeilenbreite>BreiteZ), MouseDown(1)) Then Eingabefeld_ScrollX=Eingabefeld_ScrollX-zeichenbreite:Delay 100
      If Eingabefeld_Scrollbutton_zeichnen(PosX+Breite-7, PosY-Hoehe-13, 0, (max_zeilenbreite>BreiteZ), MouseDown(1)) Then Eingabefeld_ScrollX=Eingabefeld_ScrollX+zeichenbreite:Delay 100
      If Eingabefeld_Scrollbutton_zeichnen(PosX+Breite+13, PosY+Hoehe-7, 270, Eingabefeld_komplex*(zeilenanzahl>HoeheZ), MouseDown(1), (HoeheZ<=1)) Then Eingabefeld_ScrollY=Eingabefeld_ScrollY-zeichenhoehe:Delay 100
      If Eingabefeld_Scrollbutton_zeichnen(PosX+Breite+13, PosY-Hoehe+7, 90, Eingabefeld_komplex*(zeilenanzahl>HoeheZ), MouseDown(1), (HoeheZ<=1)) Then Eingabefeld_ScrollY=Eingabefeld_ScrollY+zeichenhoehe:Delay 100
      
      If (HoeheZ>1); And RectsOverlap(grenze_l, grenze_u, grenze_r-grenze_l, grenze_o-grenze_u, MouseX3D, MouseY3D, 1, 1)
         If KeyDown(42) Or KeyDown(54) Then Eingabefeld_ScrollX=Eingabefeld_ScrollX-3*zeichenbreite*MouseZSpeed() Else Eingabefeld_ScrollY=Eingabefeld_ScrollY-zeichenhoehe*MouseZSpeed()
      Else
         MouseZSpeed()
      End If
      
      Eingabefeld_Scrollposition_begrenzen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe, max_zeilenbreite, zeilenanzahl
      ;[End Block]
      
      ;[Block] Text
      SetFont3D Eingabefeld_Schriftskalierung
      Local z.EingabefeldZeile, znr=0, zeichen, textx#, texty#, farbe_zeichen_verbleibend, lenplus, fcspos, fcepos, fc, ise, sis=0
      If First EingabefeldZeile=Null Then Eingabefeld_addZeile Null, ""
      
      For z=Each EingabefeldZeile
         znr=znr+1
         texty=Eingabefeld_ScrollY+PosY+Hoehe+9-zeichenhoehe*znr
         If texty+7>grenze_o Then Goto continue_foreach
         If texty-7<grenze_u Then Exit
         
         If sis=0 Then If z\Text_mit_Farbcodes="" Then If z\Text<>"" Then Eingabefeld_Verarbeitung=z:sis=2
         lenplus=0
         farbe_zeichen_verbleibend=0
         ise=z\Len+(z\Len=0)
         
         For zeichen=1 To ise
            textx=-Eingabefeld_ScrollX+PosX-Breite+zeichenbreite*(zeichen+zeilennummerbreite)
            
            If zeichen=1
               If Eingabefeld_komplex And Eingabefeld_Zeilennummern
                  ColorT3D (EFSFarbe_Zeilennummer And $FF0000)/$10000, (EFSFarbe_Zeilennummer And $FF00)/$100, EFSFarbe_Zeilennummer And $FF
                  Text3D Eingabefeld_schriftart, PosX-Breite+zeichenbreite*zeilennummerbreite, texty, znr, 2
               End If
               ColorT3D (EFSFarbe_normal And $FF0000)/$10000, (EFSFarbe_normal And $FF00)/$100, EFSFarbe_normal And $FF
            End If
            
            ;[Block] Farben
            Repeat
               fcspos=zeichen+lenplus+1
               If Not Mid(z\Text_mit_Farbcodes, fcspos-1, 1)=Chr(8) Then Exit
               fcepos=Instr(z\Text_mit_Farbcodes, Chr(8), fcspos)
               fc=Mid(z\Text_mit_Farbcodes, fcspos, fcepos-fcspos)
               ColorT3D (fc And $FF0000)/$10000, (fc And $FF00)/$100, fc And $FF
               lenplus=lenplus+(fcepos-fcspos)+2
            Forever
            ;[End Block]
            
            If textx-5<grenze_l+zeilennummerbreite*zeichenbreite Then Goto continue_for
            If textx+5>grenze_r Then Exit
            
            ;[Block] Mausaktion
            If Eingabefeld_Mausaktion
               If MouseY3D>texty-zeichenhoehe/2-1 And MouseY3D<texty+zeichenhoehe/2+1
                  If MouseX3D>textx-zeichenbreite-1 And MouseX3D<textx+1
                     Eingabefeld_CursorS=zeichen
                     Eingabefeld_CursorZ=znr
                     Eingabefeld_CursorBlink=1
                     If Eingabefeld_Mausaktion=1 Then Eingabefeld_Auswahl_aufheben Else Eingabefeld_Auswahl_an_Cursor_angleichen
                  ElseIf zeichen=ise
                     If MouseX3D>textx-1
                        Eingabefeld_CursorS=zeichen+(z\Len>0)
                        Eingabefeld_CursorZ=znr
                        Eingabefeld_CursorBlink=1
                        If Eingabefeld_Mausaktion=1 Then Eingabefeld_Auswahl_aufheben Else Eingabefeld_Auswahl_an_Cursor_angleichen
                     End If
                  ElseIf zeichen=1
                     If MouseX3D<textx+1
                        If Eingabefeld_Mausaktion=1
                           Eingabefeld_Auswahl_aufheben
                           Eingabefeld_lastCursorS=1
                           Eingabefeld_lastCursorZ=znr
                           Eingabefeld_CursorS=1
                           Eingabefeld_CursorZ=znr+1
                           Eingabefeld_Cursorposition_korrigieren zeilenanzahl, 0
                           Eingabefeld_Auswahl_an_Cursor_angleichen
                        Else
                           Eingabefeld_CursorS=1
                           Eingabefeld_CursorZ=znr
                           Eingabefeld_CursorBlink=1
                           Eingabefeld_Auswahl_an_Cursor_angleichen
                        End If
                     End If
                  End If
               End If
            End If
            ;[End Block]
            ;[Block] Text
            Text3D Eingabefeld_schriftart, textx, texty, Mid(z\Text, zeichen, 1), 1
            ;[End Block]
            ;[Block] Auswahl
            If Eingabefeld_Auswahl_vorhanden() And z\Len>0
               If (Eingabefeld_AuswahlAZ<znr And Eingabefeld_AuswahlEZ>znr) Or (Eingabefeld_AuswahlAZ=znr And Eingabefeld_AuswahlEZ>znr And zeichen>=Eingabefeld_AuswahlAS) Or (Eingabefeld_AuswahlAZ<znr And Eingabefeld_AuswahlEZ=znr And zeichen<Eingabefeld_AuswahlES) Or (Eingabefeld_AuswahlAZ=znr And Eingabefeld_AuswahlEZ=znr And zeichen>=Eingabefeld_AuswahlAS And zeichen<Eingabefeld_AuswahlES)
                  ColorN3D (EFSFarbe_Auswahl And $FF0000)/$10000, (EFSFarbe_Auswahl And $FF00)/$100, EFSFarbe_Auswahl And $FF
                  Rect3D Eingabefeld_pixel, textx, texty, zeichenbreite/2, zeichenhoehe/2, 1, 0
                  ColorN3D
               End If
            End If
            ;[End Block]
            ;[Block] Cursor
            If Eingabefeld_CursorZ=znr And (Eingabefeld_CursorS=zeichen+1 Or (Eingabefeld_CursorS=1 And zeichen=1))
               If Eingabefeld_CursorBlink>=1
                  ColorN3D 0, 0, 0
                  If Eingabefeld_CursorS=1 Then Rect3D Eingabefeld_pixel, textx-zeichenbreite/2-1, texty, 1, zeichenhoehe/2, 1, 0 Else Rect3D Eingabefeld_pixel, textx+zeichenbreite/2-1, texty, 1, zeichenhoehe/2, 1, 0
                  ColorN3D
               End If
            End If
            Eingabefeld_lastCursorS=Eingabefeld_CursorS:Eingabefeld_lastCursorZ=Eingabefeld_CursorZ
            ;[End Block]
            .continue_for
         Next
         .continue_foreach
      Next
      ColorT3D
      
      If Eingabefeld_Syntaxhighlighting
         Repeat
            If Eingabefeld_Verarbeitung=Null Then Eingabefeld_Verarbeitung=First EingabefeldZeile
            If Eingabefeld_Verarbeitung\Text_mit_Farbcodes="" Then If Eingabefeld_Verarbeitung\Text<>"" Then Eingabefeld_verarbeite_Zeile Eingabefeld_Verarbeitung, 1
            Eingabefeld_Verarbeitung=After Eingabefeld_Verarbeitung
            sis=sis-1
         Until sis=-1
      End If
      ;[End Block]
   End If
   
   RenderWorld 0
   Clear3D
   
   If eingabe
      Local ms_plus=MilliSecs()-Eingabefeld_lastMillisecs:Eingabefeld_lastMillisecs=MilliSecs()
      Eingabefeld_CursorBlink=Eingabefeld_CursorBlink+Eingabefeld_CursorBlinkgeschwindigkeit*.002*ms_plus
      If Eingabefeld_CursorBlink>=2 Then Eingabefeld_CursorBlink=Eingabefeld_CursorBlink-2
      ;[Block] Tastenabfrage
      Local sckd:For sckd=1 To 237:Eingabefeld_KeyDown(sckd)=(Eingabefeld_KeyDown(sckd)+ms_plus)*KeyDown(sckd):Next
      Local GetKey_=GetKey()
      Select True
            ;[Block] hoch
         Case KeyHit(200) Or Eingabefeld_KeyDown(200)>Eingabefeld_KeyRepeatDelay
            Eingabefeld_KeyDown_CoolDown 200
            Eingabefeld_CursorZ=Eingabefeld_CursorZ-1
            Eingabefeld_Cursorposition_korrigieren zeilenanzahl, 0
            If KeyDown(42) Or KeyDown(54) Then Eingabefeld_Auswahl_an_Cursor_angleichen Else Eingabefeld_Auswahl_aufheben
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            ;[End Block]
            ;[Block] runter
         Case KeyHit(208) Or Eingabefeld_KeyDown(208)>Eingabefeld_KeyRepeatDelay
            Eingabefeld_KeyDown_CoolDown 208
            Eingabefeld_CursorZ=Eingabefeld_CursorZ+1
            Eingabefeld_Cursorposition_korrigieren zeilenanzahl, 0
            If KeyDown(42) Or KeyDown(54) Then Eingabefeld_Auswahl_an_Cursor_angleichen Else Eingabefeld_Auswahl_aufheben
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            ;[End Block]
            ;[Block] links
         Case KeyHit(203) Or Eingabefeld_KeyDown(203)>Eingabefeld_KeyRepeatDelay
            Eingabefeld_KeyDown_CoolDown 203
            Repeat
               Eingabefeld_CursorS=Eingabefeld_CursorS-1
               Eingabefeld_Cursorposition_korrigieren zeilenanzahl, 1
               If Not (KeyDown(29) Or KeyDown(157)) Then Exit
               If Eingabefeld_isTrennzeichen(Eingabefeld_Zeichen(Eingabefeld_CursorS-1, Eingabefeld_CursorZ)) Or Eingabefeld_isTrennzeichen(Eingabefeld_Zeichen(Eingabefeld_CursorS, Eingabefeld_CursorZ)) Then Exit
            Forever
            If KeyDown(42) Or KeyDown(54) Then Eingabefeld_Auswahl_an_Cursor_angleichen Else Eingabefeld_Auswahl_aufheben
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            ;[End Block]
            ;[Block] rechts
         Case KeyHit(205) Or Eingabefeld_KeyDown(205)>Eingabefeld_KeyRepeatDelay
            Eingabefeld_KeyDown_CoolDown 205
            Repeat
               Eingabefeld_CursorS=Eingabefeld_CursorS+1
               Eingabefeld_Cursorposition_korrigieren zeilenanzahl, 1
               If Not (KeyDown(29) Or KeyDown(157)) Then Exit
               If Eingabefeld_isTrennzeichen(Eingabefeld_Zeichen(Eingabefeld_CursorS, Eingabefeld_CursorZ)) Or Eingabefeld_isTrennzeichen(Eingabefeld_Zeichen(Eingabefeld_CursorS-1, Eingabefeld_CursorZ)) Then Exit
            Forever
            If KeyDown(42) Or KeyDown(54) Then Eingabefeld_Auswahl_an_Cursor_angleichen Else Eingabefeld_Auswahl_aufheben
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            ;[End Block]
            ;[Block] Pos1
         Case KeyHit(199)
            If KeyDown(29) Or KeyDown(157) Then Eingabefeld_CursorZ=1
            Eingabefeld_CursorS=1
            If KeyDown(42) Or KeyDown(54) Then Eingabefeld_Auswahl_an_Cursor_angleichen Else Eingabefeld_Auswahl_aufheben
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            ;[End Block]
            ;[Block] Ende
         Case KeyHit(207)
            If KeyDown(29) Or KeyDown(157) Then Eingabefeld_CursorZ=zeilenanzahl
            Eingabefeld_CursorS=Eingabefeld_getZeilenlaenge(Eingabefeld_CursorZ)+1
            If KeyDown(42) Or KeyDown(54) Then Eingabefeld_Auswahl_an_Cursor_angleichen Else Eingabefeld_Auswahl_aufheben
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            ;[End Block]
            ;[Block] Bild auf
         Case KeyHit(201) Or Eingabefeld_KeyDown(202)>Eingabefeld_KeyRepeatDelay
            Eingabefeld_KeyDown_CoolDown 201
            Eingabefeld_CursorZ=Eingabefeld_CursorZ-HoeheZ
            Eingabefeld_Cursorposition_korrigieren zeilenanzahl, 0
            If KeyDown(42) Or KeyDown(54) Then Eingabefeld_Auswahl_an_Cursor_angleichen Else Eingabefeld_Auswahl_aufheben
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            ;[End Block]
            ;[Block] Bild ab
         Case KeyHit(209) Or Eingabefeld_KeyDown(209)>Eingabefeld_KeyRepeatDelay
            Eingabefeld_KeyDown_CoolDown 209
            Eingabefeld_CursorZ=Eingabefeld_CursorZ+HoeheZ
            Eingabefeld_Cursorposition_korrigieren zeilenanzahl, 0
            If KeyDown(42) Or KeyDown(54) Then Eingabefeld_Auswahl_an_Cursor_angleichen Else Eingabefeld_Auswahl_aufheben
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            ;[End Block]
            ;[Block] Strg+A
         Case (KeyDown(29) Or KeyDown(157)) And KeyDown(30)
            If KeyHit(30)
               Local Last_EingabefeldZeile.EingabefeldZeile=Last EingabefeldZeile
               Eingabefeld_AuswahlAS=1
               Eingabefeld_AuswahlAZ=1
               Eingabefeld_AuswahlES=Last_EingabefeldZeile\Len+1
               Eingabefeld_AuswahlEZ=zeilenanzahl
               Eingabefeld_CursorS=Eingabefeld_AuswahlES
               Eingabefeld_CursorZ=Eingabefeld_AuswahlEZ
               Eingabefeld_CursorBlink=1
            End If
            ;[End Block]
            ;[Block] Strg+X / Umschalt+Entf
         Case ((KeyDown(29) Or KeyDown(157)) And KeyDown(45)) Or ((KeyDown(42) Or KeyDown(54)) And KeyDown(211))
            If KeyHit(45) Or KeyHit(211)
               If Eingabefeld_Auswahl_vorhanden()
                  Eingabefeld_Auswahl_kopieren
                  Eingabefeld_Auswahl_loeschen
                  Eingabefeld_CursorBlink=1
                  Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
               End If
            End If
            ;[End Block]
            ;[Block] Strg+C / Strg+Einfg
         Case (KeyDown(29) Or KeyDown(157)) And (KeyDown(46) Or KeyDown(210))
            If KeyHit(46) Or KeyHit(210)
               If Eingabefeld_Auswahl_vorhanden()
                  Eingabefeld_Auswahl_kopieren
                  Eingabefeld_CursorBlink=1
               End If
            End If
            ;[End Block]
            ;[Block] Strg+V / Umschalt+Einfg
         Case ((KeyDown(29) Or KeyDown(157)) And KeyDown(47)) Or ((KeyDown(42) Or KeyDown(54)) And KeyDown(210))
            If KeyHit(47) Or KeyHit(210)
               Eingabefeld_einfuegen
               Eingabefeld_CursorBlink=1
               Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            End If
            ;[End Block]
            ;[Block] Entf
         Case KeyHit(211) Or Eingabefeld_KeyDown(211)>Eingabefeld_KeyRepeatDelay
            Eingabefeld_KeyDown_CoolDown 211
            If Not Eingabefeld_Auswahl_vorhanden()
               Eingabefeld_CursorS=Eingabefeld_CursorS+1
               Eingabefeld_Cursorposition_korrigieren zeilenanzahl, 1
               Eingabefeld_Auswahl_an_Cursor_angleichen
            End If
            Eingabefeld_Auswahl_loeschen
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            ;[End Block]
            ;[Block] R¸cktaste
         Case KeyHit(14) Or Eingabefeld_KeyDown(14)>Eingabefeld_KeyRepeatDelay
            Eingabefeld_KeyDown_CoolDown 14
            If Not Eingabefeld_Auswahl_vorhanden()
               Eingabefeld_CursorS=Eingabefeld_CursorS-1
               Eingabefeld_Cursorposition_korrigieren zeilenanzahl, 1
               Eingabefeld_Auswahl_an_Cursor_angleichen
            End If
            Eingabefeld_Auswahl_loeschen
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            ;[End Block]
            ;[Block] Eingabetaste
         Case KeyDown(28) Or KeyDown(156)
            If Eingabefeld_komplex
               If KeyHit(28) Or KeyHit(156) Or Eingabefeld_KeyDown(28)>Eingabefeld_KeyRepeatDelay Or Eingabefeld_KeyDown(156)>Eingabefeld_KeyRepeatDelay
                  Eingabefeld_KeyDown_CoolDown 28
                  Eingabefeld_KeyDown_CoolDown 156
                  If Eingabefeld_Auswahl_vorhanden() Then Eingabefeld_Auswahl_loeschen
                  Local azeile.EingabefeldZeile=Eingabefeld_getZeile(Eingabefeld_CursorZ)
                  Eingabefeld_addZeile Eingabefeld_getZeile(Eingabefeld_CursorZ+1), Mid(azeile\Text, Eingabefeld_CursorS)
                  Eingabefeld_modifyZeile azeile, Left(azeile\Text, Eingabefeld_CursorS-1)
                  Eingabefeld_CursorZ=Eingabefeld_CursorZ+1
                  Eingabefeld_CursorS=1
                  Eingabefeld_Auswahl_aufheben
                  Eingabefeld_CursorBlink=1
                  Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
               End If
            Else
               If KeyHit(28) Or KeyHit(156) Then Return 1
            End If
            ;[End Block]
            ;[Block] Tab
         Case KeyHit(15) Or Eingabefeld_KeyDown(15)>Eingabefeld_KeyRepeatDelay
            Eingabefeld_KeyDown_CoolDown 15
            If Eingabefeld_Auswahl_vorhanden() Then Eingabefeld_Auswahl_loeschen
            Local tzeile.EingabefeldZeile=Eingabefeld_getZeile(Eingabefeld_CursorZ)
            Eingabefeld_CursorS=Eingabefeld_CursorS+Eingabefeld_modifyZeile(tzeile, Left(tzeile\Text, Eingabefeld_CursorS-1)+Chr(9)+Mid(tzeile\Text, Eingabefeld_CursorS))
            Eingabefeld_Auswahl_aufheben
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            ;[End Block]
            
            ;[Block] ESC
         Case KeyHit(1)
            If Eingabefeld_komplex
               If Eingabefeld_BlitzSys_vorhanden
                  Select DLLMessageBox("Eingabefeld", "ƒnderungen speichern?", MB_TOPMOST+MB_YESNOCANCEL+MB_ICONQUESTION, 0)
                     Case IDYES:   Return 1
                     Case IDNO:   Return 2
                  End Select
               Else
                  Return 1
               End If
            Else
               Return 2
            End If
            ;[End Block]
            
            ;[Block] druckbare Zeichen
         Case GetKey_>=32
            If Eingabefeld_Auswahl_vorhanden() Then Eingabefeld_Auswahl_loeschen
            Local szeile.EingabefeldZeile=Eingabefeld_getZeile(Eingabefeld_CursorZ)
            Local neueszeichen$=Chr(GetKey_)
            If neueszeichen="-" Then If KeyHit(181) Then neueszeichen="/"
            Eingabefeld_modifyZeile szeile, Left(szeile\Text, Eingabefeld_CursorS-1)+neueszeichen+Mid(szeile\Text, Eingabefeld_CursorS)
            Eingabefeld_CursorS=Eingabefeld_CursorS+1
            Eingabefeld_Auswahl_aufheben
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            ;[End Block]
      End Select
      ;[End Block]
      ;[Block] Mausabfrage (Cursor und Auswahl)
      If RectsOverlap(grenze_l, grenze_u, grenze_r-grenze_l, grenze_o-grenze_u, MouseX3D, MouseY3D, 1, 1)
         If maushit
            If KeyDown(42) Or KeyDown(54) Then Eingabefeld_Mausaktion=2 Else Eingabefeld_Mausaktion=1
         ElseIf MouseDown(1)
            If Eingabefeld_Mausaktion=1 Then Eingabefeld_Mausaktion=2
         Else
            Eingabefeld_Mausaktion=0
         End If
      Else
         If Not MouseDown(1) Then Eingabefeld_Mausaktion=0
      End If
      ;[End Block]
   End If
   
   Return 0
End Function


Function Eingabefeld_Scrollbutton_zeichnen(sbx#, sby#, pw#, aktiv, maushit, halbe_y_groesse=0)
   Local r=0
   If halbe_y_groesse Then sby=sby+5*(2*(pw>180)-1)
   If aktiv Then ColorN3D 230, 230, 230 Else ColorN3D 230, 230, 230, .5
   Rect3D Eingabefeld_scrollbutton, sbx, sby, 7, 7-halbe_y_groesse*5, 1, 3
   ColorN3D
   CheckQuad3D sbx-10, sby-10+halbe_y_groesse*5, sbx-10, sby+10-halbe_y_groesse*5, sbx+10, sby+10-halbe_y_groesse*5, sbx+10, sby-10+halbe_y_groesse*5, 1
   If aktiv And MouseOver3D
      Rect3D Eingabefeld_scrollbutton, sbx, sby, 7, 7-halbe_y_groesse*5, 1, 3
      If maushit Then r=1
   End If
   If aktiv Then ColorG3D 0, 0, 0 Else ColorG3D 0, 0, 0, .3
   DrawImage3D Eingabefeld_scrollpfeil, sbx, sby, 0, pw
   ColorG3D
   Return r
End Function


Function Eingabefeld_Scrollbalken_zeichnen(sbx#, sby#, vertikal, max_groesse#, aktiv, Breite#, Hoehe#, zeichenbreite, zeichenhoehe, max_zeilenbreite, zeilenanzahl, grenze_l#, grenze_r#, grenze_o#, grenze_u#)
   If Not aktiv Then Return 0
   Local groesse_x#=7*vertikal+(2*max_groesse*((Breite-20)/(zeichenbreite*(max_zeilenbreite+1))))*(1-vertikal)
   Local groesse_y#=7*(1-vertikal)+(2*max_groesse*((Hoehe-20)/(zeichenhoehe*zeilenanzahl)))*vertikal
   If groesse_x<4 Then groesse_x=4
   If groesse_y<4 Then groesse_y=4
   If vertikal Then Eingabefeld_vertScrollbalkenhoehe=groesse_y Else Eingabefeld_horizScrollbalkenbreite=groesse_x
   Local x#=sbx+(max_groesse-groesse_x)   *   (2*Eingabefeld_ScrollX/Float(zeichenbreite*(max_zeilenbreite+1)-(grenze_r-grenze_l))-1)   *(1-vertikal)
   Local y#=sby+(max_groesse-groesse_y)   *   -(2*Eingabefeld_ScrollY/Float(zeichenhoehe*zeilenanzahl-(grenze_o-grenze_u))-1)         *vertikal
   If x=0 And x=1 Then x=sbx
   If y=0 And y=1 Then y=sby
   ColorN3D 230, 230, 230
   Rect3D Eingabefeld_scrollbutton, x, y, groesse_x, groesse_y, 1, 3
   ColorN3D
   CheckQuad3D x-groesse_x, y-groesse_y, x-groesse_x, y+groesse_y, x+groesse_x, y+groesse_y, x+groesse_x, y-groesse_y, 1
   If MouseOver3D
      Rect3D Eingabefeld_scrollbutton, x, y, groesse_x, groesse_y, 1, 3
      Return 1
   End If
   Return 0
End Function


Function Eingabefeld_Scrollposition_begrenzen(grenze_l#, grenze_r#, grenze_o#, grenze_u#, zeichenbreite, zeichenhoehe, max_zeilenbreite, zeilenanzahl)
   Local zeilennummerbreite=(Eingabefeld_komplex And Eingabefeld_Zeilennummern)*Len(zeilenanzahl)
   If Eingabefeld_ScrollX>zeichenbreite*(max_zeilenbreite+1+zeilennummerbreite)-(grenze_r-grenze_l) Then Eingabefeld_ScrollX=zeichenbreite*(max_zeilenbreite+1+zeilennummerbreite)-(grenze_r-grenze_l)
   If Eingabefeld_ScrollY>zeichenhoehe*(zeilenanzahl)-(grenze_o-grenze_u) Then Eingabefeld_ScrollY=zeichenhoehe*(zeilenanzahl)-(grenze_o-grenze_u)
   If Eingabefeld_ScrollX<0 Then Eingabefeld_ScrollX=0
   If Eingabefeld_ScrollY<0 Then Eingabefeld_ScrollY=0
End Function


Function Eingabefeld_addSyntaxhighlight(txt$, farbcode, typ=EFSTyp_Wort)
   Local n.EingabefeldSyntaxhighlight=New EingabefeldSyntaxhighlight
   n\Text=txt
   n\Farbcode=farbcode
   n\Typ=typ
End Function


Function Eingabefeld_clearSyntaxhighlights()
   Delete Each EingabefeldSyntaxhighlight
End Function


Function Eingabefeld_verarbeite_Zeile(zeile.EingabefeldZeile, gruendlich=0)
   Local ztmp$, tabbreite=0
   zeile\Len=Len(zeile\Text)
   Local zz=1
   While zz<=zeile\Len
      ;[Block] Tabs durch Leerzeichen ersetzen
      If Asc(Mid(zeile\Text, zz, 1))=9
         ztmp=Left(zeile\Text, zz-1)
         tabbreite=Eingabefeld_Tabbreite-((zz-1) Mod Eingabefeld_Tabbreite):If tabbreite=0 Then tabbreite=Eingabefeld_Tabbreite
         ztmp=ztmp+String(" ", tabbreite)
         ztmp=ztmp+Mid(zeile\Text, zz+1)
         zeile\Text=ztmp
      End If
      ;[End Block]
      zz=zz+1
   Wend
   zeile\Len=Len(zeile\Text)
   
   If gruendlich
      If Eingabefeld_komplex
         ;[Block] Syntax-Highlighting
         Local h.EingabefeldSyntaxhighlight, z_a$, asc_z_a, z_l1$, farbe_zeichen_verbleibend=0, ph_str$, htext_len, zeichen, lenplus, normalfarbe, abngz
         Local zeile_pruef$, hText_pruef$, txtnf$
         If Eingabefeld_Syntaxhighlighting_CaseSensitive=1 Then zeile_pruef=zeile\Text Else zeile_pruef=Lower(zeile\Text)
         
         zeile\Text_mit_Farbcodes=zeile\Text
         lenplus=0
         normalfarbe=1
         
         For zeichen=1 To zeile\Len
            z_a=Mid(zeile\Text, zeichen, 1)
            asc_z_a=Asc(z_a)
            If farbe_zeichen_verbleibend>-1 Then farbe_zeichen_verbleibend=farbe_zeichen_verbleibend-1
            If farbe_zeichen_verbleibend=-1 Then farbe_zeichen_verbleibend=0
            If farbe_zeichen_verbleibend=0
               If zeichen>1 Then z_l1=Mid(zeile_pruef, zeichen-1, 1) Else z_l1=""
               For h=Each EingabefeldSyntaxhighlight
                  If Eingabefeld_Syntaxhighlighting_CaseSensitive=1 Then hText_pruef=h\Text Else hText_pruef=Lower(h\Text)
                  htext_len=Len(hText_pruef)
                  ph_str=Mid(zeile_pruef, zeichen, htext_len)
                  If Asc(ph_str)=Asc(hText_pruef)
                     If Eingabefeld_isTrennzeichen(z_l1) Or h\Typ<>EFSTyp_Wort
                        If Eingabefeld_isTrennzeichen(Mid(zeile_pruef, zeichen+htext_len, 1)) Or h\Typ<>EFSTyp_Wort
                           If ph_str=hText_pruef
                              If Eingabefeld_Syntaxhighlighting_CaseSensitive=-1
                                 txtnf=hText_pruef+Mid(zeile\Text_mit_Farbcodes, zeichen+lenplus+htext_len)
                                 zeile\Text=Left(zeile\Text, zeichen-1)+h\Text+Mid(zeile\Text, zeichen+htext_len)
                              Else
                                 txtnf=Mid(zeile\Text_mit_Farbcodes, zeichen+lenplus)
                              End If
                              If h\Farbcode<>-1
                                 zeile\Text_mit_Farbcodes=Left(zeile\Text_mit_Farbcodes, zeichen-1+lenplus)+Chr(8)+h\Farbcode+Chr(8)+txtnf
                                 lenplus=lenplus+Len(h\Farbcode)+2
                                 normalfarbe=0
                                 If h\Typ=EFSTyp_String
                                    abngz=Instr(zeile_pruef, hText_pruef, zeichen+htext_len)
                                    If abngz=0 Then Goto highlighting_beendet Else abngz=abngz-(zeichen+htext_len)
                                    farbe_zeichen_verbleibend=2*htext_len+abngz
                                 ElseIf h\Typ=EFSTyp_Label
                                    abngz=zeichen+htext_len
                                    farbe_zeichen_verbleibend=htext_len
                                    While Not Eingabefeld_isTrennzeichen(Mid(zeile_pruef, abngz, 1))
                                       farbe_zeichen_verbleibend=farbe_zeichen_verbleibend+1
                                       abngz=abngz+1
                                       If abngz=zeile\Len+1 Then Goto highlighting_beendet
                                    Wend
                                 Else
                                    farbe_zeichen_verbleibend=htext_len
                                 End If
                                 If h\Typ=EFSTyp_Kommentar Then Goto highlighting_beendet Else Goto highlight_gefunden
                              End If
                           End If
                        End If
                     End If
                  End If
               Next
               
               If Not normalfarbe
                  zeile\Text_mit_Farbcodes=Left(zeile\Text_mit_Farbcodes, zeichen-1+lenplus)+Chr(8)+EFSFarbe_normal+Chr(8)+Mid(zeile\Text_mit_Farbcodes, zeichen+lenplus)
                  lenplus=lenplus+Len(EFSFarbe_normal)+2
                  normalfarbe=1
               End If
            ElseIf farbe_zeichen_verbleibend<-1
               If asc_z_a=-farbe_zeichen_verbleibend
                  farbe_zeichen_verbleibend=0
                  normalfarbe=0
                  Goto highlight_gefunden
               End If
            End If
            .highlight_gefunden
         Next
         .highlighting_beendet
         ;[End Block]
      End If
   Else
      zeile\Text_mit_Farbcodes=""
   End If
   Return tabbreite   
End Function


Function Eingabefeld_isTrennzeichen(zeichen$)
   If zeichen="" Then Return 1
   Local t:For t=1 To Eingabefeld_Trennzeichenliste_Len
      If zeichen=Mid(Eingabefeld_Trennzeichenliste, t, 1) Then Return 1
   Next
   Return 0
End Function


Function Eingabefeld_Auswahl_an_Cursor_angleichen()
   If Eingabefeld_lastCursorS=Eingabefeld_AuswahlAS And Eingabefeld_lastCursorZ=Eingabefeld_AuswahlAZ
      Eingabefeld_AuswahlAS=Eingabefeld_CursorS
      Eingabefeld_AuswahlAZ=Eingabefeld_CursorZ
   ElseIf Eingabefeld_lastCursorS=Eingabefeld_AuswahlES And Eingabefeld_lastCursorZ=Eingabefeld_AuswahlEZ
      Eingabefeld_AuswahlES=Eingabefeld_CursorS
      Eingabefeld_AuswahlEZ=Eingabefeld_CursorZ
   Else
      Eingabefeld_Auswahl_aufheben
   End If
   If (Eingabefeld_AuswahlAZ=Eingabefeld_AuswahlEZ And Eingabefeld_AuswahlAS>Eingabefeld_AuswahlES) Or (Eingabefeld_AuswahlAZ>Eingabefeld_AuswahlEZ)
      Local ts=Eingabefeld_AuswahlAS, tz=Eingabefeld_AuswahlAZ
      Eingabefeld_AuswahlAS=Eingabefeld_AuswahlES
      Eingabefeld_AuswahlAZ=Eingabefeld_AuswahlEZ
      Eingabefeld_AuswahlES=ts
      Eingabefeld_AuswahlEZ=tz
   End If
End Function


Function Eingabefeld_Auswahl_aufheben()
   Eingabefeld_AuswahlAS=Eingabefeld_CursorS
   Eingabefeld_AuswahlAZ=Eingabefeld_CursorZ
   Eingabefeld_AuswahlES=Eingabefeld_CursorS
   Eingabefeld_AuswahlEZ=Eingabefeld_CursorZ
End Function


Function Eingabefeld_Auswahl_vorhanden()
   If Eingabefeld_AuswahlAS<>Eingabefeld_AuswahlES Then Return 1
   If Eingabefeld_AuswahlAZ<>Eingabefeld_AuswahlEZ Then Return 1
   Return 0
End Function


Function Eingabefeld_Auswahl_loeschen()
   Eingabefeld_CursorS=Eingabefeld_AuswahlAS
   Eingabefeld_CursorZ=Eingabefeld_AuswahlAZ
   Local zeile1.EingabefeldZeile, zeile2.EingabefeldZeile, z2v.EingabefeldZeile
   zeile1=Eingabefeld_getZeile(Eingabefeld_AuswahlAZ)
   zeile2=Eingabefeld_getZeile(Eingabefeld_AuswahlEZ)
   Eingabefeld_modifyZeile zeile1, Left(zeile1\Text, Eingabefeld_AuswahlAS-1)+Mid(zeile2\Text, Eingabefeld_AuswahlES)
   Local r:For r=Eingabefeld_AuswahlEZ To Eingabefeld_AuswahlAZ+1 Step -1:z2v=zeile2:zeile2=Before zeile2 Delete z2v:Next
   Eingabefeld_Auswahl_aufheben
End Function


Function Eingabefeld_Auswahl_kopieren()
   Local zeilec$
   Local zeile1.EingabefeldZeile=Eingabefeld_getZeile(Eingabefeld_AuswahlAZ)
   If Eingabefeld_AuswahlAZ=Eingabefeld_AuswahlEZ
      zeilec=Mid(zeile1\Text, Eingabefeld_AuswahlAS, Eingabefeld_AuswahlES-Eingabefeld_AuswahlAS)
   Else
      Local zeile2.EingabefeldZeile=Eingabefeld_getZeile(Eingabefeld_AuswahlEZ)
      zeilec=Chr(13)+Chr(10)+Left(zeile2\Text, Eingabefeld_AuswahlES-1)
      Local r:For r=Eingabefeld_AuswahlEZ-1 To Eingabefeld_AuswahlAZ+1 Step -1
         zeile2=Before zeile2
         zeilec=Chr(13)+Chr(10)+zeile2\Text+zeilec
      Next
      
      zeilec=Mid(zeile1\Text, Eingabefeld_AuswahlAS)+zeilec
   End If
   If Eingabefeld_BlitzSys_vorhanden Then DLLSetClipboardText zeilec Else Eingabefeld_Clipboard=zeilec
End Function


Function Eingabefeld_einfuegen()
   Local zeilec$
   If Eingabefeld_BlitzSys_vorhanden Then zeilec=Replace(DLLEZGetClipboardText(), Chr(10), "") Else zeilec=Replace(Eingabefeld_Clipboard, Chr(10), "")
   If zeilec="" Then Return
   If Eingabefeld_Auswahl_vorhanden() Then Eingabefeld_Auswahl_loeschen
   Local len_zeilec_a=Len(zeilec)
   Local s.EingabefeldZeile=Eingabefeld_getZeile(Eingabefeld_CursorZ)
   Eingabefeld_Verarbeitung=s
   Local d.EingabefeldZeile=After s
   d=Eingabefeld_addZeile(d, Mid(s\Text, Eingabefeld_CursorS))
   Eingabefeld_modifyZeile s, Left(s\Text, Eingabefeld_CursorS-1)
   Local n0.EingabefeldZeile=Null, n.EingabefeldZeile
   Local len_zeilec=len_zeilec_a, p
   Local umbruch_ende=(Right(zeilec, 1)=Chr(13))
   Local umbruchzaehler=umbruch_ende-1
   Repeat
      For p=1 To len_zeilec+1
         If Mid(zeilec, p, 1)=Chr(13) Or p=len_zeilec+1
            umbruchzaehler=umbruchzaehler+1
            n=Eingabefeld_addZeile(d, Left(zeilec, p-1))
            If n0=Null Then n0=n
            zeilec=Mid(zeilec, p+1)
            Exit
         End If
      Next
      len_zeilec=Len(zeilec)
   Until len_zeilec=0
   If umbruch_ende Then n=Eingabefeld_addZeile(d, "")
   Local ntextlen=Len(n\Text)
   Eingabefeld_modifyZeile n, n\Text+d\Text
   Delete d
   Eingabefeld_modifyZeile s, s\Text+n0\Text
   Delete n0
   
   If umbruchzaehler=0
      Eingabefeld_CursorS=Eingabefeld_CursorS+len_zeilec_a
   Else
      Eingabefeld_CursorZ=Eingabefeld_CursorZ+umbruchzaehler
      Eingabefeld_CursorS=1+ntextlen
   End If
   Local zz=0:For n=Each EingabefeldZeile:zz=zz+1:Next
   Eingabefeld_Cursorposition_korrigieren zz, 1
   Eingabefeld_Auswahl_aufheben
End Function


Function Eingabefeld_Cursorposition_korrigieren(zeilenanzahl, uebertrag)
   If Eingabefeld_CursorS<1
      If uebertrag
         Eingabefeld_CursorZ=Eingabefeld_CursorZ-1
         Eingabefeld_CursorS=Eingabefeld_getZeilenlaenge(Eingabefeld_CursorZ)+1
      Else
         Eingabefeld_CursorS=1
      End If
   ElseIf Eingabefeld_CursorS>Eingabefeld_getZeilenlaenge(Eingabefeld_CursorZ)+1
      If uebertrag
         Eingabefeld_CursorZ=Eingabefeld_CursorZ+1
         Eingabefeld_CursorS=1
      Else
         Eingabefeld_CursorS=Eingabefeld_getZeilenlaenge(Eingabefeld_CursorZ)+1
      End If
   End If
   If Eingabefeld_CursorZ>zeilenanzahl
      Eingabefeld_CursorZ=zeilenanzahl
      Eingabefeld_CursorS=Eingabefeld_getZeilenlaenge(Eingabefeld_CursorZ)+1
   ElseIf Eingabefeld_CursorZ<1
      Eingabefeld_CursorZ=1
      Eingabefeld_CursorS=1
   End If
End Function


Function Eingabefeld_Sichtfeld_an_Cursor_angleichen(grenze_l#, grenze_r#, grenze_o#, grenze_u#, zeichenbreite, zeichenhoehe)
   Local zz.EingabefeldZeile, zeilenanzahl=0, max_zeilenbreite=0
   For zz=Each EingabefeldZeile
      zeilenanzahl=zeilenanzahl+1
      If Len(zz\Text)>max_zeilenbreite Then max_zeilenbreite=Len(zz\Text)
   Next
   Local zeilennummerbreite=(Eingabefeld_komplex And Eingabefeld_Zeilennummern)*Len(zeilenanzahl)
   
   Local grenze_lZ=(Eingabefeld_ScrollX)/zeichenbreite+2
   Local grenze_rZ=(grenze_r-grenze_l+Eingabefeld_ScrollX)/zeichenbreite-1-zeilennummerbreite
   Local grenze_oZ=(Eingabefeld_ScrollY)/zeichenhoehe+2
   Local grenze_uZ=(grenze_o-grenze_u+Eingabefeld_ScrollY)/zeichenhoehe-1
   If grenze_lZ>Eingabefeld_CursorS Then Eingabefeld_ScrollX=Eingabefeld_ScrollX-(grenze_lZ-Eingabefeld_CursorS)*zeichenbreite
   If grenze_rZ<Eingabefeld_CursorS Then Eingabefeld_ScrollX=Eingabefeld_ScrollX-(grenze_rZ-Eingabefeld_CursorS)*zeichenbreite
   If grenze_oZ>Eingabefeld_CursorZ Then Eingabefeld_ScrollY=Eingabefeld_ScrollY-(grenze_oZ-Eingabefeld_CursorZ)*zeichenhoehe
   If grenze_uZ<Eingabefeld_CursorZ Then Eingabefeld_ScrollY=Eingabefeld_ScrollY-(grenze_uZ-Eingabefeld_CursorZ)*zeichenhoehe
   Eingabefeld_Scrollposition_begrenzen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe, max_zeilenbreite, zeilenanzahl
End Function


Function Eingabefeld_Zeichen$(S, Z)
   If S<1 Then Return ""
   Local zeile.EingabefeldZeile=Eingabefeld_getZeile(Z)
   If zeile=Null Then Return "" Else Return Mid(zeile\Text, S, 1)
End Function


Function Eingabefeld_KeyDown_CoolDown(scancode)
   If Eingabefeld_KeyDown(scancode)>Eingabefeld_KeyRepeatDelay Then Eingabefeld_KeyDown(scancode)=Eingabefeld_KeyDown(scancode)-Eingabefeld_KeyRepeatInterval
End Function


Function Eingabefeld_Begrenzung$(BText$, maxBreite#, tschriftart=-1)
   If tschriftart=-1 Then tschriftart=Eingabefeld_schriftart
   Local Breite=StringWidth3D(tschriftart, BText)
   If Breite<=maxBreite Then Return BText
   
   Local maxLaenge=Len(BText)
   Local Schaetzwert=(maxBreite/Breite)*maxLaenge
   
   Local TText$
   If Schaetzwert<0 Then TText="Ö" Else TText=Left(BText, Schaetzwert)+"Ö"
   Breite=StringWidth3D(tschriftart, TText)
   
   Select Sgn(Int(maxBreite-Breite))
      Case 0
         Return TText
      Case 1
         While Schaetzwert<maxLaenge
            Schaetzwert=Schaetzwert+1
            TText=Left(BText, Schaetzwert)+"Ö"
            If StringWidth3D(tschriftart, TText)>maxBreite Then Return Left(BText, Schaetzwert-1)+"Ö"
         Wend
         Return BText
      Case -1
         While Schaetzwert>0
            Schaetzwert=Schaetzwert-1
            TText=Left(BText, Schaetzwert)+"Ö"
            If StringWidth3D(tschriftart, TText)<=maxBreite Then Return TText
         Wend
         Return "Ö"
   End Select
End Function



;~IDEal Editor Parameters:
;~F#106#145#154#18D#19C#1AB#1CA#1D7#1DF#1E5#1F2#1F8#1FD#200#212#22D#248#256#27A#27D
;~F#286#2AC#2B5#2BE#2CB#2D8#2E0#2E8#2F1#2FA#307#312#31B#323#32F#33B#34F#35A#36A#378
;~F#38B#39D#3B4#3BD#3C5#3CA#3CF#3DE#42F#438#44C#454#45B#467#47A#4A8#4C2#4D6#4DD#4E2
;~C#Blitz3D
Blog.

FireballFlame

BeitragMi, Jul 08, 2009 1:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Noch ein kleines Update

Wenn man Programmcode schreibt, kann es nervig sein, wenn bei jedem Zeilenumbruch der Cursor ganz an den Anfang der neue Zeile gesetzt wird. Deshalb habe ich nun eingebaut, dass beim Drücken der Enter-Taste die Einrückung der vorherigen Zeile automatisch übernommen wird. Wer das nicht möchte, kann es auch wieder abstellen, dazu gibt es eine neue globale Variable.

Außerdem habe ich einen Fehler behoben, der darin bestand, dass jedesmal beim Ändern einer Zeile das Syntaxhighlighting ein Frame lang aussetzte und somit beim Schreiben von Text zu unschönem Geflimmer führte. Das passiert nun nicht mehr.

EDIT: noch ein Bugfix
Das Syntaxhighlighting wurde teilweise selbst dann vorgenommen, wenn die entsprechende Variable auf 0 stand; jetzt nicht mehr.

Die Datei im Archiv wurde erneuert (Link im ersten Post).
Auch hier die neue Eingabefeld.bb: Code: [AUSKLAPPEN]







;                             +-------------------------------+                           
;                             | Eingabefeld von FireballFlame |                           
;                             +-------------------------------+                           







; ----- Einstellungen: --------------------------------------------------------------------





Const Eingabefeld_BlitzSys_vorhanden   = 0         ; Kann die blitzsys.dll genutzt werden?
Function DLLMessageBox(m, i, a, u):End Function      ; <-,
Function DLLSetClipboardText(muh):End Function      ; <-+- wenn ja,  diese drei Zeilen auskommentieren
Function DLLEZGetClipboardText():End Function      ; <-'



Const Eingabefeld_Texturpfad$         = "Eingabefeld - Texturen\"

Const Eingabefeld_Schriftart_Datei$      = Eingabefeld_Texturpfad+"Eingabefeld_verdana1_mod.png"   ; Schriftart
Const Eingabefeld_Schriftskalierung#   = 1.1      ; Darstellungsgröße der Zeichen (für SetFont3D)
Global Eingabefeld_Zeichenbreite      = 10      ; <-, _ diese beiden Werte müssen angepasst werden,  wenn die
Global Eingabefeld_Zeichenhoehe         = 18      ; <-'  Schriftskalierung oder die Schriftart geändert wird





Global Eingabefeld_Standardbreite_einfach   = 40      ; Angabe in Zeichen
Global Eingabefeld_Standardbreite_komplex   = 80      ; Angabe in Zeichen
Global Eingabefeld_Standardhoehe_komplex   = 30      ; Angabe in Zeilen


Global Eingabefeld_Animationsdauer_einfach   = 100      ; Angabe in Millisekunden
Global Eingabefeld_Animationsdauer_komplex   = 250      ; Angabe in Millisekunden





Global Eingabefeld_CursorBlinkgeschwindigkeit#   = 1      ; Angabe in Hertz

Global Eingabefeld_KeyRepeatDelay   = 500   ; Zeit in Millisek. bis zum 2. Anschlag bei gedrückt gehaltener Taste
Global Eingabefeld_KeyRepeatInterval= 75   ; Zeit in Millisek. vom n. bis zum (n+1). Anschlag bei gedrückt gehaltener Taste (n>=2)
Global Eingabefeld_DblClickInterval   = 250   ; Zeit in Millisek. zwischen zwei Klicks,  bei denen gerade noch ein Doppelklick erkannt wird




Global Eingabefeld_Tabbreite = 4      ; Größe des maximalen Tabulator-Abstandes in Zeichen
Global Eingabefeld_Einrueckung = 1      ; Einrückung der vorigen Zeile beim Zeilenumbruch übernehmen?




Global Eingabefeld_Zeilennummern = 1   ; Zeilennummern im komplexen Modus?




Global Eingabefeld_Syntaxhighlighting            = 1      ; Syntaxhighlighting (im komplexen Modus)?

Global Eingabefeld_Syntaxhighlighting_CaseSensitive   = -1
         ;  1=Syntaxhighlights werden nur bei korrekter Groß-/Kleinschreibung erkannt
         ;  0=Syntaxhighlights werden bei jeder Schreibweise erkannt
         ; -1=Syntaxhighlights werden bei jeder Schreibweise erkannt und die Groß-/Kleinschreibung wird automatisch korrigiert

Const EFSFarbe_normal         =$10000*0   +$100*0      +0      ; Farbcodes nach dem Muster $10000*R +$100*G +B
Const EFSFarbe_Datentyp         =$10000*130   +$100*50   +170
Const EFSFarbe_Schluesselwort   =$10000*0   +$100*40   +120
Const EFSFarbe_MathFunktion      =$10000*70   +$100*120   +150
Const EFSFarbe_Funktion         =$10000*80   +$100*40   +0
Const EFSFarbe_Operator         =$10000*70   +$100*70   +70
Const EFSFarbe_Relation         =$10000*70   +$100*70   +70
Const EFSFarbe_Klammer         =$10000*70   +$100*70   +70
Const EFSFarbe_Sprungmarke      =$10000*230   +$100*70   +70
Const EFSFarbe_String         =$10000*50   +$100*180   +0
Const EFSFarbe_Kommentar      =$10000*170   +$100*170   +0
Const EFSFarbe_keine         = -1   ; keine Farbveränderung,  nur Groß-/Kleinschreibkorrektur
Const EFSFarbe_Zeilennummer      =$10000*180   +$100*180   +180
Const EFSFarbe_Auswahl         =$10000*233   +$100*233   +100

Const EFSTyp_Wort      = 1   ; "highlighted" den gesuchten String; aber nur,  wenn er zwischen Trennzeichen steht
Const EFSTyp_Wortteil   = 2   ; "highlighted" den gesuchten String überall,  wo er gefunden wird
Const EFSTyp_Kommentar   = 3   ; "highlighted" alles vom gesuchten String bis zum Zeilenende
Const EFSTyp_String      = 4   ; "highlighted" alles bis einschließlich zum nächsten Auftauchen des gesuchten Strings (oder Zeilenende)
Const EFSTyp_Label      = 5   ; "highlighted" alles bis zum nächsten Trennzeichen

Global Eingabefeld_Trennzeichenliste$=":., ; +-*/%=!<>()\~^"+Chr(34)


Function Eingabefeld_setSyntaxhighlights()   ; Deklaration aller Syntaxhighlights - diese Funktion wird automatisch bei jedem
                                 ; Öffnen eines komplexen Eingabefeldes durchlaufen und kann auch jederzeit manuell
                                 ; aufgerufen werden; somit werden dynamische Syntaxhighlights ermöglicht: z.B.
                                 ; könnte man,  für das Schreiben von Skripten oder Quellcode,  eine Suche nach
                                 ; Variablendeklarationen in die Funktion Eingabefeld_verarbeite_Zeile einbauen,
                                 ; alle gefundenen Variablen in einem Type speichern,  und dann mit dieser Funktion
                                 ; alle Einträge des Types als Syntaxhighlights deklarieren...
   
   Eingabefeld_clearSyntaxhighlights
   
   
   
   ; ich habe hier zu Demonstrationszwecken mal einige BlitzBasic-Code-kompatible Highlights eingetragen:
   
   ; Programmablaufkontrolle
   Eingabefeld_addSyntaxhighlight "If"         , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Then"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Else"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "EndIf"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Select"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Case"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Default"   , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "While"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Wend"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Repeat"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Until"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Forever"   , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "For"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "To"         , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Step"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Each"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Next"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Exit"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight ". "         , EFSFarbe_Sprungmarke,    EFSTyp_Label
   Eingabefeld_addSyntaxhighlight "Goto"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Function"   , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Return"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Delay"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "End"      , EFSFarbe_Schluesselwort
   
   ; Datentypen
   Eingabefeld_addSyntaxhighlight "%"      , EFSFarbe_Datentyp,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight "#"      , EFSFarbe_Datentyp,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight "$"      , EFSFarbe_Datentyp,       EFSTyp_Wortteil
   
   ; Variablendeklarationen
   Eingabefeld_addSyntaxhighlight "Global"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Const"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Local"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Type"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Field"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "New"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Delete"      , EFSFarbe_Schluesselwort
   
   ; globale Konstanten
   Eingabefeld_addSyntaxhighlight "True"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "False"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Null"      , EFSFarbe_Schluesselwort
   
   ; Bitoperatoren
   Eingabefeld_addSyntaxhighlight "Not"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "And"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Or"         , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Xor"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Shr"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Sar"      , EFSFarbe_Schluesselwort
   Eingabefeld_addSyntaxhighlight "Shl"      , EFSFarbe_Schluesselwort
   
   ; mathematische Funktionen
   Eingabefeld_addSyntaxhighlight "Mod"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Int"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Float"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Ceil"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Floor"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Abs"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Sgn"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Sqr"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Exp"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Log"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Log10"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Sin"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Cos"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "Tan"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "ASin"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "ACos"      , EFSFarbe_MathFunktion
   Eingabefeld_addSyntaxhighlight "ATan"      , EFSFarbe_MathFunktion
   
   ; andere Funktionen
   Eingabefeld_addSyntaxhighlight "Graphics"            , EFSFarbe_Funktion
   Eingabefeld_addSyntaxhighlight "SetBuffer"            , EFSFarbe_Funktion
   Eingabefeld_addSyntaxhighlight "BackBuffer"            , EFSFarbe_Funktion
   Eingabefeld_addSyntaxhighlight "Cls"               , EFSFarbe_Funktion
   Eingabefeld_addSyntaxhighlight "Print"               , EFSFarbe_Funktion
   Eingabefeld_addSyntaxhighlight "LoadImage"            , EFSFarbe_Funktion
   Eingabefeld_addSyntaxhighlight "DrawImage"            , EFSFarbe_Funktion
   Eingabefeld_addSyntaxhighlight "Flip"               , EFSFarbe_Funktion
   Eingabefeld_addSyntaxhighlight "WaitKey"            , EFSFarbe_Funktion
   
   ; sonstiges
   Eingabefeld_addSyntaxhighlight "+"      , EFSFarbe_Operator,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight "-"      , EFSFarbe_Operator,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight "*"      , EFSFarbe_Operator,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight "/"      , EFSFarbe_Operator,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight "^"      , EFSFarbe_Operator,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight "="      , EFSFarbe_Relation,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight ">"      , EFSFarbe_Relation,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight "<"      , EFSFarbe_Relation,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight "("      , EFSFarbe_Klammer,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight ")"      , EFSFarbe_Klammer,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight "\"      , EFSFarbe_Operator,       EFSTyp_Wortteil
   Eingabefeld_addSyntaxhighlight Chr(34)   , EFSFarbe_String,       EFSTyp_String
   Eingabefeld_addSyntaxhighlight ";"      , EFSFarbe_Kommentar,    EFSTyp_Kommentar
End Function















Function DrawCursor()
   ; wenn HidePointer angewandt wurde oder das Programm im Vollbildmodus läuft,  muss in dieser
   ; Funktion der Mauszeiger gezeichnet werden (ob mit DrawImage oder DrawImage3D ist egal)
End Function





; -----------------------------------------------------------------------------------------






















;[Block] interne Variablen
Global Eingabefeld_hgpixel
Global Eingabefeld_hgpanel
Global Eingabefeld_feldtex
Global Eingabefeld_scrollbutton
Global Eingabefeld_scrollpfeil
Global Eingabefeld_pixel
Global Eingabefeld_schriftart
Global Eingabefeld_screencap


Global Eingabefeld_Timer=CreateTimer(60)
Global Eingabefeld_Trennzeichenliste_Len
Global Eingabefeld_ScrollX#, Eingabefeld_ScrollY#
Global Eingabefeld_ScrollMaus=0   ; für das Verschieben das Scrollbalkens mit der Maus; 1=horizontal, 2=vertikal
Global Eingabefeld_horizScrollbalkenbreite#, Eingabefeld_vertScrollbalkenhoehe#
Type EingabefeldZeile
   Field Text$
   Field Len
   Field Text_mit_Farbcodes$
End Type
Global Eingabefeld_CursorS, Eingabefeld_CursorZ      ; Spalte und Zeile,  Beginn bei 1
Global Eingabefeld_lastCursorS, Eingabefeld_lastCursorZ
Global Eingabefeld_AuswahlAS, Eingabefeld_AuswahlAZ   ; Startpunkt der Markierung; 0=keine Markierung
Global Eingabefeld_AuswahlES, Eingabefeld_AuswahlEZ   ; Endpunkt der Markierung; 0=keine Markierung
Global Eingabefeld_CursorBlink#      ; >=0 und <2,  bei >=1 ist der Cursor sichtbar
Global Eingabefeld_Mausaktion
Global Eingabefeld_lastMillisecs
Global Eingabefeld_lastMouseHitMillisecs
Global Eingabefeld_komplex
Global Eingabefeld_Clipboard$=""
Global Eingabefeld_Verarbeitung.EingabefeldZeile
Dim Eingabefeld_KeyDown(237)   ; speichert in Millisekunden,  wie lange die Taste schon gedrückt gehalten wurde
Type EingabefeldSyntaxhighlight
   Field Text$
   Field Farbcode
   Field Typ
End Type
;[End Block]

























Function Eingabefeld$(Titel$, Standardtext$="", Modus=0, PosX#=0, PosY#=0, BreiteZ=-1, HoeheZ=-1, StartposX#=-9999929, StartposY#=-9999929)
   If StartposX=-9999929 Then StartposX=MouseX3D
   If StartposY=-9999929 Then StartposY=MouseY3D
   Eingabefeld_komplex=Modus
   
   Eingabefeld_Auswahl_aufheben
   Eingabefeld_CursorS=1:Eingabefeld_CursorZ=1
   Eingabefeld_Trennzeichenliste_Len=Len(Eingabefeld_Trennzeichenliste)
   
   If Eingabefeld_komplex
      Eingabefeld_setSyntaxhighlights
      
      If First EingabefeldZeile=Null Then Eingabefeld_addZeile Null, ""
      Local uz.EingabefeldZeile:For uz=Each EingabefeldZeile:Eingabefeld_verarbeite_Zeile uz:Next
      
      ;[Block] Cursor ins Textfeld setzen,  falls außerhalb
      Local s_z_anz_z.EingabefeldZeile=First EingabefeldZeile, s_z_anz=0
      While s_z_anz_z<>Null
         s_z_anz=s_z_anz+1
         s_z_anz_z=After s_z_anz_z
      Wend
      If Eingabefeld_CursorZ>s_z_anz Then Eingabefeld_CursorZ=s_z_anz
      If Eingabefeld_CursorZ<1 Then Eingabefeld_CursorZ=1
      If Eingabefeld_CursorS>Eingabefeld_getZeilenlaenge(Eingabefeld_CursorZ)+1 Then Eingabefeld_CursorS=Eingabefeld_getZeilenlaenge(Eingabefeld_CursorZ)+1
      If Eingabefeld_CursorS<1 Then Eingabefeld_CursorS=1
      If Eingabefeld_AuswahlAS=0 And Eingabefeld_AuswahlAZ=0 And Eingabefeld_AuswahlES=0 And Eingabefeld_AuswahlEZ=0 Then Eingabefeld_Auswahl_aufheben
      ;[End Block]
      
      If BreiteZ=-1 Then BreiteZ=Eingabefeld_Standardbreite_komplex
      If HoeheZ=-1 Then HoeheZ=Eingabefeld_Standardhoehe_komplex
   Else
      Eingabefeld_clearSyntaxhighlights
      Eingabefeld_clear
      Eingabefeld_addZeile Null, Standardtext
      Eingabefeld_AuswahlAS=1
      Eingabefeld_AuswahlAZ=1
      Eingabefeld_AuswahlES=Len(Standardtext)+1
      Eingabefeld_AuswahlEZ=1
      Eingabefeld_CursorS=Eingabefeld_AuswahlES
      Eingabefeld_CursorZ=Eingabefeld_AuswahlEZ
      If BreiteZ=-1 Then BreiteZ=Eingabefeld_Standardbreite_einfach
      HoeheZ=1
   End If
   
   
   
   
   Local zeichenbreite=Eingabefeld_Zeichenbreite
   Local zeichenhoehe=Eingabefeld_Zeichenhoehe
   Local Breite#=((BreiteZ+1)*zeichenbreite)/2
   Local Hoehe#=(HoeheZ*zeichenhoehe)/2
   Local grenze_l#=PosX-Breite
   Local grenze_r#=PosX+Breite
   Local grenze_o#=PosY+Hoehe
   Local grenze_u#=PosY-Hoehe
   
   Local zeilenanzahl, max_zeilenbreite, z.EingabefeldZeile
   Local maushit_
   Eingabefeld_ScrollX=0:Eingabefeld_ScrollY=0
   Eingabefeld_ScrollMaus=0
   Eingabefeld_CursorBlink=1
   Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
   Eingabefeld_Verarbeitung=Null
   
   
   
   
   
   CopyRect 0, 0, GraphicsWidth(), GraphicsHeight(), 0, 0, BackBuffer(), ImageBuffer(Eingabefeld_screencap)
   FlushKeys : FlushMouse
   
   Local b_dauer:If Eingabefeld_komplex Then b_dauer=Eingabefeld_Animationsdauer_komplex Else b_dauer=Eingabefeld_Animationsdauer_einfach
   ;[Block] Textbox einblenden
   Local b_zeitpunkt#
   If b_dauer>0
      Local b_startzeit=MilliSecs()
      Repeat
         b_zeitpunkt=1-(b_startzeit+b_dauer-MilliSecs())/Float(b_dauer)
         If b_zeitpunkt>1 Then b_zeitpunkt=1
         Eingabefeld_zeichnen(Titel, PosX, PosY, Breite, Hoehe, BreiteZ, HoeheZ, StartposX, StartposY, Eingabefeld_screencap, b_zeitpunkt, grenze_l#, grenze_r#, grenze_o#, grenze_u#, zeichenbreite, zeichenhoehe, max_zeilenbreite, zeilenanzahl, 0, 0)
         DrawCursor
         Flip
      Until b_zeitpunkt=1
   End If
   b_zeitpunkt=1
   ;[End Block]
   
   ;[Block] Textbox ist geöffnet
   Local tbreturn
   Repeat
      maushit_=MouseHit(1)
      zeilenanzahl=0:max_zeilenbreite=0
      For z=Each EingabefeldZeile
         zeilenanzahl=zeilenanzahl+1
         If Len(z\Text)>max_zeilenbreite Then max_zeilenbreite=Len(z\Text)
      Next
      tbreturn=Eingabefeld_zeichnen(Titel, PosX, PosY, Breite, Hoehe, BreiteZ, HoeheZ, StartposX, StartposY, Eingabefeld_screencap, 1, grenze_l#, grenze_r#, grenze_o#, grenze_u#, zeichenbreite, zeichenhoehe, max_zeilenbreite, zeilenanzahl, maushit_, 1)
      DrawCursor
      Flip
   Until tbreturn
   ;[End Block]
   
   ;[Block] Textbox ausblenden
   If b_dauer>0
      b_startzeit=MilliSecs()
      Repeat
         b_zeitpunkt=(b_startzeit+b_dauer-MilliSecs())/Float(b_dauer)
         If b_zeitpunkt<0 Then b_zeitpunkt=0
         Eingabefeld_zeichnen(Titel, PosX, PosY, Breite, Hoehe, BreiteZ, HoeheZ, StartposX, StartposY, Eingabefeld_screencap, b_zeitpunkt, grenze_l#, grenze_r#, grenze_o#, grenze_u#, zeichenbreite, zeichenhoehe, max_zeilenbreite, zeilenanzahl, 0, 0)
         DrawCursor
         Flip
      Until b_zeitpunkt=0
   End If
   b_zeitpunkt=0
   ;[End Block]
   
   Eingabefeld_AuswahlAS=0:Eingabefeld_AuswahlAZ=0:Eingabefeld_AuswahlES=0:Eingabefeld_AuswahlEZ=0
   Clear3D
   FlushKeys : FlushMouse
   If Eingabefeld_komplex
      Return (tbreturn=1)
   Else
      If tbreturn=1
         Local rzeile.EingabefeldZeile=First EingabefeldZeile
         Return rzeile\Text
      Else
         Return Standardtext
      End If
      Eingabefeld_clear
   End If
End Function


Function Eingabefeld_Texturen_laden()
   Eingabefeld_hgpixel      = LoadImage3D(Eingabefeld_Texturpfad+"Eingabefeld_pixel.png")
   Eingabefeld_hgpanel      = LoadImage3D(Eingabefeld_Texturpfad+"Eingabefeld_panel.png")
   Eingabefeld_feldtex      = LoadImage3D(Eingabefeld_Texturpfad+"Eingabefeld_textfeld.png")
   Local Eingabefeld_stex   = LoadImage3D(Eingabefeld_Texturpfad+"Eingabefeld_textfeld_scroll.png")
   Eingabefeld_scrollbutton= GrabImage3D(Eingabefeld_stex, 0, 0, 26, 26)
   Eingabefeld_scrollpfeil   = GrabImage3D(Eingabefeld_stex, 27, 23, 5, 9)
   Eingabefeld_pixel      = LoadImage3D(Eingabefeld_Texturpfad+"Eingabefeld_pixel.png")
   Eingabefeld_schriftart   = LoadFont3D(Eingabefeld_Schriftart_Datei)
   Eingabefeld_screencap   = CreateImage(GraphicsWidth(), GraphicsHeight())
End Function


Function Eingabefeld_addZeile.EingabefeldZeile(nachfolgerzeile.EingabefeldZeile, z_text$)
   Local z.EingabefeldZeile=New EingabefeldZeile
   If nachfolgerzeile.EingabefeldZeile<>Null Then Insert z Before nachfolgerzeile
   Eingabefeld_modifyZeile z, z_text
   Return z
End Function


Function Eingabefeld_modifyZeile(zeile.EingabefeldZeile, neuer_text$)
   zeile\Text=neuer_text
   Return Eingabefeld_verarbeite_Zeile(zeile)
End Function


Function Eingabefeld_getZeile.EingabefeldZeile(zeilennr)
   If zeilennr<1 Then Return Null
   Local zeile.EingabefeldZeile=First EingabefeldZeile
   
   Local znr
   For znr=1 To zeilennr-1
      If zeile=Null Then Return Null
      zeile=After zeile
   Next
   Return zeile
End Function


Function Eingabefeld_getZeilenlaenge(zeilennr)
   Local zeile.EingabefeldZeile=Eingabefeld_getZeile(zeilennr)
   If zeile=Null Then Return 0 Else Return zeile\Len
End Function


Function Eingabefeld_clear()
   Delete Each EingabefeldZeile
End Function


Function Eingabefeld_zeichnen(Titel$, PosX#, PosY#, Breite#, Hoehe#, BreiteZ, HoeheZ, StartposX#, StartposY#, bg, zeitpunkt#, grenze_l#, grenze_r#, grenze_o#, grenze_u#, zeichenbreite, zeichenhoehe, max_zeilenbreite, zeilenanzahl, maushit, eingabe)
   WaitTimer(Eingabefeld_Timer)
   
   ;[Block] Box mit Beschriftung
   DrawBlock bg, 0, 0
   ColorN3D 0, 0, 0, zeitpunkt*.35
   Rect3D Eingabefeld_hgpixel, 0, 0, 1000, 1000, 1, 0
   ColorN3D 230, 230, 230, zeitpunkt
   Rect3D Eingabefeld_hgpanel, zeitpunkt*(PosX+10)+(1-zeitpunkt)*StartposX, zeitpunkt*(PosY+12-10)+(1-zeitpunkt)*StartposY, zeitpunkt*(Breite+3+10), zeitpunkt*(Hoehe+15+10), 1, 3*zeitpunkt
   ColorN3D 255, 255, 255, zeitpunkt
   Rect3D Eingabefeld_feldtex, zeitpunkt*PosX+(1-zeitpunkt)*StartposX, zeitpunkt*PosY+(1-zeitpunkt)*StartposY, zeitpunkt*Breite, zeitpunkt*Hoehe, 1, 3*zeitpunkt
   ColorN3D
   SetFont3D 1.1, 1.25
   ColorT3D 0, 0, 0
   Text3D Eingabefeld_schriftart, zeitpunkt*(PosX-Breite+4)+(1-zeitpunkt)*StartposX, zeitpunkt*(PosY+Hoehe+16)+(1-zeitpunkt)*StartposY, Eingabefeld_Begrenzung(Titel, (2*Breite-8)*zeitpunkt)
   ;[End Block]
   
   If zeitpunkt>.99
      Local zeilennummerbreite=(Eingabefeld_komplex And Eingabefeld_Zeilennummern)*Len(zeilenanzahl)
      BreiteZ=BreiteZ-zeilennummerbreite
      If KeyHit(221) Then Eingabefeld_Zeilennummern=1-Eingabefeld_Zeilennummern
      ;[Block] Scrollbalken
      Local sba1=Breite-18
      If Eingabefeld_Scrollbalken_zeichnen(PosX, PosY-Hoehe-13, 0, sba1, (max_zeilenbreite>BreiteZ), Breite, Hoehe, zeichenbreite, zeichenhoehe, max_zeilenbreite+zeilennummerbreite, zeilenanzahl, grenze_l, grenze_r, grenze_o, grenze_u)
         If maushit Then Eingabefeld_ScrollMaus=1
      End If
      Local sba2=Hoehe-18
      If Eingabefeld_Scrollbalken_zeichnen(PosX+Breite+13, PosY, 1, sba2, (Eingabefeld_komplex And zeilenanzahl>HoeheZ), Breite, Hoehe, zeichenbreite, zeichenhoehe, max_zeilenbreite+zeilennummerbreite, zeilenanzahl, grenze_l, grenze_r, grenze_o, grenze_u)
         If maushit Then Eingabefeld_ScrollMaus=2
      End If
      If Not MouseDown(1) Then Eingabefeld_ScrollMaus=0
      If Eingabefeld_ScrollMaus=1 Then Eingabefeld_ScrollX=(.5*(((MouseX3D-PosX)-Eingabefeld_horizScrollbalkenbreite)/1024.*(GraphicsWidth()/Float(sba1)))+.5)*(max_zeilenbreite*zeichenbreite)
      If Eingabefeld_ScrollMaus=2 Then Eingabefeld_ScrollY=(.5*((-(MouseY3D-PosY)-Eingabefeld_vertScrollbalkenhoehe)/768.*(GraphicsHeight()/Float(sba2)))+.5)*(zeilenanzahl*zeichenhoehe)
      
      If Eingabefeld_Scrollbutton_zeichnen(PosX-Breite+7, PosY-Hoehe-13, 180, (max_zeilenbreite>BreiteZ), MouseDown(1)) Then Eingabefeld_ScrollX=Eingabefeld_ScrollX-zeichenbreite:Delay 100
      If Eingabefeld_Scrollbutton_zeichnen(PosX+Breite-7, PosY-Hoehe-13, 0, (max_zeilenbreite>BreiteZ), MouseDown(1)) Then Eingabefeld_ScrollX=Eingabefeld_ScrollX+zeichenbreite:Delay 100
      If Eingabefeld_Scrollbutton_zeichnen(PosX+Breite+13, PosY+Hoehe-7, 270, Eingabefeld_komplex*(zeilenanzahl>HoeheZ), MouseDown(1), (HoeheZ<=1)) Then Eingabefeld_ScrollY=Eingabefeld_ScrollY-zeichenhoehe:Delay 100
      If Eingabefeld_Scrollbutton_zeichnen(PosX+Breite+13, PosY-Hoehe+7, 90, Eingabefeld_komplex*(zeilenanzahl>HoeheZ), MouseDown(1), (HoeheZ<=1)) Then Eingabefeld_ScrollY=Eingabefeld_ScrollY+zeichenhoehe:Delay 100
      
      If (HoeheZ>1); And RectsOverlap(grenze_l, grenze_u, grenze_r-grenze_l, grenze_o-grenze_u, MouseX3D, MouseY3D, 1, 1)
         If KeyDown(42) Or KeyDown(54) Then Eingabefeld_ScrollX=Eingabefeld_ScrollX-3*zeichenbreite*MouseZSpeed() Else Eingabefeld_ScrollY=Eingabefeld_ScrollY-zeichenhoehe*MouseZSpeed()
      Else
         MouseZSpeed()
      End If
      
      Eingabefeld_Scrollposition_begrenzen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe, max_zeilenbreite, zeilenanzahl
      ;[End Block]
      
      ;[Block] Text
      SetFont3D Eingabefeld_Schriftskalierung
      Local z.EingabefeldZeile, znr=0, zeichen, textx#, texty#, farbe_zeichen_verbleibend, lenplus, fcspos, fcepos, fc, ise, sis=0
      If First EingabefeldZeile=Null Then Eingabefeld_addZeile Null, ""
      
      For z=Each EingabefeldZeile
         znr=znr+1
         texty=Eingabefeld_ScrollY+PosY+Hoehe+9-zeichenhoehe*znr
         If texty+7>grenze_o Then Goto continue_foreach
         If texty-7<grenze_u Then Exit
         
         If sis=0 Then If z\Text_mit_Farbcodes="" Then If z\Text<>"" Then Eingabefeld_Verarbeitung=z:sis=2
         lenplus=0
         farbe_zeichen_verbleibend=0
         ise=z\Len+(z\Len=0)
         
         For zeichen=1 To ise
            textx=-Eingabefeld_ScrollX+PosX-Breite+zeichenbreite*(zeichen+zeilennummerbreite)
            
            If zeichen=1
               If Eingabefeld_komplex And Eingabefeld_Zeilennummern
                  ColorT3D (EFSFarbe_Zeilennummer And $FF0000)/$10000, (EFSFarbe_Zeilennummer And $FF00)/$100, EFSFarbe_Zeilennummer And $FF
                  Text3D Eingabefeld_schriftart, PosX-Breite+zeichenbreite*zeilennummerbreite, texty, znr, 2
               End If
               ColorT3D (EFSFarbe_normal And $FF0000)/$10000, (EFSFarbe_normal And $FF00)/$100, EFSFarbe_normal And $FF
            End If
            
            ;[Block] Farben
            Repeat
               fcspos=zeichen+lenplus+1
               If Not Mid(z\Text_mit_Farbcodes, fcspos-1, 1)=Chr(8) Then Exit
               fcepos=Instr(z\Text_mit_Farbcodes, Chr(8), fcspos)
               fc=Mid(z\Text_mit_Farbcodes, fcspos, fcepos-fcspos)
               ColorT3D (fc And $FF0000)/$10000, (fc And $FF00)/$100, fc And $FF
               lenplus=lenplus+(fcepos-fcspos)+2
            Forever
            ;[End Block]
            
            If textx-5<grenze_l+zeilennummerbreite*zeichenbreite Then Goto continue_for
            If textx+5>grenze_r Then Exit
            
            ;[Block] Mausaktion
            If Eingabefeld_Mausaktion
               If MouseY3D>texty-zeichenhoehe/2-1 And MouseY3D<texty+zeichenhoehe/2+1
                  If MouseX3D>textx-zeichenbreite-1 And MouseX3D<textx+1
                     Eingabefeld_CursorS=zeichen
                     Eingabefeld_CursorZ=znr
                     Eingabefeld_CursorBlink=1
                     If Eingabefeld_Mausaktion=1 Then Eingabefeld_Auswahl_aufheben Else Eingabefeld_Auswahl_an_Cursor_angleichen
                  ElseIf zeichen=ise
                     If MouseX3D>textx-1
                        Eingabefeld_CursorS=zeichen+(z\Len>0)
                        Eingabefeld_CursorZ=znr
                        Eingabefeld_CursorBlink=1
                        If Eingabefeld_Mausaktion=1 Then Eingabefeld_Auswahl_aufheben Else Eingabefeld_Auswahl_an_Cursor_angleichen
                     End If
                  ElseIf zeichen=1
                     If MouseX3D<textx+1
                        If Eingabefeld_Mausaktion=1
                           Eingabefeld_Auswahl_aufheben
                           Eingabefeld_lastCursorS=1
                           Eingabefeld_lastCursorZ=znr
                           Eingabefeld_CursorS=1
                           Eingabefeld_CursorZ=znr+1
                           Eingabefeld_Cursorposition_korrigieren zeilenanzahl, 0
                           Eingabefeld_Auswahl_an_Cursor_angleichen
                        Else
                           Eingabefeld_CursorS=1
                           Eingabefeld_CursorZ=znr
                           Eingabefeld_CursorBlink=1
                           Eingabefeld_Auswahl_an_Cursor_angleichen
                        End If
                     End If
                  End If
               End If
            End If
            ;[End Block]
            ;[Block] Text
            Text3D Eingabefeld_schriftart, textx, texty, Mid(z\Text, zeichen, 1), 1
            ;[End Block]
            ;[Block] Auswahl
            If Eingabefeld_Auswahl_vorhanden() And z\Len>0
               If (Eingabefeld_AuswahlAZ<znr And Eingabefeld_AuswahlEZ>znr) Or (Eingabefeld_AuswahlAZ=znr And Eingabefeld_AuswahlEZ>znr And zeichen>=Eingabefeld_AuswahlAS) Or (Eingabefeld_AuswahlAZ<znr And Eingabefeld_AuswahlEZ=znr And zeichen<Eingabefeld_AuswahlES) Or (Eingabefeld_AuswahlAZ=znr And Eingabefeld_AuswahlEZ=znr And zeichen>=Eingabefeld_AuswahlAS And zeichen<Eingabefeld_AuswahlES)
                  ColorN3D (EFSFarbe_Auswahl And $FF0000)/$10000, (EFSFarbe_Auswahl And $FF00)/$100, EFSFarbe_Auswahl And $FF
                  Rect3D Eingabefeld_pixel, textx, texty, zeichenbreite/2, zeichenhoehe/2, 1, 0
                  ColorN3D
               End If
            End If
            ;[End Block]
            ;[Block] Cursor
            If Eingabefeld_CursorZ=znr And (Eingabefeld_CursorS=zeichen+1 Or (Eingabefeld_CursorS=1 And zeichen=1))
               If Eingabefeld_CursorBlink>=1
                  ColorN3D 0, 0, 0
                  If Eingabefeld_CursorS=1 Then Rect3D Eingabefeld_pixel, textx-zeichenbreite/2-1, texty, 1, zeichenhoehe/2, 1, 0 Else Rect3D Eingabefeld_pixel, textx+zeichenbreite/2-1, texty, 1, zeichenhoehe/2, 1, 0
                  ColorN3D
               End If
            End If
            Eingabefeld_lastCursorS=Eingabefeld_CursorS:Eingabefeld_lastCursorZ=Eingabefeld_CursorZ
            ;[End Block]
            .continue_for
         Next
         .continue_foreach
      Next
      ColorT3D
      
      Repeat
         If Eingabefeld_Verarbeitung=Null Then Eingabefeld_Verarbeitung=First EingabefeldZeile
         If Eingabefeld_Verarbeitung\Text_mit_Farbcodes="" Then If Eingabefeld_Verarbeitung\Text<>"" Then Eingabefeld_verarbeite_Zeile Eingabefeld_Verarbeitung, 1
         Eingabefeld_Verarbeitung=After Eingabefeld_Verarbeitung
         sis=sis-1
      Until sis=-1
      ;[End Block]
   End If
   
   RenderWorld 0
   Clear3D
   
   If eingabe
      Local ms_plus=MilliSecs()-Eingabefeld_lastMillisecs:Eingabefeld_lastMillisecs=MilliSecs()
      Eingabefeld_CursorBlink=Eingabefeld_CursorBlink+Eingabefeld_CursorBlinkgeschwindigkeit*.002*ms_plus
      If Eingabefeld_CursorBlink>=2 Then Eingabefeld_CursorBlink=Eingabefeld_CursorBlink-2
      ;[Block] Tastenabfrage
      Local sckd:For sckd=1 To 237:Eingabefeld_KeyDown(sckd)=(Eingabefeld_KeyDown(sckd)+ms_plus)*KeyDown(sckd):Next
      Local GetKey_=GetKey()
      Local veraenderung=0
      Select True
            ;[Block] hoch
         Case KeyHit(200) Or Eingabefeld_KeyDown(200)>Eingabefeld_KeyRepeatDelay
            Eingabefeld_KeyDown_CoolDown 200
            Eingabefeld_CursorZ=Eingabefeld_CursorZ-1
            Eingabefeld_Cursorposition_korrigieren zeilenanzahl, 0
            If KeyDown(42) Or KeyDown(54) Then Eingabefeld_Auswahl_an_Cursor_angleichen Else Eingabefeld_Auswahl_aufheben
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            ;[End Block]
            ;[Block] runter
         Case KeyHit(208) Or Eingabefeld_KeyDown(208)>Eingabefeld_KeyRepeatDelay
            Eingabefeld_KeyDown_CoolDown 208
            Eingabefeld_CursorZ=Eingabefeld_CursorZ+1
            Eingabefeld_Cursorposition_korrigieren zeilenanzahl, 0
            If KeyDown(42) Or KeyDown(54) Then Eingabefeld_Auswahl_an_Cursor_angleichen Else Eingabefeld_Auswahl_aufheben
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            ;[End Block]
            ;[Block] links
         Case KeyHit(203) Or Eingabefeld_KeyDown(203)>Eingabefeld_KeyRepeatDelay
            Eingabefeld_KeyDown_CoolDown 203
            Repeat
               Eingabefeld_CursorS=Eingabefeld_CursorS-1
               Eingabefeld_Cursorposition_korrigieren zeilenanzahl, 1
               If Not (KeyDown(29) Or KeyDown(157)) Then Exit
               If Eingabefeld_isTrennzeichen(Eingabefeld_Zeichen(Eingabefeld_CursorS-1, Eingabefeld_CursorZ)) Or Eingabefeld_isTrennzeichen(Eingabefeld_Zeichen(Eingabefeld_CursorS, Eingabefeld_CursorZ)) Then Exit
            Forever
            If KeyDown(42) Or KeyDown(54) Then Eingabefeld_Auswahl_an_Cursor_angleichen Else Eingabefeld_Auswahl_aufheben
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            ;[End Block]
            ;[Block] rechts
         Case KeyHit(205) Or Eingabefeld_KeyDown(205)>Eingabefeld_KeyRepeatDelay
            Eingabefeld_KeyDown_CoolDown 205
            Repeat
               Eingabefeld_CursorS=Eingabefeld_CursorS+1
               Eingabefeld_Cursorposition_korrigieren zeilenanzahl, 1
               If Not (KeyDown(29) Or KeyDown(157)) Then Exit
               If Eingabefeld_isTrennzeichen(Eingabefeld_Zeichen(Eingabefeld_CursorS, Eingabefeld_CursorZ)) Or Eingabefeld_isTrennzeichen(Eingabefeld_Zeichen(Eingabefeld_CursorS-1, Eingabefeld_CursorZ)) Then Exit
            Forever
            If KeyDown(42) Or KeyDown(54) Then Eingabefeld_Auswahl_an_Cursor_angleichen Else Eingabefeld_Auswahl_aufheben
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            ;[End Block]
            ;[Block] Pos1
         Case KeyHit(199)
            If KeyDown(29) Or KeyDown(157) Then Eingabefeld_CursorZ=1
            Eingabefeld_CursorS=1
            If KeyDown(42) Or KeyDown(54) Then Eingabefeld_Auswahl_an_Cursor_angleichen Else Eingabefeld_Auswahl_aufheben
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            ;[End Block]
            ;[Block] Ende
         Case KeyHit(207)
            If KeyDown(29) Or KeyDown(157) Then Eingabefeld_CursorZ=zeilenanzahl
            Eingabefeld_CursorS=Eingabefeld_getZeilenlaenge(Eingabefeld_CursorZ)+1
            If KeyDown(42) Or KeyDown(54) Then Eingabefeld_Auswahl_an_Cursor_angleichen Else Eingabefeld_Auswahl_aufheben
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            ;[End Block]
            ;[Block] Bild auf
         Case KeyHit(201) Or Eingabefeld_KeyDown(202)>Eingabefeld_KeyRepeatDelay
            Eingabefeld_KeyDown_CoolDown 201
            Eingabefeld_CursorZ=Eingabefeld_CursorZ-HoeheZ
            Eingabefeld_Cursorposition_korrigieren zeilenanzahl, 0
            If KeyDown(42) Or KeyDown(54) Then Eingabefeld_Auswahl_an_Cursor_angleichen Else Eingabefeld_Auswahl_aufheben
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            ;[End Block]
            ;[Block] Bild ab
         Case KeyHit(209) Or Eingabefeld_KeyDown(209)>Eingabefeld_KeyRepeatDelay
            Eingabefeld_KeyDown_CoolDown 209
            Eingabefeld_CursorZ=Eingabefeld_CursorZ+HoeheZ
            Eingabefeld_Cursorposition_korrigieren zeilenanzahl, 0
            If KeyDown(42) Or KeyDown(54) Then Eingabefeld_Auswahl_an_Cursor_angleichen Else Eingabefeld_Auswahl_aufheben
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            ;[End Block]
            ;[Block] Strg+A
         Case (KeyDown(29) Or KeyDown(157)) And KeyDown(30)
            If KeyHit(30)
               Local Last_EingabefeldZeile.EingabefeldZeile=Last EingabefeldZeile
               Eingabefeld_AuswahlAS=1
               Eingabefeld_AuswahlAZ=1
               Eingabefeld_AuswahlES=Last_EingabefeldZeile\Len+1
               Eingabefeld_AuswahlEZ=zeilenanzahl
               Eingabefeld_CursorS=Eingabefeld_AuswahlES
               Eingabefeld_CursorZ=Eingabefeld_AuswahlEZ
               Eingabefeld_CursorBlink=1
            End If
            ;[End Block]
            ;[Block] Strg+X / Umschalt+Entf
         Case ((KeyDown(29) Or KeyDown(157)) And KeyDown(45)) Or ((KeyDown(42) Or KeyDown(54)) And KeyDown(211))
            If KeyHit(45) Or KeyHit(211)
               If Eingabefeld_Auswahl_vorhanden()
                  Eingabefeld_Auswahl_kopieren
                  Eingabefeld_Auswahl_loeschen
                  Eingabefeld_CursorBlink=1
                  Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
                  veraenderung=1
               End If
            End If
            ;[End Block]
            ;[Block] Strg+C / Strg+Einfg
         Case (KeyDown(29) Or KeyDown(157)) And (KeyDown(46) Or KeyDown(210))
            If KeyHit(46) Or KeyHit(210)
               If Eingabefeld_Auswahl_vorhanden()
                  Eingabefeld_Auswahl_kopieren
                  Eingabefeld_CursorBlink=1
                  veraenderung=1
               End If
            End If
            ;[End Block]
            ;[Block] Strg+V / Umschalt+Einfg
         Case ((KeyDown(29) Or KeyDown(157)) And KeyDown(47)) Or ((KeyDown(42) Or KeyDown(54)) And KeyDown(210))
            If KeyHit(47) Or KeyHit(210)
               Eingabefeld_einfuegen
               Eingabefeld_CursorBlink=1
               Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
               veraenderung=1
            End If
            ;[End Block]
            ;[Block] Entf
         Case KeyHit(211) Or Eingabefeld_KeyDown(211)>Eingabefeld_KeyRepeatDelay
            Eingabefeld_KeyDown_CoolDown 211
            If Not Eingabefeld_Auswahl_vorhanden()
               Eingabefeld_CursorS=Eingabefeld_CursorS+1
               Eingabefeld_Cursorposition_korrigieren zeilenanzahl, 1
               Eingabefeld_Auswahl_an_Cursor_angleichen
            End If
            Eingabefeld_Auswahl_loeschen
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            veraenderung=1
            ;[End Block]
            ;[Block] Rücktaste
         Case KeyHit(14) Or Eingabefeld_KeyDown(14)>Eingabefeld_KeyRepeatDelay
            Eingabefeld_KeyDown_CoolDown 14
            If Not Eingabefeld_Auswahl_vorhanden()
               Eingabefeld_CursorS=Eingabefeld_CursorS-1
               Eingabefeld_Cursorposition_korrigieren zeilenanzahl, 1
               Eingabefeld_Auswahl_an_Cursor_angleichen
            End If
            Eingabefeld_Auswahl_loeschen
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            veraenderung=1
            ;[End Block]
            ;[Block] Eingabetaste
         Case KeyDown(28) Or KeyDown(156)
            If Eingabefeld_komplex
               If KeyHit(28) Or KeyHit(156) Or Eingabefeld_KeyDown(28)>Eingabefeld_KeyRepeatDelay Or Eingabefeld_KeyDown(156)>Eingabefeld_KeyRepeatDelay
                  Eingabefeld_KeyDown_CoolDown 28
                  Eingabefeld_KeyDown_CoolDown 156
                  If Eingabefeld_Auswahl_vorhanden() Then Eingabefeld_Auswahl_loeschen
                  Local azeile.EingabefeldZeile=Eingabefeld_getZeile(Eingabefeld_CursorZ)
                  Local nzeile.EingabefeldZeile=Eingabefeld_addZeile(Eingabefeld_getZeile(Eingabefeld_CursorZ+1), Mid(azeile\Text, Eingabefeld_CursorS))
                  Eingabefeld_modifyZeile azeile, Left(azeile\Text, Eingabefeld_CursorS-1)
                  Eingabefeld_CursorZ=Eingabefeld_CursorZ+1
                  If Eingabefeld_Einrueckung
                     Local einr=0
                     For einr=0 To azeile\Len-1
                        If Mid(azeile\Text, einr+1, 1)<>" " Then Exit
                     Next
                     Eingabefeld_modifyZeile nzeile, String(" ", einr)+nzeile\Text
                     Eingabefeld_CursorS=einr+1
                  Else
                     Eingabefeld_CursorS=1
                  End If
                  Eingabefeld_Auswahl_aufheben
                  Eingabefeld_CursorBlink=1
                  Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
                  veraenderung=1
               End If
            Else
               If KeyHit(28) Or KeyHit(156) Then Return 1
            End If
            ;[End Block]
            ;[Block] Tab
         Case KeyHit(15) Or Eingabefeld_KeyDown(15)>Eingabefeld_KeyRepeatDelay
            Eingabefeld_KeyDown_CoolDown 15
            If Eingabefeld_Auswahl_vorhanden() Then Eingabefeld_Auswahl_loeschen
            Local tzeile.EingabefeldZeile=Eingabefeld_getZeile(Eingabefeld_CursorZ)
            Eingabefeld_CursorS=Eingabefeld_CursorS+Eingabefeld_modifyZeile(tzeile, Left(tzeile\Text, Eingabefeld_CursorS-1)+Chr(9)+Mid(tzeile\Text, Eingabefeld_CursorS))
            Eingabefeld_Auswahl_aufheben
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            veraenderung=1
            ;[End Block]
            
            ;[Block] ESC
         Case KeyHit(1)
            If Eingabefeld_komplex
               If Eingabefeld_BlitzSys_vorhanden
                  Select DLLMessageBox("Eingabefeld", "Änderungen speichern?", MB_TOPMOST+MB_YESNOCANCEL+MB_ICONQUESTION, 0)
                     Case IDYES:   Return 1
                     Case IDNO:   Return 2
                  End Select
               Else
                  Return 1
               End If
            Else
               Return 2
            End If
            ;[End Block]
            
            ;[Block] druckbare Zeichen
         Case GetKey_>=32
            If Eingabefeld_Auswahl_vorhanden() Then Eingabefeld_Auswahl_loeschen
            Local szeile.EingabefeldZeile=Eingabefeld_getZeile(Eingabefeld_CursorZ)
            Local neueszeichen$=Chr(GetKey_)
            If neueszeichen="-" Then If KeyHit(181) Then neueszeichen="/"
            Eingabefeld_modifyZeile szeile, Left(szeile\Text, Eingabefeld_CursorS-1)+neueszeichen+Mid(szeile\Text, Eingabefeld_CursorS)
            Eingabefeld_CursorS=Eingabefeld_CursorS+1
            Eingabefeld_Auswahl_aufheben
            Eingabefeld_CursorBlink=1
            Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
            veraenderung=1
            ;[End Block]
      End Select
      If veraenderung Then Eingabefeld_verarbeite_Zeile Eingabefeld_getZeile(Eingabefeld_CursorZ), 1
      ;[End Block]
      ;[Block] Mausabfrage (Cursor und Auswahl)
      If RectsOverlap(grenze_l, grenze_u, grenze_r-grenze_l, grenze_o-grenze_u, MouseX3D, MouseY3D, 1, 1)
         If maushit
            If KeyDown(42) Or KeyDown(54)
               Eingabefeld_Mausaktion=2
            Else
               If MilliSecs()-Eingabefeld_lastMouseHitMillisecs<Eingabefeld_DblClickInterval
                  ;[Block] Wort markieren durch Doppelklick
                  Repeat
                     If Eingabefeld_isTrennzeichen(Eingabefeld_Zeichen(Eingabefeld_CursorS-1, Eingabefeld_CursorZ)) Or Eingabefeld_isTrennzeichen(Eingabefeld_Zeichen(Eingabefeld_CursorS, Eingabefeld_CursorZ)) Then Exit
                     Eingabefeld_CursorS=Eingabefeld_CursorS-1
                     Eingabefeld_Cursorposition_korrigieren zeilenanzahl, 0
                  Forever
                  Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
                  Eingabefeld_Auswahl_aufheben
                  Eingabefeld_lastCursorS=Eingabefeld_CursorS
                  Eingabefeld_lastCursorZ=Eingabefeld_CursorZ
                  Repeat
                     Eingabefeld_CursorS=Eingabefeld_CursorS+1
                     Eingabefeld_Cursorposition_korrigieren zeilenanzahl, 0
                     If Eingabefeld_isTrennzeichen(Eingabefeld_Zeichen(Eingabefeld_CursorS, Eingabefeld_CursorZ)) Or Eingabefeld_isTrennzeichen(Eingabefeld_Zeichen(Eingabefeld_CursorS-1, Eingabefeld_CursorZ)) Then Exit
                  Forever
                  Eingabefeld_Sichtfeld_an_Cursor_angleichen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe
                  Eingabefeld_Auswahl_an_Cursor_angleichen
                  ;[End Block]
                  Eingabefeld_Mausaktion=0
               Else
                  Eingabefeld_Mausaktion=1
               End If
            End If
            Eingabefeld_lastMouseHitMillisecs=MilliSecs()
         ElseIf MouseDown(1)
            If Eingabefeld_Mausaktion=1 Then Eingabefeld_Mausaktion=2
         Else
            Eingabefeld_Mausaktion=0
         End If
      Else
         If Not MouseDown(1) Then Eingabefeld_Mausaktion=0
      End If
      ;[End Block]
   End If
   
   Return 0
End Function


Function Eingabefeld_Scrollbutton_zeichnen(sbx#, sby#, pw#, aktiv, maushit, halbe_y_groesse=0)
   Local r=0
   If halbe_y_groesse Then sby=sby+5*(2*(pw>180)-1)
   If aktiv Then ColorN3D 230, 230, 230 Else ColorN3D 230, 230, 230, .5
   Rect3D Eingabefeld_scrollbutton, sbx, sby, 7, 7-halbe_y_groesse*5, 1, 3
   ColorN3D
   CheckQuad3D sbx-10, sby-10+halbe_y_groesse*5, sbx-10, sby+10-halbe_y_groesse*5, sbx+10, sby+10-halbe_y_groesse*5, sbx+10, sby-10+halbe_y_groesse*5, 1
   If aktiv And MouseOver3D
      Rect3D Eingabefeld_scrollbutton, sbx, sby, 7, 7-halbe_y_groesse*5, 1, 3
      If maushit Then r=1
   End If
   If aktiv Then ColorG3D 0, 0, 0 Else ColorG3D 0, 0, 0, .3
   DrawImage3D Eingabefeld_scrollpfeil, sbx, sby, 0, pw
   ColorG3D
   Return r
End Function


Function Eingabefeld_Scrollbalken_zeichnen(sbx#, sby#, vertikal, max_groesse#, aktiv, Breite#, Hoehe#, zeichenbreite, zeichenhoehe, max_zeilenbreite, zeilenanzahl, grenze_l#, grenze_r#, grenze_o#, grenze_u#)
   If Not aktiv Then Return 0
   Local groesse_x#=7*vertikal+(2*max_groesse*((Breite-20)/(zeichenbreite*(max_zeilenbreite+1))))*(1-vertikal)
   Local groesse_y#=7*(1-vertikal)+(2*max_groesse*((Hoehe-20)/(zeichenhoehe*zeilenanzahl)))*vertikal
   If groesse_x<4 Then groesse_x=4
   If groesse_y<4 Then groesse_y=4
   If vertikal Then Eingabefeld_vertScrollbalkenhoehe=groesse_y Else Eingabefeld_horizScrollbalkenbreite=groesse_x
   Local x#=sbx+(max_groesse-groesse_x)   *   (2*Eingabefeld_ScrollX/Float(zeichenbreite*(max_zeilenbreite+1)-(grenze_r-grenze_l))-1)   *(1-vertikal)
   Local y#=sby+(max_groesse-groesse_y)   *   -(2*Eingabefeld_ScrollY/Float(zeichenhoehe*zeilenanzahl-(grenze_o-grenze_u))-1)         *vertikal
   If x=0 And x=1 Then x=sbx
   If y=0 And y=1 Then y=sby
   ColorN3D 230, 230, 230
   Rect3D Eingabefeld_scrollbutton, x, y, groesse_x, groesse_y, 1, 3
   ColorN3D
   CheckQuad3D x-groesse_x, y-groesse_y, x-groesse_x, y+groesse_y, x+groesse_x, y+groesse_y, x+groesse_x, y-groesse_y, 1
   If MouseOver3D
      Rect3D Eingabefeld_scrollbutton, x, y, groesse_x, groesse_y, 1, 3
      Return 1
   End If
   Return 0
End Function


Function Eingabefeld_Scrollposition_begrenzen(grenze_l#, grenze_r#, grenze_o#, grenze_u#, zeichenbreite, zeichenhoehe, max_zeilenbreite, zeilenanzahl)
   Local zeilennummerbreite=(Eingabefeld_komplex And Eingabefeld_Zeilennummern)*Len(zeilenanzahl)
   If Eingabefeld_ScrollX>zeichenbreite*(max_zeilenbreite+1+zeilennummerbreite)-(grenze_r-grenze_l) Then Eingabefeld_ScrollX=zeichenbreite*(max_zeilenbreite+1+zeilennummerbreite)-(grenze_r-grenze_l)
   If Eingabefeld_ScrollY>zeichenhoehe*(zeilenanzahl)-(grenze_o-grenze_u) Then Eingabefeld_ScrollY=zeichenhoehe*(zeilenanzahl)-(grenze_o-grenze_u)
   If Eingabefeld_ScrollX<0 Then Eingabefeld_ScrollX=0
   If Eingabefeld_ScrollY<0 Then Eingabefeld_ScrollY=0
End Function


Function Eingabefeld_addSyntaxhighlight(txt$, farbcode, typ=EFSTyp_Wort)
   Local n.EingabefeldSyntaxhighlight=New EingabefeldSyntaxhighlight
   n\Text=txt
   n\Farbcode=farbcode
   n\Typ=typ
End Function


Function Eingabefeld_clearSyntaxhighlights()
   Delete Each EingabefeldSyntaxhighlight
End Function


Function Eingabefeld_verarbeite_Zeile(zeile.EingabefeldZeile, gruendlich=0)
   Local ztmp$, tabbreite=0
   zeile\Len=Len(zeile\Text)
   Local zz=1
   While zz<=zeile\Len
      ;[Block] Tabs durch Leerzeichen ersetzen
      If Asc(Mid(zeile\Text, zz, 1))=9
         ztmp=Left(zeile\Text, zz-1)
         tabbreite=Eingabefeld_Tabbreite-((zz-1) Mod Eingabefeld_Tabbreite):If tabbreite=0 Then tabbreite=Eingabefeld_Tabbreite
         ztmp=ztmp+String(" ", tabbreite)
         ztmp=ztmp+Mid(zeile\Text, zz+1)
         zeile\Text=ztmp
      End If
      ;[End Block]
      zz=zz+1
   Wend
   zeile\Len=Len(zeile\Text)
   
   If gruendlich
      If Eingabefeld_komplex
         ;[Block] Syntax-Highlighting
         If Eingabefeld_Syntaxhighlighting
            Local h.EingabefeldSyntaxhighlight, z_a$, asc_z_a, z_l1$, farbe_zeichen_verbleibend=0, ph_str$, htext_len, zeichen, lenplus, normalfarbe, abngz
            Local zeile_pruef$, hText_pruef$, txtnf$
            If Eingabefeld_Syntaxhighlighting_CaseSensitive=1 Then zeile_pruef=zeile\Text Else zeile_pruef=Lower(zeile\Text)
            
            zeile\Text_mit_Farbcodes=zeile\Text
            lenplus=0
            normalfarbe=1
            
            For zeichen=1 To zeile\Len
               z_a=Mid(zeile\Text, zeichen, 1)
               asc_z_a=Asc(z_a)
               If farbe_zeichen_verbleibend>-1 Then farbe_zeichen_verbleibend=farbe_zeichen_verbleibend-1
               If farbe_zeichen_verbleibend=-1 Then farbe_zeichen_verbleibend=0
               If farbe_zeichen_verbleibend=0
                  If zeichen>1 Then z_l1=Mid(zeile_pruef, zeichen-1, 1) Else z_l1=""
                  For h=Each EingabefeldSyntaxhighlight
                     If Eingabefeld_Syntaxhighlighting_CaseSensitive=1 Then hText_pruef=h\Text Else hText_pruef=Lower(h\Text)
                     htext_len=Len(hText_pruef)
                     ph_str=Mid(zeile_pruef, zeichen, htext_len)
                     If Asc(ph_str)=Asc(hText_pruef)
                        If Eingabefeld_isTrennzeichen(z_l1) Or h\Typ<>EFSTyp_Wort
                           If Eingabefeld_isTrennzeichen(Mid(zeile_pruef, zeichen+htext_len, 1)) Or h\Typ<>EFSTyp_Wort
                              If ph_str=hText_pruef
                                 If Eingabefeld_Syntaxhighlighting_CaseSensitive=-1
                                    txtnf=hText_pruef+Mid(zeile\Text_mit_Farbcodes, zeichen+lenplus+htext_len)
                                    zeile\Text=Left(zeile\Text, zeichen-1)+h\Text+Mid(zeile\Text, zeichen+htext_len)
                                 Else
                                    txtnf=Mid(zeile\Text_mit_Farbcodes, zeichen+lenplus)
                                 End If
                                 If h\Farbcode<>-1
                                    zeile\Text_mit_Farbcodes=Left(zeile\Text_mit_Farbcodes, zeichen-1+lenplus)+Chr(8)+h\Farbcode+Chr(8)+txtnf
                                    lenplus=lenplus+Len(h\Farbcode)+2
                                    normalfarbe=0
                                    If h\Typ=EFSTyp_String
                                       abngz=Instr(zeile_pruef, hText_pruef, zeichen+htext_len)
                                       If abngz=0 Then Goto highlighting_beendet Else abngz=abngz-(zeichen+htext_len)
                                       farbe_zeichen_verbleibend=2*htext_len+abngz
                                    ElseIf h\Typ=EFSTyp_Label
                                       abngz=zeichen+htext_len
                                       farbe_zeichen_verbleibend=htext_len
                                       While Not Eingabefeld_isTrennzeichen(Mid(zeile_pruef, abngz, 1))
                                          farbe_zeichen_verbleibend=farbe_zeichen_verbleibend+1
                                          abngz=abngz+1
                                          If abngz=zeile\Len+1 Then Goto highlighting_beendet
                                       Wend
                                    Else
                                       farbe_zeichen_verbleibend=htext_len
                                    End If
                                    If h\Typ=EFSTyp_Kommentar Then Goto highlighting_beendet Else Goto highlight_gefunden
                                 End If
                              End If
                           End If
                        End If
                     End If
                  Next
                  
                  If Not normalfarbe
                     zeile\Text_mit_Farbcodes=Left(zeile\Text_mit_Farbcodes, zeichen-1+lenplus)+Chr(8)+EFSFarbe_normal+Chr(8)+Mid(zeile\Text_mit_Farbcodes, zeichen+lenplus)
                     lenplus=lenplus+Len(EFSFarbe_normal)+2
                     normalfarbe=1
                  End If
               ElseIf farbe_zeichen_verbleibend<-1
                  If asc_z_a=-farbe_zeichen_verbleibend
                     farbe_zeichen_verbleibend=0
                     normalfarbe=0
                     Goto highlight_gefunden
                  End If
               End If
               .highlight_gefunden
            Next
            .highlighting_beendet
         End If
         ;[End Block]
      End If
   Else
      zeile\Text_mit_Farbcodes=""
   End If
   Return tabbreite   
End Function


Function Eingabefeld_isTrennzeichen(zeichen$)
   If zeichen="" Then Return 1
   Local t:For t=1 To Eingabefeld_Trennzeichenliste_Len
      If zeichen=Mid(Eingabefeld_Trennzeichenliste, t, 1) Then Return 1
   Next
   Return 0
End Function


Function Eingabefeld_Auswahl_an_Cursor_angleichen()
   If Eingabefeld_lastCursorS=Eingabefeld_AuswahlAS And Eingabefeld_lastCursorZ=Eingabefeld_AuswahlAZ
      Eingabefeld_AuswahlAS=Eingabefeld_CursorS
      Eingabefeld_AuswahlAZ=Eingabefeld_CursorZ
   ElseIf Eingabefeld_lastCursorS=Eingabefeld_AuswahlES And Eingabefeld_lastCursorZ=Eingabefeld_AuswahlEZ
      Eingabefeld_AuswahlES=Eingabefeld_CursorS
      Eingabefeld_AuswahlEZ=Eingabefeld_CursorZ
   Else
      Eingabefeld_Auswahl_aufheben
   End If
   If (Eingabefeld_AuswahlAZ=Eingabefeld_AuswahlEZ And Eingabefeld_AuswahlAS>Eingabefeld_AuswahlES) Or (Eingabefeld_AuswahlAZ>Eingabefeld_AuswahlEZ)
      Local ts=Eingabefeld_AuswahlAS, tz=Eingabefeld_AuswahlAZ
      Eingabefeld_AuswahlAS=Eingabefeld_AuswahlES
      Eingabefeld_AuswahlAZ=Eingabefeld_AuswahlEZ
      Eingabefeld_AuswahlES=ts
      Eingabefeld_AuswahlEZ=tz
   End If
End Function


Function Eingabefeld_Auswahl_aufheben()
   Eingabefeld_AuswahlAS=Eingabefeld_CursorS
   Eingabefeld_AuswahlAZ=Eingabefeld_CursorZ
   Eingabefeld_AuswahlES=Eingabefeld_CursorS
   Eingabefeld_AuswahlEZ=Eingabefeld_CursorZ
End Function


Function Eingabefeld_Auswahl_vorhanden()
   If Eingabefeld_AuswahlAS<>Eingabefeld_AuswahlES Then Return 1
   If Eingabefeld_AuswahlAZ<>Eingabefeld_AuswahlEZ Then Return 1
   Return 0
End Function


Function Eingabefeld_Auswahl_loeschen()
   Eingabefeld_CursorS=Eingabefeld_AuswahlAS
   Eingabefeld_CursorZ=Eingabefeld_AuswahlAZ
   Local zeile1.EingabefeldZeile, zeile2.EingabefeldZeile, z2v.EingabefeldZeile
   zeile1=Eingabefeld_getZeile(Eingabefeld_AuswahlAZ)
   zeile2=Eingabefeld_getZeile(Eingabefeld_AuswahlEZ)
   Eingabefeld_modifyZeile zeile1, Left(zeile1\Text, Eingabefeld_AuswahlAS-1)+Mid(zeile2\Text, Eingabefeld_AuswahlES)
   Local r:For r=Eingabefeld_AuswahlEZ To Eingabefeld_AuswahlAZ+1 Step -1:z2v=zeile2:zeile2=Before zeile2 Delete z2v:Next
   Eingabefeld_Auswahl_aufheben
End Function


Function Eingabefeld_Auswahl_kopieren()
   Local zeilec$
   Local zeile1.EingabefeldZeile=Eingabefeld_getZeile(Eingabefeld_AuswahlAZ)
   If Eingabefeld_AuswahlAZ=Eingabefeld_AuswahlEZ
      zeilec=Mid(zeile1\Text, Eingabefeld_AuswahlAS, Eingabefeld_AuswahlES-Eingabefeld_AuswahlAS)
   Else
      Local zeile2.EingabefeldZeile=Eingabefeld_getZeile(Eingabefeld_AuswahlEZ)
      zeilec=Chr(13)+Chr(10)+Left(zeile2\Text, Eingabefeld_AuswahlES-1)
      Local r:For r=Eingabefeld_AuswahlEZ-1 To Eingabefeld_AuswahlAZ+1 Step -1
         zeile2=Before zeile2
         zeilec=Chr(13)+Chr(10)+zeile2\Text+zeilec
      Next
      
      zeilec=Mid(zeile1\Text, Eingabefeld_AuswahlAS)+zeilec
   End If
   If Eingabefeld_BlitzSys_vorhanden Then DLLSetClipboardText zeilec Else Eingabefeld_Clipboard=zeilec
End Function


Function Eingabefeld_einfuegen()
   Local zeilec$
   If Eingabefeld_BlitzSys_vorhanden Then zeilec=Replace(DLLEZGetClipboardText(), Chr(10), "") Else zeilec=Replace(Eingabefeld_Clipboard, Chr(10), "")
   If zeilec="" Then Return
   If Eingabefeld_Auswahl_vorhanden() Then Eingabefeld_Auswahl_loeschen
   Local len_zeilec_a=Len(zeilec)
   Local s.EingabefeldZeile=Eingabefeld_getZeile(Eingabefeld_CursorZ)
   Eingabefeld_Verarbeitung=s
   Local d.EingabefeldZeile=After s
   d=Eingabefeld_addZeile(d, Mid(s\Text, Eingabefeld_CursorS))
   Eingabefeld_modifyZeile s, Left(s\Text, Eingabefeld_CursorS-1)
   Local n0.EingabefeldZeile=Null, n.EingabefeldZeile
   Local len_zeilec=len_zeilec_a, p
   Local umbruch_ende=(Right(zeilec, 1)=Chr(13))
   Local umbruchzaehler=umbruch_ende-1
   Repeat
      For p=1 To len_zeilec+1
         If Mid(zeilec, p, 1)=Chr(13) Or p=len_zeilec+1
            umbruchzaehler=umbruchzaehler+1
            n=Eingabefeld_addZeile(d, Left(zeilec, p-1))
            If n0=Null Then n0=n
            zeilec=Mid(zeilec, p+1)
            Exit
         End If
      Next
      len_zeilec=Len(zeilec)
   Until len_zeilec=0
   If umbruch_ende Then n=Eingabefeld_addZeile(d, "")
   Local ntextlen=Len(n\Text)
   Eingabefeld_modifyZeile n, n\Text+d\Text
   Delete d
   Eingabefeld_modifyZeile s, s\Text+n0\Text
   Delete n0
   
   If umbruchzaehler=0
      Eingabefeld_CursorS=Eingabefeld_CursorS+len_zeilec_a
   Else
      Eingabefeld_CursorZ=Eingabefeld_CursorZ+umbruchzaehler
      Eingabefeld_CursorS=1+ntextlen
   End If
   Local zz=0:For n=Each EingabefeldZeile:zz=zz+1:Next
   Eingabefeld_Cursorposition_korrigieren zz, 1
   Eingabefeld_Auswahl_aufheben
End Function


Function Eingabefeld_Cursorposition_korrigieren(zeilenanzahl, uebertrag)
   If Eingabefeld_CursorS<1
      If uebertrag
         Eingabefeld_CursorZ=Eingabefeld_CursorZ-1
         Eingabefeld_CursorS=Eingabefeld_getZeilenlaenge(Eingabefeld_CursorZ)+1
      Else
         Eingabefeld_CursorS=1
      End If
   ElseIf Eingabefeld_CursorS>Eingabefeld_getZeilenlaenge(Eingabefeld_CursorZ)+1
      If uebertrag
         Eingabefeld_CursorZ=Eingabefeld_CursorZ+1
         Eingabefeld_CursorS=1
      Else
         Eingabefeld_CursorS=Eingabefeld_getZeilenlaenge(Eingabefeld_CursorZ)+1
      End If
   End If
   If Eingabefeld_CursorZ>zeilenanzahl
      Eingabefeld_CursorZ=zeilenanzahl
      Eingabefeld_CursorS=Eingabefeld_getZeilenlaenge(Eingabefeld_CursorZ)+1
   ElseIf Eingabefeld_CursorZ<1
      Eingabefeld_CursorZ=1
      Eingabefeld_CursorS=1
   End If
End Function


Function Eingabefeld_Sichtfeld_an_Cursor_angleichen(grenze_l#, grenze_r#, grenze_o#, grenze_u#, zeichenbreite, zeichenhoehe)
   Local zz.EingabefeldZeile, zeilenanzahl=0, max_zeilenbreite=0
   For zz=Each EingabefeldZeile
      zeilenanzahl=zeilenanzahl+1
      If Len(zz\Text)>max_zeilenbreite Then max_zeilenbreite=Len(zz\Text)
   Next
   Local zeilennummerbreite=(Eingabefeld_komplex And Eingabefeld_Zeilennummern)*Len(zeilenanzahl)
   
   Local grenze_lZ=(Eingabefeld_ScrollX)/zeichenbreite+2
   Local grenze_rZ=(grenze_r-grenze_l+Eingabefeld_ScrollX)/zeichenbreite-1-zeilennummerbreite
   Local grenze_oZ=(Eingabefeld_ScrollY)/zeichenhoehe+2
   Local grenze_uZ=(grenze_o-grenze_u+Eingabefeld_ScrollY)/zeichenhoehe-1
   If grenze_lZ>Eingabefeld_CursorS Then Eingabefeld_ScrollX=Eingabefeld_ScrollX-(grenze_lZ-Eingabefeld_CursorS)*zeichenbreite
   If grenze_rZ<Eingabefeld_CursorS Then Eingabefeld_ScrollX=Eingabefeld_ScrollX-(grenze_rZ-Eingabefeld_CursorS)*zeichenbreite
   If grenze_oZ>Eingabefeld_CursorZ Then Eingabefeld_ScrollY=Eingabefeld_ScrollY-(grenze_oZ-Eingabefeld_CursorZ)*zeichenhoehe
   If grenze_uZ<Eingabefeld_CursorZ Then Eingabefeld_ScrollY=Eingabefeld_ScrollY-(grenze_uZ-Eingabefeld_CursorZ)*zeichenhoehe
   Eingabefeld_Scrollposition_begrenzen grenze_l, grenze_r, grenze_o, grenze_u, zeichenbreite, zeichenhoehe, max_zeilenbreite, zeilenanzahl
End Function


Function Eingabefeld_Zeichen$(S, Z)
   If S<1 Then Return ""
   Local zeile.EingabefeldZeile=Eingabefeld_getZeile(Z)
   If zeile=Null Then Return "" Else Return Mid(zeile\Text, S, 1)
End Function


Function Eingabefeld_KeyDown_CoolDown(scancode)
   If Eingabefeld_KeyDown(scancode)>Eingabefeld_KeyRepeatDelay Then Eingabefeld_KeyDown(scancode)=Eingabefeld_KeyDown(scancode)-Eingabefeld_KeyRepeatInterval
End Function


Function Eingabefeld_Begrenzung$(BText$, maxBreite#, tschriftart=-1)
   If tschriftart=-1 Then tschriftart=Eingabefeld_schriftart
   Local Breite=StringWidth3D(tschriftart, BText)
   If Breite<=maxBreite Then Return BText
   
   Local maxLaenge=Len(BText)
   Local Schaetzwert=(maxBreite/Breite)*maxLaenge
   
   Local TText$
   If Schaetzwert<0 Then TText="…" Else TText=Left(BText, Schaetzwert)+"…"
   Breite=StringWidth3D(tschriftart, TText)
   
   Select Sgn(Int(maxBreite-Breite))
      Case 0
         Return TText
      Case 1
         While Schaetzwert<maxLaenge
            Schaetzwert=Schaetzwert+1
            TText=Left(BText, Schaetzwert)+"…"
            If StringWidth3D(tschriftart, TText)>maxBreite Then Return Left(BText, Schaetzwert-1)+"…"
         Wend
         Return BText
      Case -1
         While Schaetzwert>0
            Schaetzwert=Schaetzwert-1
            TText=Left(BText, Schaetzwert)+"…"
            If StringWidth3D(tschriftart, TText)<=maxBreite Then Return TText
         Wend
         Return "…"
   End Select
End Function


PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group