Seite 1 von 1

TextGadget - in Höhe und Breite variabel - ???

Verfasst: 24.03.2013 07:53
von attreus
Blöde Anfängerfage:

Ich will einen String variabler Länge in einem TextGadget ausgeben.
Die Breite des Fensters mit dem TextGadget richtet sich nach der Länge des Strings,
darf aber eine Maximal-Breite nicht überschreiten, so dass der Text im TextGadget
umgebrochen wird. Daraus ergibt sich wiederum die nötige Höhe des TextGadgets.

Ich bin ganz neu in PB, von meiner vorherigen Lieblingssprache (Visual DialogScript)
bin ich gewohnt, beim Erstellen eines Textelementes einfach entweder die Höhe oder die
Breite garnicht anzugeben, sie ergibt sich dann automatisch aus der Länge des Textes
und gewählter Schriftart und -größe.

PB akzeptiert aber keine leeren Parameter und "#PB_Ignore" ist einfach mal Zero, das
bringt's auch nicht.

Ich hab mich jetzt stundenlang belesen und alles was ich fand, war irgendwas von
2D-Drawing in Verbindung mit einem Haufen Windows-APIs.

Ich suche eine plattformunabhängige Lösung für ein m.E. ziemlich banales Problem.
Der Grund, weshalb ich auf PureBasic umsteige, ist die cross-platform Sache, also bin
ich nicht an Vorschlägen interessiert, die Windows-API-Funktionen benötigen.

Ich hoffe, es gibt eine simple Lösung, denn ich habe schon so viel Zeit an diese
Kleinigkeit verschwendet, dass ich mich langsam frage, ob die Entscheidung für PB die
richtige war.

Sorry, falls das schlechtlaunig klingt, aber ich bin gerade schlecht gelaunt deswegen.
Nichtsdestotrotz finde ich PureBasic eine feine Sache und hoffe, mich kann hier jemand
mit einer guten Lösung aufmuntern. ;-)


Cheers.

.

Re: TextGadget - in Höhe und Breite variabel - ???

Verfasst: 24.03.2013 08:36
von Mr.L
Dafür nimmst du das EditorGadget mit dem Flag #PB_Editor_WordWrap

Code: Alles auswählen

OpenWindow(0,0,0,500,500,"Test")
EditorGadget(0,10,10,480,480,#PB_Editor_WordWrap)

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
wenn du allerdings den Text nach einer genauen Anzahl von Zeichen umbrechen willst, dann musst du
dem Gadget eine Monospace Schrift zuweisen und die Breite Des Gadgets an die Breite
des Textes anpassen.
Hier ein Beispiel, das den Text nach 20 Zeichen umbricht.

Code: Alles auswählen

OpenWindow(0,0,0,190,500,"Test")
EditorGadget(0,10,10,170,480,#PB_Editor_WordWrap)
LoadFont(0,"Courier New", 10)
SetGadgetFont(0,FontID(0))
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow

Re: TextGadget - in Höhe und Breite variabel - ???

Verfasst: 24.03.2013 09:59
von attreus
@Mr. L

Ok, danke für den Tip, hatte schon an sowas gedacht - Editor ohne Rahmen in Hintergrundfarbe, nur was ist dann mit veränderten Systemfarben, kann das EditorGadget auch transparent dargestellt werden?

Zur Erklärung:
Ich möchte einen flexiblen modalen Dialog erstellen, ähnlich den MessageRequester-Fenstern der nur einen Pflicht-Parameter "Text" benötigt.
Alles andere wie Höhe, Breite, Position wird automatisch nach dem Text und der Bilschirmgröße berechnet.

Wäre halt schön, wenn das Ganze auf allen Systemen wie ein natives Fenster aussähe.

Re: TextGadget - in Höhe und Breite variabel - ???

Verfasst: 24.03.2013 12:53
von ts-soft
In PB gibt es bisher keinen Layout-Manger, der ist zwar geplant, aber für irgendwann ...
deshalb gibt es auch keine Lösung ohne API, bzw. ohne API gäbe es keine Programmier-
Sprache :mrgreen:

Wenn #PB_Ignore bei Dir 0 ist, solltest Du die Installation nochmal überprüfen, der Wert ist
definitiv falsch.

Hilfreich wäre dieser voll API steckende Code: http://www.purebasic.fr/english/viewtop ... 54#p294054
Der enthält die API für alle OS.

Ansonsten enhält IUP auch einen Layout-Manager: http://www.purebasic.fr/german/viewtopi ... 31#p310431
aber es existiert zur Zeit nur ein Wrapper für Windows x86.

Gruß
Thomas

Re: TextGadget - in Höhe und Breite variabel - ???

Verfasst: 24.03.2013 18:09
von attreus
Danke ts-soft.

Den code in deinem Link hatte ich schon unter die Lupe genommen und versucht, ihn auf ein TextGadget anzuwenden, leider erfolglos, vermutlich hat Freak deshalb auch keines ins Example eingebaut.
Ansonsten finde ich den code absolut klasse, da er super demonstriert, wie man die Compilerdirektiven effektiv einsetzt um platformübergreifend zu programmieren.

Ich denke, es sollte eine Art Tabelle, oder besser gleich eine Datenbank geben, wo die ganzen API-Funktionen der unterschiedlichen Platformen miteinander verknüpft werden, so dass man zu allen ein Äquivalent des jeweils anderen findet.
Oder gibt's etwa schon sowas?

Hast natürlich recht, #PB_Ignore ist nicht "0" sondern -FFFF.

Ich kam deshalb auf die "0", weil ein Test eines mit #PB_Ignore" im Höhenparameter erstellten Gadgets "0" ergab:

Code: Alles auswählen


Define MaxWidth.i = 60
Define Text.s = "A veeeeerrrrrry veeeeerrrrrry looooooooong strrrrrrrrriiiiiiiiiiiiiiing........................................."

TextGadget(#Text_1, 20, 40, MaxWidth, #PB_Ignore, Text)

Debug  GadgetHeight(#Text_1)

Das wäre aber meiner Meinung nach dann ein Bug in der GadgetHeight Function.
Das heißt doch GadgetHeight kann nichts mit einem negativen Wert anfangen, aber #PB_Ignore ist ja ein gültiger Wert.
Oder wie seht ihr das?

Re: TextGadget - in Höhe und Breite variabel - ???

Verfasst: 25.03.2013 14:56
von bobobo
die Höhe eines Textgadgets ist nur wichtig, wenn man irgendwelche
anderen Gadgets darunter darstellen muss.
Wenn diese oberhalb des Textgadgets liegt ist die Höhe irrelevant (das Textgadget ist ja nicht interaktiv)
oder nur dann relevant wenn die DefaultHöhe (bis zur Fensterunterkante)
den darzustellenden Text nicht fasst. Weshalb ist es vermutlich besser wäre, dort gleich ein
Editorgadget zu nehmen, das scrollbar wird, wenn die angebenen Höhe überschritten wird.


ansonsten gibt es in englishen forum etwas das zwar als drawtext ausgibt
aber eben auch eine WrapRoutine enthält die Du eventuell da rausfieseln kannst

http://www.purebasic.fr/english/viewtop ... 12&t=45192

Re: TextGadget - in Höhe und Breite variabel - ???

Verfasst: 25.03.2013 23:47
von attreus
Danke für den Tip, bobobo.