Richedit-eigenschaften

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
CodeCommander
Beiträge: 213
Registriert: 02.03.2014 16:06

Beitrag von CodeCommander »

~ DELETE ~
Zuletzt geändert von CodeCommander am 18.01.2015 14:41, insgesamt 1-mal geändert.
~ DELETE ~
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Richedit-eigenschaften

Beitrag von stevie1401 »

Danke für die Tips, ich werde es später ausprobieren.
C&P ist bei uns im Chat vollkommen unwichtig. Wir wollen Doppelkopf spielen und nebenbei etwas quatschen.
Wenn man die Textausrichtung/Wordwrap allerdings besser mit Scintilla hinbekommt, so wäre das natürlich ein schlagendes Argument :-)
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Richedit-eigenschaften

Beitrag von stevie1401 »

Auch nach aktivem Suchen finde ich keine geeignete Hilfe über Scintilla bzw. dessen Handhabung.
Die ScintillaSendMessage-Befehle sind hier nicht dokumentiert und anscheinend funktionieren sie auch nicht wirklich.

Ich schaffe es tatsächlich nicht,in einem Scintilla-Gadget einzelne Zeilen andersfarbig darzustellen.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
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: Richedit-eigenschaften

Beitrag von ts-soft »

http://www.scintilla.org/

http://www.scintilla.org/ScintillaDoc.html

und natürlich das oder die Foren, z.B.:
http://www.purebasic.fr/german/viewtopic.php?t=19580

Ich glaube aber nicht, das Du dort so fündig wirst.
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
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Richedit-eigenschaften

Beitrag von stevie1401 »

MIt GFA-Basic füge ich einen farbigen Text einer Richedit so hinzu:

Code: Alles auswählen

  newText="Dies ist eine farbige Zeile"
  farbe=RGB(0,255,0)
  i = Len(lobbychatEdi.Text)
  lobbychatEdi.SelStart = i
  lobbychatEdi.SelLength = Len(newText)
  lobbychatEdi.SelColor = farbe
  lobbychatEdi.SelText = newText
Auch nach intensiven Suchen finde ich nichts gleichwertiges in den, nunja, kann man das wirklich Beschreibungen nennen, der Scintilla-Seiten.

Kann mir jemand ein begreifbares Beispiel geben?
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Richedit-eigenschaften

Beitrag von Danilo »

stevie1401 hat geschrieben:Kann mir jemand ein begreifbares Beispiel geben?
Habe mal schnell dieses Beispiel von freak etwas abgeändert.

Code: Alles auswählen

Procedure SciColorLine(gadget, line, style)
    ScintillaSendMessage(gadget, #SCI_STARTSTYLING, ScintillaSendMessage(gadget,#SCI_POSITIONFROMLINE,line), $FF)
    ScintillaSendMessage(gadget, #SCI_SETSTYLING, ScintillaSendMessage(gadget,#SCI_LINELENGTH,line), style)
EndProcedure

If OpenWindow(0, 0, 0, 400, 500, "ScintillaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  If InitScintilla()
    ScintillaGadget(0, 10, 10, 380, 480, 0)
    
    ; set text
    *Buffer = AllocateMemory(1000)
    PokeS(*Buffer, "Zeile 1" + Chr(10) + "Zeile 2" + Chr(10) + "Zeile 3" + Chr(10) + "Zeile 4" + Chr(10), -1, #PB_Ascii)
    ScintillaSendMessage(0, #SCI_SETTEXT, 0, *Buffer)
    
    ; normaler text style (style 0)
    PokeS(*Buffer, "Lucida Console", -1, #PB_Ascii)
    ScintillaSendMessage(0, #SCI_STYLESETFONT, 0, *Buffer)
    ScintillaSendMessage(0, #SCI_STYLESETSIZE, 0, 14)
    
    ; Style 1 erstellen, gruen
    ScintillaSendMessage(0, #SCI_STYLESETFONT, 1, *Buffer)
    ScintillaSendMessage(0, #SCI_STYLESETSIZE, 1, 14)
    ScintillaSendMessage(0, #SCI_STYLESETFORE, 1, RGB(0,255,0))
    
    ; Style 2 erstellen, rot
    ScintillaSendMessage(0, #SCI_STYLESETFONT, 2, *Buffer)
    ScintillaSendMessage(0, #SCI_STYLESETSIZE, 2, 14)
    ScintillaSendMessage(0, #SCI_STYLESETFORE, 2, RGB(255,0,0))
    
    ; Style 3 erstellen, blau
    ScintillaSendMessage(0, #SCI_STYLESETFONT, 3, *Buffer)
    ScintillaSendMessage(0, #SCI_STYLESETSIZE, 3, 14)
    ScintillaSendMessage(0, #SCI_STYLESETFORE, 3, RGB(0,0,255))
    
    ; Styles für Zeilen setzen
    SciColorLine(0,0,1)
    SciColorLine(0,1,2)
    SciColorLine(0,2,3)
  EndIf
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Für Scintilla gibt es viele Beispiele in den Foren, und auch Befehlssammlungen/Libs. Suche mal im engl. Forum nach "GoScintilla".

Hier noch ein anderes Beispiel von mir.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Richedit-eigenschaften

Beitrag von stevie1401 »

Leider verstehe ich auch nach mehrmaligen sinnbefreiten Ausprobieren die Syntax nicht.
Kannst du bitte mal schnell es so umändern, dass jede neue Zeile eine zufällige Farbe bekommt?
Ich verstehe Scintilla nicht einmal ansatzweise, weil es leider keine Beschreibung für die einzelnen Befehle gibt.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Richedit-eigenschaften

Beitrag von Danilo »

Scintilla arbeitet mit Styles. Es gibt 256 (0-255) Styles, und für jeden Style kann man Eigenschaften setzen:
Vordergrundfarbe, Hintergrundfarbe, Font, Fontgröße, Unterstreichung an/aus, Schrägschrift an/aus, Fettschrift an/aus, usw.
Da es nur 256 Styles gibt, kann man also nur 256 verschiedene Farben haben.
Du brauchst nur 3 Farben, und genau das macht der obige Code: 3 Farben für 3 Styles setzen. Danach kann man
bestimmten Textteilen diese definierten Styles zuweisen.

In früheren Versionen hatte man 32 Styles (0-31) zur Verfügung. Die anderen Bits wurden für andere Sachen benutzt.
Ich habe es jetzt mal nur mit 32 Styles gemacht. Eventuell geht es bei PB 5.3x mit 256 Styles, da dort (glaube ich)
ein Update von Scintilla dabei war.

Code: Alles auswählen

Procedure SciText(text.s)
    Static *Buffer
    If Not *Buffer
        *Buffer = AllocateMemory(1024 * 10)
    EndIf
    PokeS(*Buffer, text, -1, #PB_Ascii)
    ProcedureReturn *Buffer
EndProcedure

Procedure SciColorLine(gadget, line, style)
    ScintillaSendMessage(gadget, #SCI_STARTSTYLING, ScintillaSendMessage(gadget,#SCI_POSITIONFROMLINE,line), $FFFF)
    ScintillaSendMessage(gadget, #SCI_SETSTYLING, ScintillaSendMessage(gadget,#SCI_LINELENGTH,line), style)
EndProcedure

Procedure SciAddLineWithStyle(gadget, text$, style)
    text$ + Chr(10)
    ScintillaSendMessage(gadget, #SCI_SETSEL,-1,-1)
    line = ScintillaSendMessage(gadget, #SCI_LINEFROMPOSITION, ScintillaSendMessage(gadget,#SCI_GETCURRENTPOS))
    ScintillaSendMessage(gadget, #SCI_APPENDTEXT, Len(text$),SciText(text$))
    SciColorLine(gadget, line, style)
EndProcedure

RandomSeed(1111)

If OpenWindow(0, 0, 0, 800, 600, "ScintillaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  If InitScintilla()
    ScintillaGadget(0, 10, 10, 780, 580, 0)
    
    ; Init und Standardfont setzen
    ScintillaSendMessage(0, #SCI_STYLERESETDEFAULT)
    ScintillaSendMessage(0, #SCI_STYLESETFONT,#STYLE_DEFAULT, SciText("Arial"))
    ScintillaSendMessage(0, #SCI_STYLESETSIZE,#STYLE_DEFAULT, 24)
    ScintillaSendMessage(0, #SCI_STYLECLEARALL)
    
    ; die styles initialisieren / Farben setzen
    For style = 0 To 31
        ScintillaSendMessage(0, #SCI_STYLESETFORE, style, RGB( Random(255), Random(255), Random(255) ) ) ; Vordergrundfarbe für den Style setzen
        ;ScintillaSendMessage(0, #SCI_STYLESETBACK, style, RGB( Random(255), Random(255), Random(255) ) ) ; Hintergrundfarbe für den Style setzen
    Next
    
    ; Zeilen hinzufügen
    For i = 0 To 31
        SciAddLineWithStyle(0, "Eine neue Zeile..."+Str(i), Random(31))
    Next

  EndIf
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Die Dokumentation für Scintilla ist, wie ts-soft schon sagte, auf http://www.scintilla.org/ScintillaDoc.html
Das ist die komplette Dokumentation für die aktuellste Scintilla-Version, allerdings ist sie für die Programmiersprache C.

Alles ziemlich kompliziert, aber dafür recht mächtiges (freies) Editor-Gadget.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
stevie1401
Beiträge: 700
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Richedit-eigenschaften

Beitrag von stevie1401 »

Danke für deine Hilfe.

Ich habe die Nacht über versucht das alles zu verstehen und folgendes ist dabei herausgekommen:

Code: Alles auswählen


EnableExplicit

Global Dim ScintillaRememberColorString.s(3,500)
Global Dim ScintillaRememberColorCount(3)

Declare CheckScintillaColor(GadgetNo,aColor)
Declare ScintillaAddColoredLine(ScintillaNo,aText.s,aColor)
Define l,i,txtLen,startpos,r,g,b,col,ScNo,ColStyle,nlen
Define text.s,scin1txt.s,ScintillaNo

ScNo=1


If OpenWindow(0, 0, 0, 600, 600, "ScintillaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

    If InitScintilla()
        ScintillaGadget(1, 10, 10, 250, 400, #Null)
        ScintillaSendMessage(ScNo, #SCI_SETWRAPMODE, #True)    
         For i=1 To 200  
           col=RGB(Random(200,1),Random(200,1),Random(200,1))
           ScintillaAddColoredLine(1,"Das ist eine längere Zeile, um Wprapmode und die Zeile zu testen.Dies ist übrigens Zeile: "+Str(i),col)
         Next i
      
        
        
       EndIf
      Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
    EndIf 
    Procedure ScintillaAddColoredLine(ScintillaNo,aText.s,aColor)
      Protected ColStyle,startpos,txtlen,i
      Protected.s text
      text=aText+Chr(10)
        ColStyle=CheckScintillaColor(ScintillaNo,aColor)
         
         startpos=ScintillaSendMessage(ScintillaNo,#SCI_GETLENGTH) -1
        
        txtlen = Len(text)
        ScintillaSendMessage(ScintillaNo, #SCI_APPENDTEXT, txtlen, @Text)
        ScintillaSendMessage(ScintillaNo,#SCI_STARTSTYLING,startpos,255)
        ScintillaSendMessage(ScintillaNo,#SCI_SETSTYLING,txtlen,ColStyle)
        
     
      
    EndProcedure
    
    Procedure CheckScintillaColor(GadgetNo,aColor)
      Protected i,foundColor,StyleNumber
      
      For i=1 To ScintillaRememberColorCount(GadgetNo)
        If ScintillaRememberColorString(GadgetNo,i)=Str(aColor)  ;Die Farbe gibt es schon im ScintillaGadget
          foundColor=aColor
          StyleNumber=i
        EndIf
      Next i
      If foundColor=0
        ScintillaRememberColorCount(GadgetNo)+1
        StyleNumber=ScintillaRememberColorCount(GadgetNo)
        ScintillaRememberColorString(GadgetNo,StyleNumber)=Str(aColor)
        ScintillaSendMessage(GadgetNo, #SCI_STYLESETFORE, StyleNumber, aColor)
      EndIf
      
     ProcedureReturn StyleNumber
  
    EndProcedure
    




Ich bekomme allerdings nach der 31. Farbe (Style) Fehler.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Richedit-eigenschaften

Beitrag von Danilo »

stevie1401 hat geschrieben:Ich bekomme allerdings nach der 31. Farbe (Style) Fehler.
Das ist bei mir auch so, mit PB 5.2x LTS. Benutzt Du schon PB 5.31?
Da Du eh nur 3 Farben brauchst, reichen doch 32 (0-31) aus.

Das aktuellste Scintilla scheint da etwas geändert zu haben, so dass man
nun 256 Styles zur Verfügung hat.
Allerdings weiss ich nicht ob das wirklich aktuellste Scintilla in PB 5.31 integriert ist.
Wenn nicht, musst Du wohl mit den 32 Farben leben. Ich bekomme immer Unterstreichungen
wenn ich mehr als 32 Styles verwende. Auf dem Mac kommen dann auch noch Display-Fehler
hinzu, so dass man nach dem scrollen nach oben dauernd Graue Linien sieht, die erst verschwinden
wenn man rechts/links scrollt.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten