Scintilla - Automatischer Zeileneinzug

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
iostream
Beiträge: 109
Registriert: 15.06.2008 12:59

Scintilla - Automatischer Zeileneinzug

Beitrag 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
OS: Windows 8.1 Pro
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Re: Scintilla - Automatischer Zeileneinzug

Beitrag von Josef Sniatecki »

Gutes Beispiel mit Scintilla. Kann ich gut gebrauchen. :allright:
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Scintilla - Automatischer Zeileneinzug

Beitrag von Andesdaf »

danke :allright:
Win11 x64 | PB 6.20
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Scintilla - Automatischer Zeileneinzug

Beitrag von RSBasic »

@iostream
Sehr nützlich :allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
tmjuk
Beiträge: 380
Registriert: 30.06.2006 00:10
Wohnort: Backaryd, Schweden

Re: Scintilla - Automatischer Zeileneinzug

Beitrag 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
PB 4.51 32 Windows Vista, 32 XP, PB 4.51 32 Ubuntu 10.10
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Scintilla - Automatischer Zeileneinzug

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
tmjuk
Beiträge: 380
Registriert: 30.06.2006 00:10
Wohnort: Backaryd, Schweden

Re: Scintilla - Automatischer Zeileneinzug

Beitrag 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
PB 4.51 32 Windows Vista, 32 XP, PB 4.51 32 Ubuntu 10.10
Christian H
Beiträge: 134
Registriert: 18.10.2005 10:22
Wohnort: Welschbillig

Re: Scintilla - Automatischer Zeileneinzug

Beitrag 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
tmjuk
Beiträge: 380
Registriert: 30.06.2006 00:10
Wohnort: Backaryd, Schweden

Re: Scintilla - Automatischer Zeileneinzug

Beitrag 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
PB 4.51 32 Windows Vista, 32 XP, PB 4.51 32 Ubuntu 10.10
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Scintilla - Automatischer Zeileneinzug

Beitrag 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.
Antworten