Seite 6 von 6

Re: Richedit-eigenschaften

Verfasst: 08.11.2014 22:29
von Danilo
Es gibt noch:

Code: Alles auswählen

firstExtendedStyle = ScintillaSendMessage(0, #SCI_ALLOCATEEXTENDEDSTYLES, 1000)
Das reserviert 1000 neue Styles.

Wurde allerdings erst mit Scintilla 3.2.5 hinzugefügt.
Die aktuelle Version von Scintilla ist 3.5.1, und die Dokumentation auf der Website ist für diese aktuelle Version.
PB 5.3x enthält Scintilla 3.4.2
PB 5.2x LTS enthält irgend eine alte Version, weiss aber nicht welche (hier wäre eine Function ScintillaVersion() wünschenswert, vom PB Team).

EDIT: Mit PB 5.0 wurde Scintilla 3.2.2 hinzugefügt, das müsste auch noch die Version von 5.2x LTS sein.

Re: Richedit-eigenschaften

Verfasst: 09.11.2014 11:26
von Shardik
ts-soft hat geschrieben:Es würde ja auch mit RichEdit gehen, aber dann wären gleich 3 sehr unterschiedliche API beteiligt und das wäre dann eventuell noch komplizierter.
Du mußt hier zwischen einer nativen API-Lösung und RichText unterscheiden. Ich hatte in diesem Thread ja schon einmal dieses EditorGadget-Beispiel gezeigt, das RichText verwendet und sich daher ganz leicht auch auf MacOS erweitern läßt (MacOS bietet Unterstützung für den von Microsoft entwickelten RichText-Standard), aber für Linux einen viel größeren Aufwand erfordern würde, weil Linux ohne externe Bibliotheken (die man im Internet findet) oder selbst programmierte komplexere Prozeduren den RichText-Standard nicht unterstützt. Dein Beispiel (von freak), das Du direkt hinter meinem gezeigt hast, benutzt hingegen API-Funktionen (von Windows), um Textformatierungen anzuzeigen, die natürlich auf jedem Betriebssystem (im Gegensatz zum RichText-Standard) unterschiedlich sind.

Re: Richedit-eigenschaften

Verfasst: 09.11.2014 11:31
von stevie1401
Na, dann machen wir mal einfach weiter, weils doch so schön ist.
Wir haben eine Pinnwand, auf der jeder etwas schreiben kann.
Eigentlich wollte ich dafür ein einfaches EditorGadget nehmen, weil wir dafür keine mehrfarbige Schrift brauchen, aber das Scrollen zum Ende des Textes geht anscheinend nur sehr schwierig unter allen 3 Plattformen.

Also wollte ich ein ScintillaGadget nehmen.

Code: Alles auswählen


If InitScintilla()
  PinnwandEdi=ScintillaGadget(#PB_Any, 20,20,pw-50,ph-250, #Null)
  ScintillaSendMessage(PinnwandEdi, #SCI_SETWRAPMODE, #True)  
  ScintillaSendMessage(PinnwandEdi, #SCI_STYLESETBACK,#STYLE_DEFAULT , ButtonForeColor)
  ScintillaSendMessage(PinnwandEdi, #SCI_STYLESETFORE,#STYLE_DEFAULT , ButtonBackColor)
EndIf 

Ich füge den gesammten Pinnwandtext so hinzu:

Code: Alles auswählen

  txtlen = Len(text)
  ScintillaSendMessage(PinnwandEdi, #SCI_ADDTEXT, txtlen, @Text)  
 
;Da der Text, obwohl Default als Hintergrund eine Farbe hat und die Standartschriftfarbe 
auch geändert wurde dennoch nur weisser Hintergrund und schwarze Schrift ist, wollte ich nachträglich den Text färben:

  ScintillaSendMessage(PinnwandEdi,#SCI_STARTSTYLING,1,255)
  ScintillaSendMessage(PinnwandEdi,#SCI_SETSTYLING,txtlen+1,#STYLE_DEFAULT)
Nun habe ich aber für den gesamten Editor eine bestimmt Hintergrundfarbe und eine bestimmte Schriftfarbe.
Ich schaffe es leider auch nach sehr vielen Versuchen nicht den gesamten Text zu färben.

Re: Richedit-eigenschaften

Verfasst: 09.11.2014 12:19
von ts-soft
Nicht direkt zu Deiner Frage, aber wichtig:
stevie1401 hat geschrieben:

Code: Alles auswählen

  txtlen = Len(text)
  ScintillaSendMessage(PinnwandEdi, #SCI_ADDTEXT, txtlen, @Text)
Das wird spätestens bei Unicode Probleme bereiten, besser so:

Code: Alles auswählen

Procedure MakeScintillaText(text.s)
  Static sciText.s
  CompilerIf #PB_Compiler_Unicode
    sciText = Space(StringByteLength(text, #PB_UTF8))
    PokeS(@sciText, text, -1, #PB_UTF8)
  CompilerElse
    sciText = text
  CompilerEndIf
  ProcedureReturn @sciText
EndProcedure

txtlen = Len(text)
ScintillaSendMessage(PinnwandEdi, #SCI_ADDTEXT, txtlen, MakeScintillaText(text))
Die Procedure MakeScintillaText findest auch in der Hilfe.
Noch besser wäre es, wenn Du das Scintilla von Hause aus nach UTF-8 setzt:

Code: Alles auswählen

ScintillaSendMessage(PinnwandEdi, #SCI_SETCODEPAGE, #SC_CP_UTF8)
und entsprechend:

Code: Alles auswählen

Procedure MakeScintillaText(text.s)
  Static sciText.s
    sciText = Space(StringByteLength(text, #PB_UTF8))
    PokeS(@sciText, text, -1, #PB_UTF8)
  ProcedureReturn @sciText
EndProcedure
txtlen = StringByteLength(text, #PB_UTF8)
Somit haste keine Codepage probleme und beste compatilität, gerade in bezug auf kommende PB-Versionen.

Re: Richedit-eigenschaften

Verfasst: 09.11.2014 12:56
von stevie1401
OK, danke.Im Moment sendet der Server allerdings im ASCII-Modus.

Ich habe das Problem gelöst:

Code: Alles auswählen

If InitScintilla()
  PinnwandEdi=ScintillaGadget(#PB_Any, 20,20,pw-50,ph-250, #Null)
  ScintillaSendMessage(PinnwandEdi, #SCI_SETWRAPMODE, #True)  
  ScintillaSendMessage(PinnwandEdi, #SCI_STYLESETBACK,#STYLE_DEFAULT , ButtonForeColor)  ;<<-- zeichnet das Gadget immerhin in der gewünschten Hintergrundfarbe
  ScintillaSendMessage(PinnwandEdi, #SCI_STYLESETFORE,#STYLE_DEFAULT , ButtonBackColor)  ;<<--Default Schriftfarbe scheint nicht zu funktionieren!!
  ScintillaSendMessage(PinnwandEdi, #SCI_STYLESETBACK,1 , ButtonForeColor)  ;Hier die Änderung, noch einnmal extra einen Style mit Forder- und Hintergrundfarbe erstellen
  ScintillaSendMessage(PinnwandEdi, #SCI_STYLESETFORE,1 , ButtonBackColor)
  
EndIf 
  
  txtlen = Len(text)
  ScintillaSendMessage(PinnwandEdi, #SCI_ADDTEXT, txtlen, @Text)  
 
  ScintillaSendMessage(PinnwandEdi,#SCI_STARTSTYLING,0,255)
  ScintillaSendMessage(PinnwandEdi,#SCI_SETSTYLING,txtlen+1,1) ;gesammten Text mit Style 1 formatieren
  endpos=ScintillaSendMessage(PinnwandEdi,#SCI_GETLENGTH) -1   ;Ende des Texttes finden
  ScintillaSendMessage(PinnwandEdi, #SCI_GOTOPOS, endpos)      ;zum Ende scrollen

Re: Richedit-eigenschaften

Verfasst: 09.11.2014 14:09
von ts-soft
stevie1401 hat geschrieben:OK, danke.Im Moment sendet der Server allerdings im ASCII-Modus.
Da wirste aber schwierigkeiten bekommen, wenn mehrer Länder beteiligt sind und verschiedene Codepages
zum Tragen kommen :wink:

ASCII Windows und ASCII Linux nutzen unterschiedliche Codepages. Bei Mac wahrscheinlich auch.

Lieber von Vornherein UTF-8 oder nur ASCII 0 - 127 nutzen :wink:
Mit PB wird es dann später auch Probleme geben, wenn es dann kein natives ASCII mehr gibt.

Egal, sei gewarnt, ASCII ist tod, es ist nur zu faul umzufallen.

Thomas

Re: Richedit-eigenschaften

Verfasst: 09.11.2014 21:47
von Danilo
stevie1401 hat geschrieben:Ich habe das Problem gelöst:

Code: Alles auswählen

If InitScintilla()
  PinnwandEdi=ScintillaGadget(#PB_Any, 20,20,pw-50,ph-250, #Null)
  ScintillaSendMessage(PinnwandEdi, #SCI_SETWRAPMODE, #True)  
  ScintillaSendMessage(PinnwandEdi, #SCI_STYLESETBACK,#STYLE_DEFAULT , ButtonForeColor)  ;<<-- zeichnet das Gadget immerhin in der gewünschten Hintergrundfarbe
  ScintillaSendMessage(PinnwandEdi, #SCI_STYLESETFORE,#STYLE_DEFAULT , ButtonBackColor)  ;<<--Default Schriftfarbe scheint nicht zu funktionieren!!
  ScintillaSendMessage(PinnwandEdi, #SCI_STYLESETBACK,1 , ButtonForeColor)  ;Hier die Änderung, noch einnmal extra einen Style mit Forder- und Hintergrundfarbe erstellen
  ScintillaSendMessage(PinnwandEdi, #SCI_STYLESETFORE,1 , ButtonBackColor)
  
EndIf 
[...]
Du brauchst am Anfang nur den #STYLE_DEFAULT setzen (Font, Fontgröße, Vorder- und Hintergrundfarbe),
und danach #SCI_STYLECLEARALL aufrufen. Das initialisiert alle Styles mit den gesetzten Werten von #STYLE_DEFAULT.
Alle Styles haben dann also den gleichen Font und die gleichen Farben, so dass Du dann evtl. nur noch die Vordergrundfarben
von ein paar Styles neu setzen musst. Oder zum Beispiel Fettschrift, Schrägschrift usw.

Code: Alles auswählen

If InitScintilla()
  PinnwandEdi=ScintillaGadget(#PB_Any, 20,20,pw-50,ph-250, #Null)
  ScintillaSendMessage(PinnwandEdi, #SCI_SETWRAPMODE, #True)  
  ScintillaSendMessage(PinnwandEdi, #SCI_STYLESETBACK,#STYLE_DEFAULT , ButtonForeColor)  ;<<-- zeichnet das Gadget immerhin in der gewünschten Hintergrundfarbe
  ScintillaSendMessage(PinnwandEdi, #SCI_STYLESETFORE,#STYLE_DEFAULT , ButtonBackColor)  ;<<--Default Schriftfarbe scheint nicht zu funktionieren!!
  ScintillaSendMessage(PinnwandEdi, #SCI_STYLECLEARALL)
EndIf 
[...]
#STYLE_DEFAULT wird genommen für Bereiche in denen kein Text steht. Also die Standardhintergrundfarbe,
und die Vordergrundfarbe evtl. wenn man Whitespace, Zeilenende usw. sichtbar macht.
Der Standard-Style für normalen Text ist 0, solange man nicht extra einen Style setzt.