Scintilla Anfängerfrage

Anfängerfragen zum Programmieren mit PureBasic.
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Scintilla Anfängerfrage

Beitrag von Syntacks_Error »

Edit: Grmps, hat sich erledigt, die zweite 0 muß weg.

Ich mache offenbar etwas grundlegendes falsch. In diesem gering erweiterten Beispiel aus der PB-Hilfe

Code: Alles auswählen

  If OpenWindow(0, 0, 0, 320, 190, "ScintillaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
     If InitScintilla()
       
       ScintillaGadget(0, 10, 10, 300, 170, #Null)
       
       ;Damit soll eigentlich ein Zeilenumbruch erfolgen, tut aber nicht
        ScintillaSendMessage(0,#SCI_SETWRAPMODE,0,#SC_WRAP_WORD)
                
        ; Output set to red color
        ScintillaSendMessage(0, #SCI_STYLESETFORE, 0, RGB(255, 0, 0))
        
        ; Set the initial text to the ScintillaGadget
        ScintillaSendMessage(0, #SCI_SETTEXT, 0, @"Das ist ein besonders langer und interessanter Text...")
        
        
        ; Adding a second line of text with linebreak before
        Text$ = Chr(10) + "Second line"
        ScintillaSendMessage(0, #SCI_APPENDTEXT, Len(Text$), @Text$)
     EndIf
     
     Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
versuche ich mit

ScintillaSendMessage(0,#SCI_SETWRAPMODE,0,#SC_WRAP_WORD)

einen Zeilenumbruch herbeizuführen, geht aber nicht. Was ist falsch?

__________________________________________________
Tags geändert
Quote>Code
09.04.2011
RSBasic
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 Anfängerfrage

Beitrag von ts-soft »

Code: Alles auswählen

If OpenWindow(0, 0, 0, 320, 190, "ScintillaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  If InitScintilla()
    
    ScintillaGadget(0, 10, 10, 300, 170, #Null)
    
    ;Damit soll eigentlich ein Zeilenumbruch erfolgen, tut aber nicht
    ;ScintillaSendMessage(0,#SCI_SETWRAPMODE,0,#SC_WRAP_WORD)
    ScintillaSendMessage(0, #SCI_SETWRAPMODE, #True)    
    ; Output set to red color
    ScintillaSendMessage(0, #SCI_STYLESETFORE, 0, RGB(255, 0, 0))
    
    ; Set the initial text to the ScintillaGadget
    ScintillaSendMessage(0, #SCI_SETTEXT, 0, @"Das ist ein besonders langer und interessanter Text...")
    
    
    ; Adding a second line of text with linebreak before
    Text$ = Chr(10) + "Second line"
    ScintillaSendMessage(0, #SCI_APPENDTEXT, Len(Text$), @Text$)
  EndIf
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Wobei anzumerken ist, in den Aufgaben, für die Scintilla das geeignete Tool ist, ist der WrapMode eher
suboptional.
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
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Re: Scintilla Anfängerfrage

Beitrag von Syntacks_Error »

Ich komme mit demScintillazeuch nicht klar, die Dokumentation ist für einen einfachen Freizeitprogrammierer vom Lande irgendwie nicht ganz optimal ... Brauche zum Glück nur ganz wenige Funktionen, eigentlich nur noch Schriftart, Schriftgröße und Schriftqualität (Das mit dem Wrappen wird schon gehen, da geht es um ganz kurze Texte), das klappt aber alles nicht:

Code: Alles auswählen

   If OpenWindow(0, 0, 0, 320, 190, "ScintillaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
    ; So etwas soll herauskommen:
    ;PB: font = LoadFont(#PB_Any,"Tahomina",9,#PB_Font_HighQuality) 
      
      If InitScintilla()
       ScintillaGadget(0, 10, 10, 300, 170, #Null)
      
       ;SCI_STYLESETFONT(int styleNumber, const char *fontName)
       ; Was ist denn die styleNumber?
       font$ = "Tahomina"
       ScintillaSendMessage(0, #SCI_STYLESETFONT,1,@font$); Geht nicht
       
       ;Das sollte doch wohl die Textgröße sein, ändert aber nur den Zeilenabstand?
       ;SCI_STYLESETSIZE(int styleNumber, int sizeInPoints); 
        ScintillaSendMessage(0,#SCI_STYLESETSIZE,1, 30)
       
       ;#SCI_SETFONTQUALITY(int fontQuality)
        ScintillaSendMessage(0, #SCI_SETFONTQUALITY, #SC_EFF_QUALITY_LCD_OPTIMIZED);
       ; Ergibt einen Konstante nicht gefunden-Fehler!
   
        ;Ab hier geht's
        ScintillaSendMessage(0,#SCI_SETWRAPMODE,#SC_WRAP_WORD,1); geht auch
        ScintillaSendMessage(0, #SCI_STYLESETFORE, 0, RGB(0,0,255)); geht auch
        ScintillaSendMessage(0, #SCI_SETTEXT, 0, @"Das ist ein besonders langer und interessanter Text...")

     EndIf
     
     Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
Wäre dankbar, wenn die Zeilen mit Font, Textgröße und Qualität auch noch korrigiert werden könnten.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Scintilla Anfängerfrage

Beitrag von edel »

Du hast in Scintilla verschiedene Styles. 0 ist Standard, also gleich der erste den du bearbeiten solltest.

Code: Alles auswählen

#SC_EFF_QUALITY_DEFAULT  			= 0
#SC_EFF_QUALITY_NON_ANTIALIASED 	= 1
#SC_EFF_QUALITY_ANTIALIASED 		= 2
#SC_EFF_QUALITY_LCD_OPTIMIZED 	= 3

#SCI_SETFONTQUALITY = 2611 
#SCI_GETFONTQUALITY = 2612

If OpenWindow(0, 0, 0, 320, 190, "ScintillaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	
	If InitScintilla()
		ScintillaGadget(0, 10, 10, 300, 170, #Null)
		
		ScintillaSendMessage(0, #SCI_STYLESETFONT, 0, @"Courier New")
		ScintillaSendMessage(0,#SCI_STYLESETSIZE,0, 20)
		ScintillaSendMessage(0, #SCI_SETFONTQUALITY, #SC_EFF_QUALITY_LCD_OPTIMIZED)
		ScintillaSendMessage(0,#SCI_SETWRAPMODE,#SC_WRAP_WORD, 0)
		ScintillaSendMessage(0, #SCI_STYLESETFORE, 0, RGB(0,0,255))
		ScintillaSendMessage(0, #SCI_SETTEXT, 0, @"Das ist ein besonders langer und interessanter Text...")
		
	EndIf
	
	Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
	
EndIf
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Re: Scintilla Anfängerfrage

Beitrag von Syntacks_Error »

Vielen dank allerseits, das bringt mich schon weiter. Und wie das so ist, hätte ich da eigentlich doch noch ein paar Fragen ;-) Aber, da gibt es ein Problem: Das läßt sich nicht compilieren. Also das geht schon, aber dann ist das Scintilla-Gadget einfach weg? So auch beim Beispiel aus der Hilfe. Muß man da dem Compiler noch etws angeben? Wenn es gar nicht geht, wäre alle Mühe natürlich vergebens.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Scintilla Anfängerfrage

Beitrag von edel »

Das Programm benoetigt die Scintilla.dll, findest du im Compiler-Ordner.
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Re: Scintilla Anfängerfrage

Beitrag von Syntacks_Error »

Ah ja. Wäre vielleicht eine Überlegung, das mit der DLL in der Hilfe zu erwähnen.

Ich habe noch Probleme mit im wesentlichen zwei Punkt:

Text hervorheben geht immerhin, aber immer nur an einer Stelle. Für mehrere Hervorhebungen gibt es offenbar SCI_SETMULTIPLESELECTION mit der Konstante 2563, wenn ich nicht irre, das bewirkt aber nichts. Im Abschnitt Multiple Selection and Virtual Space der Dokumentation steht noch einiges zu SCI_ADDSELECTION(int caret, int anchor) pp., aber das bezieht sich wohl auf Cursorpositionen? Klappt aber auch nicht. Wie geht es richtig?

Merkwürdig ist auch SCI_SETREADONLY, wenn man das auf true setzt, verschwindet der ganze Text, anstatt nur uneditierbar zu werden?

Code: Alles auswählen

 If OpenWindow(0, 0, 0, 320, 200, "ScintillaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
     If InitScintilla()
        ScintillaGadget(0, 10, 10, 300, 280, #Null)
        
        ; Farben zwischen aktueller Position und Anchor
        ForeGround = $00|$00<<8|$ff<<16
        BackGround = $ff|$ff<<8|$ff<<16
        ScintillaSendMessage(0,#SCI_SETSELFORE,#True,ForeGround); Textfarbe Blau
        ScintillaSendMessage(0,#SCI_SETSELBACK ,#True,BackGround); Hintergrund Weiß
                
        ScintillaSendMessage(0,#SCI_SETREADONLY,#False) ; #true läßt gesamten Text verschwinden?
        
        #SCI_SETMULTIPLESELECTION = 2563 ; Konstante in PB nicht definiert
        ScintillaSendMessage(0,#SCI_SETMULTIPLESELECTION,#True); Bewirkt leider nichts
        
        ; Output set To red color
        ScintillaSendMessage(0, #SCI_STYLESETFORE, 0, RGB(255, 0, 0))
        ; Set the initial text To the ScintillaGadget
        text$ = "This is a simple ScintillaGadget with text..." + Chr(10) + Chr(10)
        len = Len(text$)
        pos = len
        ScintillaSendMessage(0,#SCI_SETTEXT, 0, @text$)
        ScintillaSendMessage(0,#SCI_SETCURRENTPOS,0)
        ScintillaSendMessage(0,#SCI_SETANCHOR,10) ; => 10 Anfangsbuchstaben blau,  klappt nur, wenn die unten zweite Textzeile gesperrt wird  und umgekehrt 
               
        ; Adding a second line of text with linebreak before
        Text$ = Chr(10) + "Second line"
        len = Len(text$)
        ScintillaSendMessage(0,#SCI_APPENDTEXT, Len, @Text$)
        ScintillaSendMessage(0,#SCI_SETCURRENTPOS,pos) 
        ScintillaSendMessage(0,#SCI_SETANCHOR,pos + 10) ; => 10 Anfangsbuchstaben blau
     EndIf
     
     
     Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
Hoffel die Geduld nicht überzustrapazieren.
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 Anfängerfrage

Beitrag von ts-soft »

Syntacks_Error hat geschrieben:Merkwürdig ist auch SCI_SETREADONLY, wenn man das auf true setzt, verschwindet der ganze Text, anstatt nur uneditierbar zu werden?
Mit SetReadOnly wird Scintilla nicht nur uneditierbar, sondern es kann auch programmtechnisch kein
Text hinzugefügt werden! Es ist also komplett für Text gesperrt.
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
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: Scintilla Anfängerfrage

Beitrag von edel »

Was genau moechtest du eigentlich?
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Re: Scintilla Anfängerfrage

Beitrag von Syntacks_Error »

Vornehm ausgedrückt wäre das wohl ein "text retrieval" Progamm, das zahllose kleine Dateien (Die fleißige Mitarbeiter in Unmengen anlegen) nach Stichworten durchsucht. Index und Suche arbeiten immerhin mit einer Wortstammfunktion (Funktioniert aber bislang nur bei Substantiven ganz gut, die Deutsche Konjugation ist ein Graus) und mit einer automatischen Bewertungsfunktion (Gutes kommt nach vorne, theoretisch zumindest), deren Ergebnis durch die Nutzer auch überschrieben werden kann. Das ganze natürlich, wie sich das heute gehört, im Netzwerk. - Das habe ich schon als reine PB-Lösung, funktionert sogar besser als gedacht, nur die Darstellung der Suchergebnisse ist etwas unbefriedigend: Keine veränderliche Zeilenbreite, Ausgabe nur je eines Treffers, den nächsten gibt es erst nach einem Click, Schriftqualität nicht berauschend, obwohl als Grafik geschrieben. Dachte mir, daß da eine Ausgabe mit Scintilla ohne großen Aufwand (Öhm) wesentlich flexibler ist. - Beim Hervorheben geht es darum, daß einmal so eine Art Kategorie und dann die Suchwörter markiert werden, um die Ausgabe ein bißchen zu strukturieren. - Enhalten ist auch eine Komponente zur Bewertung der Datensätze (Die wird dann bei der Reihenfolge der Ausgabe berücksichtigt), ich habe aber bisher keine Vorstellung, wie ich die bei Scintilla überhaupt zuordnen kann, wenn mehrere in einem Scrollbereich erscheinen ...
Antworten