String in anderer Farbe

Anfängerfragen zum Programmieren mit PureBasic.
Oli
Beiträge: 16
Registriert: 14.02.2006 13:14

String in anderer Farbe

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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
Oli
Beiträge: 16
Registriert: 14.02.2006 13:14

DANKE!!!

Beitrag von Oli »

Vielen Dank für eure Antworten!

Jetzt habe ich ja doch einige gute Ansätze!

Oli
Antworten