Seite 1 von 1

Codeoptimierung

Verfasst: 20.03.2013 22:49
von Josh
Ich habe einen VBS Code, der in einem Scintillagadget dargestellt wird. Der Code wird durch die Scripmachine gestylt, allerdings muss ich das Styling der Scripmaschine auf das Styling des Scintillagadgets umsetzen.

Die Werte müssen von Word auf Byte umgestellt werden und die Werte anders gesetzt werden. Das mache ich in der Prozedur unter "Attribute der Scriptengine für Scintilla umsetzen". Kann ich den Code zum Umsetzen performanter gestalten?

Code: Alles auswählen

  EnableExplicit

  Procedure.i GetScriptTextAttributes (Code.s)
   ;Gibt einen Zeiger auf die Textattribute zurück, die direkt in Scintilla verwendet
   ;werden können. Der übergebene Speicher ist vom Aufrufer freizugeben..
    Define *CodeAttsB
    Define *CodeAttsW
    Define lenCode.i
    Define valW   .i
    Define i      .i

   ;Simulation des Ergebnisses das normal von der Scriptmachine kommt
    DataSection
      CodeAttsW:
      Data.w $0001, $0001, $0001, $0000, $0100, $0100, $0100, $0100, $0000, $0000
      Data.w $0000, $0000, $0000, $0000, $0100, $0100, $0100, $0100, $0100, $0100
      Data.w $0000, $0020, $0020, $0020, $0020, $0020, $0020, $0020, $0020, $0020
      Data.w $0020, $0020, $0020, $0000, $0000, $0001, $0001, $0001, $0001, $0001
      Data.w $0001, $0001, $0000, $0000
    EndDataSection
    *CodeAttsW = ?CodeAttsW

   ;Attribute der Scriptengine für Scintilla umsetzen
    LenCode = Len (Code)
    *CodeAttsB = AllocateMemory (LenCode)
    For i = 0 To LenCode - 1
      valW = PeekW (*CodeAttsW + i * 2)
      Select valW
        Case    0 : valW = 1
        Case    1 : valW = 2
        Case    2 : valW = 3
        Case    4 : valW = 4
        Case    8 : valW = 5
        Case   16 : valW = 6
        Case   32 : valW = 7
        Case  256 : valW = 8
        Case  512 : valW = 9
        Case 1024 : valW =10
      EndSelect
      PokeB (*CodeAttsB + i, valW)
    Next i

    ProcedureReturn *CodeAttsB

  EndProcedure

  Define *CodeAtts
  Define Code     .s
  Define CodeUtf8 .s
  Define i        .i

 ;Prüfen ob Programm in Unicode compiliert
  If #PB_Compiler_Unicode = #False
    MessageRequester ("", "Unicode erforderlich")
    End
  EndIf

 ;Window und Gadget erstellen
  InitScintilla()
  OpenWindow     (0,  0,  0, 500, 500, "Scintilla", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ScintillaGadget(0,  0,  0, WindowWidth(0), WindowHeight(0), 0)
  ScintillaSendMessage (0, #SCI_SETCODEPAGE, #SC_CP_UTF8)

 ;Farbcodes für Scintilla setzen
  ScintillaSendMessage (0, #SCI_STYLESETFORE  , 0, $000000) ;Standardstyle
  ScintillaSendMessage (0, #SCI_STYLESETFORE  , 1, $000000) ;Allgemeine Zeichen
  ScintillaSendMessage (0, #SCI_STYLESETFORE  , 2, $C00000) ;Schlüsselwörter
  ScintillaSendMessage (0, #SCI_STYLESETFORE  , 3, $008000) ;Kommentare
  ScintillaSendMessage (0, #SCI_STYLESETFORE  , 5, $000000) ;Operatoren
  ScintillaSendMessage (0, #SCI_STYLESETFORE  , 6, $800080) ;Nummern
  ScintillaSendMessage (0, #SCI_STYLESETFORE  , 7, $909090) ;Texte
  ScintillaSendMessage (0, #SCI_STYLESETFORE  , 8, $000000) ;Sonstiges
  ScintillaSendMessage (0, #SCI_STYLESETFORE  , 9, $000000) ;Punkt bei Objekten
  ScintillaSendMessage (0, #SCI_STYLESETFORE  ,10, $000000) ;ME Objekt

 ;Sci Code hinzufügen
  Code = "Sub Main()" + #CRLF$
  Code + "  MsgBox " + #DQUOTE$ + "Hallo Welt" + #DQUOTE$ + #CRLF$
  Code + "End Sub" + #CRLF$
  CodeUtf8 = Space (StringByteLength (Code, #PB_UTF8))
  PokeS (@CodeUtf8, Code, -1, #PB_UTF8)
  ScintillaSendMessage(0, #SCI_SETTEXT, 0, @CodeUtf8)

 ;Codeattribute erstellen
  *CodeAtts = GetScriptTextAttributes (Code)

 ;Sci Code stylen
  ScintillaSendMessage (0, #SCI_STARTSTYLING, 0, 31)
  ScintillaSendMessage (0, #SCI_SETSTYLINGEX, Len(Code), *CodeAtts)

 ;Freigaben
  FreeMemory (*CodeAtts) : *CodeAtts = 0

  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

Re: Codeoptimierung

Verfasst: 20.03.2013 23:05
von NicTheQuick
Statt dem Select könntest du dir ein Array mit 1025 Einträgen erstellen, dass beim entsprechenden Eintrag auf den passenden Wert mapt.

Code: Alles auswählen

Dim codeMap.i(1025)
Define i.i
codeMap(0) = 1
codeMap(1) = 2
codeMap(2) = 3
codeMap(4) = 4
codeMap(8) = 5
codeMap(16) = 6
codeMap(32) = 7
codeMap(256) = 8
codeMap(512) = 9
codeMap(1024) = 10

LenCode = Len (Code)
*CodeAttsB = AllocateMemory (LenCode)
For i = 0 To LenCode - 1
	PokeB (*CodeAttsB + i, codeMap(PeekW (*CodeAttsW + i * 2)))
Next i
Ist das korrekt, dass "Case 64" und "Case 128" fehlen?

Re: Codeoptimierung

Verfasst: 20.03.2013 23:48
von Josh
Oh ja danke, das könnte einiges bringen. In den meisten Fällen werden zwar nur Teilbereiche des Codes gestylt, aber in einigen Fällen ist ein komplettes Styling erforderlich. Das kann bei längeren Codes schon etwas Zeit beanspruchen, weshalb ich hier unbedingt optimieren will.
NicTheQuick hat geschrieben:Ist das korrekt, dass "Case 64" und "Case 128" fehlen?
Das ist bedingt korrekt. Bei entsprechend gesetzten Parameter würde mir die Scriptmachine mit Code 64 z.B. angeben, dass hier ein Funktionsblock beginnt. In meiner Version habe ich das aus Performancegründen vorerst weggelassen. Mit deinem System spielt es keine Rolle, wenn ich das mit einbaue und den Code 64 dann wieder auf 2 umsetze. Muss ich mir noch überlegen, ob ich damit vielleicht das Folding auf einen Schlag mit erledigen kann. Soweit bin ich aber noch nicht.