Seite 1 von 1

String in anderer Farbe

Verfasst: 07.12.2006 22:01
von Oli
Hallo zusammen,

gibt es eine Möglichkeit, einen Stringinhalt von vorneherein in einer anderen Farbe abzuspeichern, so dass er automatisch in dieser dargestellt wird?

z.B. a$ = "Toni"
b$ = "Markus"
c$ = "Heinz"

Bei der Ausgabe der Strings (die immer wieder im Programm in einem Fenster ausgegeben werden) soll c$ automatisch immer in roter Schrift oder in Fett dargestellt werden.

Ich möchte aber nicht jedes mal abfragen, ob nun gerade c$ ausgegeben wird und die Schriftfarbe umständlich mit setgadgetfont und -color auf rot (oder Fett) und anschließend wieder zurück stellen (was die einzige Lösungsmöglichkeit ist, die mir bisher eingefallen ist).

Habt ihr noch eine Idee?

Vielen Dank
Oli

Verfasst: 07.12.2006 22:04
von Kaeru Gaman
es geht nicht anders.

wenn du einem text in einem gadget eine andere farbe geben willst als die,
die im farbprofil des benutzers eingestellt ist, musst du sie direkt ändern.

du kannst die farbinformation im string abspeichern, so ähnlich wie die BB-Tags im forum,
aber dann musst du dir einen parser für die strings schreiben,
der erst den inhalt interpretiert und die farben einstellt
und dann den text ins gadget packt.

Verfasst: 07.12.2006 23:07
von AND51
Du könntest aber auch mit Strukturen arbeiten. (Code ungetestet, soll nur zur Idee anregen)

Code: Alles auswählen

; Du brauchst diese Struktur
Structure farbe
     string.s
     farbe.l
     schrifttyp.l
EndStructure

; Wir laden zwei Schriften, eine normale, eine FETTE
LoadFont(0, "Arial", 10)
LoadFont(1, "Arial", 10, #PB_Font_Bold)

; Deine Strings werden nun so deklariert:
define a.farbe, b.farbe, c.farbe

; Füllen der Strings
a\string="Toni"
a\farbe=RGB(255, 255, 0) ; Toni wird grün (vor Neid ;-)   )


b\string="Markus"
b\farbe=RGB(128, 128, 255) ; Helles blau

c\string="Heinz"
c\farbe=RGB(255, 0, 0) ; Genauso rot wie der Heinz-Ketschup
c\schrift=1 ; Hier soll zusätzlich noch die Schrift 1 gespeichert werden



; Sagen wir, du hast ein TextGadget() und möchtest nun die einzelnen Strings abspeichern. Dann kannst du bequem auf die Struktueren zurückgreifen:

SetGadgetText(#Gadget, b\text)
SetGadgetFont(#Gadget, FontID(b\schrift))
SetGadgetColor(#Gadget, #PB_Gadget_FrontColor, b\farbe) ; Konstante nachgucken, habe ich die richtig geschrieben?
Das war's. Mit Strukturen kannst du sozusagen mehrere Variablen in einer Variablen speichern.

Warum habe ich bei a und b keine Schrift gespeichert? Nun, da die normale Schriftart ja im Beispiel mit 0 geladen wurde ist es egal. Beim deklarieren ist zunächst schrift (genauso wie farbe) sowieso 0. Warum also nochmal schreiben?


Die Strukturen kannst du beliebig erweitern. Sie funktionieren sogar mit Arrays und LinkedLists. Sieh mal in der Hilfe nach, Strukturen sind überaus praktisch.


Ich hoffe, ich konnte die einigermaßen helfen. Feedback wäre nett.

Verfasst: 07.12.2006 23:30
von Leonhard

Verfasst: 08.12.2006 11:04
von NicTheQuick
@Oli:
Ich hab dir mal schnell eine Procedure gebastelt. Vielleicht sagt sie dir ja zu.
Ein Beispiel ist dabei:

Code: Alles auswählen

;{c:255,0,0}{cb:0,0,0}{f:0}Text
Procedure SetGadgetTextEx(Gadget.l, Text.s)
  Protected *c.Character, open.l = #False, dontopen.l = #False, ctrl.s = "", part.s = ""
  
  SetGadgetFont(Gadget, #PB_Default)
  SetGadgetColor(Gadget, #PB_Gadget_FrontColor, -1)
  SetGadgetColor(Gadget, #PB_Gadget_BackColor, -1)
  *c = @Text
  While *c\c
    If *c\c = '}' And dontopen = #False
      open = #False
      Select LCase(StringField(ctrl, 1, ":"))
        Case "c"
          ctrl = StringField(ctrl, 2, ":")
          SetGadgetColor(Gadget, #PB_Gadget_FrontColor, RGB(Val(StringField(ctrl, 1, ",")), Val(StringField(ctrl, 2, ",")), Val(StringField(ctrl, 3, ","))))
        Case "cb"
          ctrl = StringField(ctrl, 2, ":")
          SetGadgetColor(Gadget, #PB_Gadget_BackColor, RGB(Val(StringField(ctrl, 1, ",")), Val(StringField(ctrl, 2, ",")), Val(StringField(ctrl, 3, ","))))
        Case "f"
          SetGadgetFont(Gadget, FontID(Val(StringField(ctrl, 2, ":"))))
      EndSelect
      Debug ctrl
    ElseIf open
      ctrl + Chr(*c\c) 
    ElseIf *c\c = '{' And dontopen = #False
      open = #True
      ctrl = ""
    ElseIf *c\c = '\'
      dontopen = #True
    Else
      dontopen = #False
      part + Chr(*c\c)
    EndIf
    
    *c + SizeOf(Character)
  Wend
  
  SetGadgetText(Gadget, part)
  Debug part
EndProcedure

If Not LoadFont(0, "Arial", 10) : Debug "Fehler" : EndIf
If Not LoadFont(1, "Times New Roman", 12, #PB_Font_StrikeOut) : Debug "Fehler" : EndIf
If Not LoadFont(2, "Helvetica", 8, #PB_Font_Bold | #PB_Font_Italic) : Debug "Fehler" : EndIf


If OpenWindow(0, 0, 0, 300, 60, "SetGadgetTextEx()-Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If CreateGadgetList(WindowID(0))
    TextGadget(0, 0,  0, 300, 20, "")
    TextGadget(1, 0, 20, 300, 20, "")
    TextGadget(2, 0, 40, 300, 20, "")
    SetGadgetTextEx(0, "{c:255,0,0}{f:0}Das ist ein Testtext!")
    SetGadgetTextEx(1, "{cb:32,32,32}{c:0,255,0}{f:1}Das ist ein \{Testtext\}!")
    SetGadgetTextEx(2, "{c:64,128,255}{cb:255,128,64}{f:2}\{Die\} \{Klammern\} funktionieren auch!")
    
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
EndIf

DANKE!!!

Verfasst: 10.12.2006 12:28
von Oli
Vielen Dank für eure Antworten!

Jetzt habe ich ja doch einige gute Ansätze!

Oli