[GELÖST] MaxGUI - Syntaxhighlighting in TextArea?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: [GELÖST] MaxGUI - Syntaxhighlighting in TextArea?

BeitragSo, Jan 22, 2012 21:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich bastel mir gerade einen Editor für eine scriptsprache. Nun sollen die verwendeten befehle (falls vorhanden) gehighlightet werden...
Ich habe mir also eine Liste gemacht, die alle Befehle beinhaltet und gehe sie in der hauptschleife immer durch. So, nun kommt der fehler: irgendwie ist es immer so, das wenn ich den befehl zum ersten mal hinschreibe, nur die ersten beiden buchstaben gehighlightet werden. schreibe ich danach weiter wird auf einmal alles gehighlightet (also wirklich alles, auch wenn es kein befehl ist)... Hier mal der pseudocode: BlitzMax:
Import maxgui.drivers

Global mainwindow:TGadget = CreateWindow(AppTitle, 100, 100, 800, 600, Null, WINDOW_TITLEBAR | WINDOW_MENU | WINDOW_STATUS | WINDOW_RESIZEABLE)
Global scriptarea:TGadget = CreateTextArea(10, 10, (ClientWidth(mainwindow) - 20), (ClientHeight(mainwindow) - 20), mainwindow)

'Listen
Global keywordslisttype1:TList = CreateList()
FillKeyWordsListType1()
Global keywordslisttype2:TList = CreateList()
FillKeyWordsListType2()
Global keywordslisttype3:TList = CreateList()
FillKeyWordsListType3()
Global keywordslisttype4:TList = CreateList()
FillKeyWordsListType4()
Global keywordslisttype5:TList = CreateList()
FillKeyWordsListType5()

Global scripttext:String

Repeat
WaitEvent()
Select EventID()
Case EVENT_WINDOWCLOSE
End
End Select
For momstring:String = EachIn(keywordslisttype1)
Local command:Int = Instr(scripttext, momstring)
If(command >= 0)
FormatTextAreaText(scriptarea, 0, 0, 255, TEXTFORMAT_BOLD, command, Len(x))
EndIf
Next

scripttext = GadgetText(scriptarea)
Forever

Function FillKeyWordsListType1()
Local keyword1:String
keyword1 = "include"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "module"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "modinfo"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "import"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "trimport"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "return"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "if"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "switch"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "case"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "for"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "while"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "and"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "or"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "true"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "false"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "break"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "sizeof"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "else"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "cast"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "apptitle"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "end"
ListAddLast(keywordslisttype1, keyword1)
keyword1 = "define"
ListAddLast(keywordslisttype1, keyword1)
End Function

Function FillKeyWordsListType2()
Local keyword1:String
keyword1 = "int"
ListAddLast(keywordslisttype2, keyword1)
keyword1 = "float"
ListAddLast(keywordslisttype2, keyword1)
keyword1 = "bool"
ListAddLast(keywordslisttype2, keyword1)
keyword1 = "char"
ListAddLast(keywordslisttype2, keyword1)
keyword1 = "void"
ListAddLast(keywordslisttype2, keyword1)
keyword1 = "array_of_char"
ListAddLast(keywordslisttype2, keyword1)
keyword1 = "i"
ListAddLast(keywordslisttype2, keyword1)
keyword1 = "b"
ListAddLast(keywordslisttype2, keyword1)
keyword1 = "c"
ListAddLast(keywordslisttype2, keyword1)
keyword1 = "v"
ListAddLast(keywordslisttype2, keyword1)
keyword1 = "aoc"
ListAddLast(keywordslisttype2, keyword1)
End Function

Function FillKeyWordsListType3()
Local keyword1:String
keyword1 = "normal"
ListAddLast(keywordslisttype3, keyword1)
keyword1 = "const"
ListAddLast(keywordslisttype3, keyword1)
keyword1 = "array"
ListAddLast(keywordslisttype3, keyword1)
keyword1 = "function"
ListAddLast(keywordslisttype3, keyword1)
keyword1 = "unsigned"
ListAddLast(keywordslisttype3, keyword1)
keyword1 = "n"
ListAddLast(keywordslisttype3, keyword1)
keyword1 = "a"
ListAddLast(keywordslisttype3, keyword1)
keyword1 = "f"
ListAddLast(keywordslisttype3, keyword1)
keyword1 = "u"
ListAddLast(keywordslisttype3, keyword1)
End Function

Function FillKeyWordsListType4()
Local keyword1:String
keyword1 = "{"
ListAddLast(keywordslisttype4, keyword1)
keyword1 = "}"
ListAddLast(keywordslisttype4, keyword1)
keyword1 = "["
ListAddLast(keywordslisttype4, keyword1)
keyword1 = "]"
ListAddLast(keywordslisttype4, keyword1)
keyword1 = "|"
ListAddLast(keywordslisttype4, keyword1)
End Function

Function FillKeyWordsListType5()
Local keyword1:String
keyword1 = "+"
ListAddLast(keywordslisttype5, keyword1)
keyword1 = "-"
ListAddLast(keywordslisttype5, keyword1)
keyword1 = "*"
ListAddLast(keywordslisttype5, keyword1)
keyword1 = "/"
ListAddLast(keywordslisttype5, keyword1)
keyword1 = "="
ListAddLast(keywordslisttype5, keyword1)
keyword1 = "<"
ListAddLast(keywordslisttype5, keyword1)
keyword1 = ">"
ListAddLast(keywordslisttype5, keyword1)
keyword1 = "!"
ListAddLast(keywordslisttype5, keyword1)
End Function


Ich weiß nicht woran es liegt... stehe komplett aufm schlauch.
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
  • Zuletzt bearbeitet von CO2 am Mo, Jan 23, 2012 22:36, insgesamt einmal bearbeitet

Midimaster

BeitragSo, Jan 22, 2012 23:44
Antworten mit Zitat
Benutzer-Profile anzeigen
eine Frage dazu:

BlitzMax:
FormatTextAreaText(scriptarea, 0, 0, 255, TEXTFORMAT_BOLD, command, Len(x))


wofür steht dieses x in Len(x) und wo wird es festgelegt?
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe

d-bug

BeitragMo, Jan 23, 2012 20:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich mache jetzt genau das, was ich letztens nicht machen wollte... Ich gebe dir einen verbesserten Codeschnipsel von deiner Hauptschleife.

BlitzMax:
Repeat
WaitEvent()


Select EventID()
Case EVENT_WINDOWCLOSE, EVENT_APPTERMINATE
End


Case EVENT_GADGETACTION
If EventSource() = scriptarea
Local text:String = TextAreaText(scriptArea)[0..TextAreaCursor(scriptarea)] 'nur text bis zur cursorposition verwenden

LockTextarea(scriptarea)

Local lines:String[] = text.split("~n") 'text in zeilen splitten
Local words:String[] = lines[lines.length-1].split(" ") 'letzte zeile in wörter splitten

Local keyWord:String = words[words.length-1] 'letztes wort als schlüsselwort annehmen
Local keyWordPosition:Int = TextAreaCursor(scriptarea) - keyWord.length 'anfangsposition für formattextareatext

For Local listWord:String = EachIn keywordslisttype1
If listWord = keyWord
FormatTextAreaText(scriptarea, 0, 0, 255, TEXtFORMAT_BOLD, keyWordPosition, TextAreaCursor(scriptarea) - keyWordPosition, TEXTAREA_CHARS)
Exit
EndIf
Next

UnLockTextarea(scriptarea)
EndIf
End Select

scripttext = GadgetText(scriptarea)
Forever


Versuch aber wenigstens daraus schlau zu werden! Da steckt auch noch jede Menge Optimierungspotenzial drin. Es wird nämlich bei jedem Buchstaben den du tippst die komplette Liste deiner Keywords durchlaufen. Das muss nicht sein. Es reicht auch bei Leerzeichen und Return, Backspace usw.. Außerdem solltest du dir ein schnelleres System für die Keywords ausdenken. So ein Listendurchlauf kostet viel Zeit, vor allem wenn die Liste sehr lang wird und das Keyword ganz hinten ist.

Außerdem wird dir das gleiche passieren, was auch in der MaxIDE passiert: Je länger der Code desto langsamer wird das alles!

Es gäbe noch die Möglichkeit klepto2's Scintilla Modul zu verwenden, allerdings glaube ich nicht, dass du damit klar kommen wirst. Das soll kein Angriff sein, aber deine Fragen deuten darauf hin, dass du noch recht unerfahren mit Modulen und BlitzMax im allgemeinen bist.


@Midimaster
Len(x) müsste eigentlich die Länge des Keywords sein. Allerdings ist sein ganzer Code irgendwie daneben. Denn er würde (wenn er denn funktionieren würde) in jedem Schleifendurchlauf alle Keywords neu formatieren, was noch wesentlich langsamer ist als meine Version!


Grüße
 

CO2

ehemals "SirMO"

BeitragMo, Jan 23, 2012 22:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok,

@ Midimaster:
Oh, hatte davor einen anderen Code... in dem war das x als String im kopf der for-next-schleife deklariert, muss ich wohl übersehen haben Embarassed

@ d-bug:
Zitat:
Es reicht auch bei Leerzeichen und Return, Backspace usw..
- Einige Codezeilen (in der scriptsprache) sehen aber wie folgt aus:
Code:
print["Hallo"];
Hier ist kein Leerzeichen enthalten... ebenso kann man mehrere befehle hintereinanderschreiben, was auch die möglichkeit mit [Enter] vernichtet... Das einzige was meiner meinung nach ginge wäre die möglichkeit, das die geschriebene codezeile überprüft wird, wenn das Semikolon getippt wurde. - Werde auf jedenfall experimentieren/optimieren! Smile

Ich werde das thema jetzt als "Gelöst" taggen, da mein Problem ja vorerst gelöst wurde, also danke an alle die halfen Wink

mfG,
CO2
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
 

Macintosh

BeitragDi, Jan 24, 2012 0:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Du könntest zwischen zahlen, buchstaben , whitespace und sonderzeichen unterscheiden und bei jedem wechsel das letzte wort neu higlighten.
Also so in etwa
 

PhillipK

BeitragDi, Jan 24, 2012 1:55
Antworten mit Zitat
Benutzer-Profile anzeigen
hier dann gleich noch ein vorschlag meinerseits:

Damit du nicht ewig eine liste durchgehen musst, welches keyword nun vorkommen könnte, machs wie folgt:

Erstell einen array mit 26 einträgen (wahlweise auch 29, je nachdem, ob du funktionen mit ü,ö,ä am anfang verwendest., bzw evtl auch 52 oder 58, wenn du zwischen groß/klein unterscheidest, etc,etc,etc.)

Nun kannst du für jeden buchstaben den ascii-code nehmen und um X verringern (genauen wert googlen - x steht für "minus asciicode von 'a'" (oder auch ascii-code von 'A' -> groß/kleinschreibung) und als array index verwenden.

BlitzBasic:



Jede dieser array einträge kriegt nun ein weiteres Array oder Type rein, in welchem du die Funktionen verwaltest, die ein highlight bekommen. Type bietet sich an, um evtl andere Farbcodes etc zu speichern.

Prüfe, nachdem ein leerzeichen + neues zeichen getippt wurde, welches der erste buchstabe ist, nehm seinen Ascii-code und rechne die differenz runter. Nun kannst du schonmal auf die liste zugreifen, welche nurnoch mögliche funktionen beinhaltet.
Optional: Kopiere diese liste und kicke jeden eintrag raus, welcher durch weitere buchstaben nichtmehr möglich ist (Highlightliste: Apfel, Armeise - Geschrieben : 'A' -> Möglich: Apfel, Armeise. Weiter gehts: Geschrieben : 'Ar' -> Möglich: Armeise --> Apfel fliegt aus der liste.)

So wirst du die durchläufe ziemlich heftig minimieren können. Mit der raus-kick-methode hast du sogar die möglichkeit, die durchläufe auf eine hand voll zu verringern.
Es bringt nix, wörter mit 'A' am anfang zu prüfen, wenn man Z eingetippt hat.

Gruß, PhillipK

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group