Seite 1 von 2

Scintilla - Automatischer Zeileneinzug

Verfasst: 11.09.2009 19:46
von iostream
Da ich das auch öfters selbst brauche und da soweit ich weiß kein automatischer Zeileneinzug vorab implementiert ist,
hier mal der Code für automatischen Zeileneinzug in einem Scintilla-Gadget.

Code: Alles auswählen

; Implementation of autoindent in a scintilla gadget.
;
; Author: iostream
; Date: 11.9.2009
; Compiler: PB 4.40 Beta 2
; OS: Windows / Unix / MacOS
; String-Version: ASCII

EnableExplicit

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

If Not InitScintilla()
	MessageRequester("Error", "Can't initialize Scintilla.")
	End
EndIf

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

CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
	#NewlineChar = 13
CompilerElse
	#NewlineChar = 10
CompilerEndIf

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

Procedure.s GetLineIndent(ScintillaGadget, Line)
	Protected Indent.s = ""
	Protected Temp.s = ""
	Protected *LineBuffer.Character = #Null
	
	If Line >= 0
		Temp = Space(ScintillaSendMessage(ScintillaGadget, #SCI_LINELENGTH, Line))
		ScintillaSendMessage(ScintillaGadget, #SCI_GETLINE, Line, @Temp)
		*LineBuffer = @Temp
	
		While *LineBuffer\c = 9 Or *LineBuffer\c = 32
			Indent + Chr(*LineBuffer\c)
			*LineBuffer + SizeOf(Character)
		Wend
	EndIf
	
	ProcedureReturn Indent
EndProcedure

Procedure ScintillaCallback(ScintillaGadget, *Notify.SCNotification)
	Protected Line = 0
	Protected Indent.s = ""
	
	If *Notify\nmhdr\code = #SCN_CHARADDED
		If *Notify\ch = #NewlineChar
			Line = ScintillaSendMessage(ScintillaGadget, #SCI_LINEFROMPOSITION,ScintillaSendMessage(ScintillaGadget, #SCI_GETCURRENTPOS))
			Indent = GetLineIndent(ScintillaGadget, Line - 1)
			ScintillaSendMessage(ScintillaGadget, #SCI_REPLACESEL, 0, @Indent)
		EndIf
	EndIf
EndProcedure

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

If OpenWindow(0, 0, 0, 500, 300, "Scintilla", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	RemoveKeyboardShortcut(0, #PB_Shortcut_Tab)
	ScintillaGadget(1, 10, 10, 480, 280, @ScintillaCallback())
	Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Re: Scintilla - Automatischer Zeileneinzug

Verfasst: 12.09.2009 12:51
von Josef Sniatecki
Gutes Beispiel mit Scintilla. Kann ich gut gebrauchen. :allright:

Re: Scintilla - Automatischer Zeileneinzug

Verfasst: 12.09.2009 13:56
von Andesdaf
danke :allright:

Re: Scintilla - Automatischer Zeileneinzug

Verfasst: 12.09.2009 14:03
von RSBasic
@iostream
Sehr nützlich :allright:

Re: Scintilla - Automatischer Zeileneinzug

Verfasst: 05.04.2010 02:40
von tmjuk
Hallo,

ich würde sehr gern den Code verwenden, aber er weigert sich zu funktionieren.
Irgendwie steh ich wohl auf dem Schlauch. /:->

Also beim Eingeben einer neue Zeile wird die aktuelle Zeilennummer festgestellt und
es wird zu der Prozedur gesprungen:

Code: Alles auswählen

Procedure.s GetLineIndent(ScintillaGadget, Line)
Mittels

Code: Alles auswählen

Temp = Space(ScintillaSendMessage(ScintillaGadget, #SCI_LINELENGTH, Line))
      ScintillaSendMessage(ScintillaGadget, #SCI_GETLINE, Line, @Temp)
wird Temp Leerzeichen zugewiesen und die Zeichen der Zeile hinein geschrieben.

Aber

Code: Alles auswählen

While *LineBuffer\c = 9 Or *LineBuffer\c = 32
erkennt kein TAB und auch kein Leerzeichen.

Kann mir bitte jemand weiterhelfen?

Danke
Torsten

Re: Scintilla - Automatischer Zeileneinzug

Verfasst: 05.04.2010 02:57
von ts-soft
@Torsten

Was funktioniert bei Dir nicht? Ich habs jetzt getestet und der Code funktioniert sowohl
unter Windows, wie auch Linux, allerdings nicht im Unicode-Mode.

Gruß
Thomas

Re: Scintilla - Automatischer Zeileneinzug

Verfasst: 05.04.2010 03:04
von tmjuk
Danke Tomas,

UniCode war der Hemmschuh.
Hätte ich eigentlich auch drauf kommen können.

Edit: Und wie könnte man den Code zu UniCode "portieren"?

Torsten

Re: Scintilla - Automatischer Zeileneinzug

Verfasst: 05.04.2010 08:48
von Christian H
tmjuk hat geschrieben:UniCode war der Hemmschuh....Und wie könnte man den Code zu UniCode "portieren"?
Versuchs mal mit

Code: Alles auswählen

ScintillaSendMessage(1, #SCI_SETCODEPAGE, 65001)
Gruß Christian

Re: Scintilla - Automatischer Zeileneinzug

Verfasst: 06.04.2010 16:44
von tmjuk
Christian H hat geschrieben:
tmjuk hat geschrieben:UniCode war der Hemmschuh....Und wie könnte man den Code zu UniCode "portieren"?
Versuchs mal mit

Code: Alles auswählen

ScintillaSendMessage(1, #SCI_SETCODEPAGE, 65001)
Gruß Christian
Funktioniert leider nicht

Torsten

Re: Scintilla - Automatischer Zeileneinzug

Verfasst: 06.04.2010 18:08
von Josh
Christian H hat geschrieben:
tmjuk hat geschrieben:UniCode war der Hemmschuh....Und wie könnte man den Code zu UniCode "portieren"?
Versuchs mal mit

Code: Alles auswählen

ScintillaSendMessage(1, #SCI_SETCODEPAGE, 65001)
Gruß Christian
ähhh, meinst du den code, den du an das scintillagadget übergibst? nach meinem wissensstand muss der entweder ascii oder utf8 sein.