Seite 1 von 4
Dynamische Textfeld-Größenanpassung
Verfasst: Do, 10.10.2013 21:15
von marcel_at_work
Hallihallöchen allerseits

,
ich arbeite gerade an der Visualisierung von Rezepten aus einer Datenbank über einen Dialog. Bis jetzt werden alle Eigenschaften eines Rezeptes, nacheinander, von oben nach unten, über dynamisch zur Laufzeit erzeugte "Label"-Kontrollfelder angezeigt (da die Menge an z.B. "Zutaten" ja stets unterschiedlich ist; die anderen Kontrollfelder werden dann einfach etwas weiter unten eingefügt).
Ich habe damit aber ein einziges Problem: Und zwar besteht die Rezepteigenschaft "Zubereitung" in der Regel aus mehrzeiligen Einträgen, wobei die Feldhöhe dann auf dem Dialog dynamisch an die jeweilig enthaltenen Zeilen angepasst werden müsste, damit immer der gesamte Feldinhalt angezeigt wird.
Hat von Euch vielleicht jemand eine Idee, wie man dies umsetzen könnte?
Liebe Grüße,
Marcel
Re: Dynamische Textfeld-Größenanpassung
Verfasst: Do, 10.10.2013 21:45
von Stephan
Muss das Ganze denn über getrennte Felder angezeigt werden? Reicht nicht ein großes Label- oder Textfeld wo man Einzeleinträge durch jeweils eine Leerzeile trennen könnte?
Richtig ist das Du bei der Gesamtgröße letztlich auch auf Schätzuung angewiesen wärst, da es aber jeweils nur ein großes Feld ist würden sich Schätzungsungenauigkeiten nicht addieren.
Würdest Du Textfelder (statt Label) nehmen könnten diese auch eine Scroll-Leiste haben.
Hat von Euch vielleicht jemand eine Idee, wie man dies umsetzen könnte?
Wenn Du einen fixed Font vewenden würdest, könntest Du die notwendige Höhe letztlich ausrechnen, bei einem Proportionalfont geht das höchstens ungefähr.
Generell mußt Du aber in beidfen Fällen mit Ungenauigkeiten rechnen wenn die Datei auf verschiedenen Rechnern laufen soll und du nicht garantieren kanbnst das dieselben Systemeinstellungen vorliegen und dieselben Fonts vorhanden sind. Die Probleme können, je nach konkreter Situation gering aber auch erheblich sein.
Nachdem was ich aus Deinen Aussagen entnehme würde ich auf ein einzelnes großes, notfalls scrollbares, Textfeld setzen, Der gravierende Vorteil davon ist das hier nur einmal das Größenproblem auftritt und dadurch das Gesamtaussehen weniger leidet, als bei mehreren Feldern wo jedes einzelne Feld ungenau dimensioniert sein kann.
Tut mir leid wenn meine Antwort nicht (vollends) befriedigt, nur ich sehe keine perfekte Lösung für Dein Problem.
Gruß
Stephan
Re: Dynamische Textfeld-Größenanpassung
Verfasst: Do, 10.10.2013 21:57
von marcel_at_work
Hi Stephan,
ich hab's mir schon so gedacht, da ich schon einiges dazu im Forum lesen konnte.
Der Aufbau mit einem einzigen Textfeld hat zwei rießengroße Nachteile:
Die Rezeptdatenbank ist etwas umfangreicher und beinhaltet u.a. auch Detailaufstellungen von sämtlichen Zutaten (kcal, Preis, etc.). Und zu diesen Ansichten soll man über einen direkten Klick auf die jeweilige Zutat in der Rezeptansicht gelangen (und dies geht ja leider nur über separate Felder).
Zum anderen ist es dann nicht mehr möglich, einzelne Einträge im Format (Font, Größe, etc.) zu ändern.
Mit einer auto. Berechnung der Buchstabenbreite habe ich auch schon herumgespielt, aber dies würde etwas aufwendig werden.
Mmmmmm.........
LG, Marcel
Ps.: Kann man denn nicht irgendwie herausfinden, ob ein Label/Textfeld nach dynamischer Füllung eine Scrollleiste hat und danach dann die Feldhöhe einstellen?
Re: Dynamische Textfeld-Größenanpassung
Verfasst: Do, 10.10.2013 22:19
von Stephan
Die Rezeptdatenbank ist etwas umfangreicher und beinhaltet u.a. auch Detailaufstellungen von sämtlichen Zutaten (kcal, Preis, etc.). Und zu diesen Ansichten soll man über einen direkten Klick auf die jeweilige Zutat in der Rezeptansicht gelangen (und dies geht ja leider nur über separate Felder).
verstehe ich noch nicht genau, was heißt "gelangen". Falls es um Fokussieren des jeweiligen Feldes ginge so wäre eine Alternative _vielleicht_ das Markieren des jeweiligen Teiltextes in dem/einen großen Textfeld.
Möglicherweise, ich entwickele jetzt mal etwas unkonventionelle Phantasie, könntest Du den aktuell hervorzuhebenden Text jeweils auch in ein separates Labelfeld packen das Du quasi über dem restlichen Dialog aufploppen lässt und das per Klick auf das Labelfeld wieder unsichtbar geschaltet wird.
Kann man denn nicht irgendwie herausfinden, ob ein Label/Textfeld nach dynamischer Füllung eine Scrollleiste hat und danach dann die Feldhöhe einstellen?
Ich weiß nichts darüber und würde eigentlich ausschliessen das es geht.
Mmmmmm.........
tja, berechtigt aber ich sehe leider keine wirklich gute Lösung
Gruß
Stephan
Re: Dynamische Textfeld-Größenanpassung
Verfasst: Do, 10.10.2013 22:30
von marcel_at_work
Hi,
ich meinte mit "gelangen":
Bestimmte Einträge (wie u.a. sämtliche "Zutaten") werden als Hyperlinks dargestellt und man kann mittels Mausklick über dem Link einen anderen Dialog öffnen.
Zu deiner Idee: Ich habe jetzt sämtliche Felder in meinen Dialogen mit "Labels" ersetzt, da es sehr unschön aussieht, wenn beim Drüberfahren mit der Maus ein Textmarker, oder noch schlimmer, ein hervorgehobener Text zu sehen ist. Irgendwie mag ich einfach nur eine ganz normale "Textanzeige".
LG, Marcel
Ps.: Ich teste gerade mal ein wenig herum, ob das nicht irgendwie mit der Scrollleiste funktioniert.

Re: Dynamische Textfeld-Größenanpassung
Verfasst: Do, 10.10.2013 23:04
von marcel_at_work
Hey Stephan,
ich glaube, ich habe die Lösung - brauche aber kurz mal Hilfe:
Mittels Xray bin ich auf das Attribut "oTextPreparation.Peer.Textlines" gestoßen, welches nach dynamischem Füllen den Text samt Umbrüchen (Chr(10)) beinhaltet. Man (ich) bräuchte jetzt nur noch eine kurze Funktion, um alle Umbrüche herauszusuchen. Infolge könnte man dann damit die Größe automatisch (und passgenau) mittels einfacher Multiplikation anpassen.
LG, Marcel
Re: Dynamische Textfeld-Größenanpassung
Verfasst: Do, 10.10.2013 23:18
von Stephan
Wenn dort im Text wirklich Umbrüche in der Form von CHR(10) vorkommen dann tuts z.B.:
Gruß
Stephan
Re: Dynamische Textfeld-Größenanpassung
Verfasst: Do, 10.10.2013 23:35
von marcel_at_work
Man bist du zackig...
... hab Dank.
Ich hätt's jetzt so realisiert...
Code: Alles auswählen
otext = oLabelPreparation.Peer.Textlines
Do While Instr(otext, Chr(10))
i = Instr(otext, Chr(10))
otext = right(otext,len(otext)-i)
n = n + 1
Loop
... aber dein Code ist natürlich viel handlicher.
Voila... und schon ist das Thema gelöst.
Vielen herzlichen Dank noch einmal und einen wundervollen Abend noch!
Marcel
Re: Dynamische Textfeld-Größenanpassung
Verfasst: Do, 10.10.2013 23:43
von F3K Total
Hi,
dies sollte funzen:
Code: Alles auswählen
Sub Main
DialogLibraries.loadLibrary("Standard")
odlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
otxt1 = odlg.getcontrol("txt1")
otextlines = otxt1.Peer.textlines
ncounter = 0
for i = 1 to len(otextlines)
a = mid(otextlines,i,1)
if asc(a) = 10 then ncounter = ncounter + 1
next i
msgbox "Es werden "+ (ncounter +1) + " Zeilen dargestellt"
End Sub
Gruß R
Re: Dynamische Textfeld-Größenanpassung
Verfasst: Sa, 12.10.2013 13:00
von marcel_at_work
Hi Leute,
noch eine kleine Bemerkung:
Das Attribut ".Peer.Textlines" ist NICHT bei dynamisch erzeugten Kontrollfeldern vorhanden (zumindest habe ich es noch nicht gefunden

). Man kann sich aber z.B.
- ein unsichtbares Textfeld anlegen
- dieses zur Laufzeit an die Größe des anzupassenden Kontrollfeldes einstellen (für die Referenz der originalen Zeilenhöhe)
- den Text in beide Felder hineinladen
- ".Peer.Textlines" auslesen und damit dann die Höhe des Ziel-Kontrollfeldes formatieren
Viele Grüße,
Marcel
Re: Dynamische Textfeld-Größenanpassung
Verfasst: Sa, 12.10.2013 13:25
von F3K Total
Hi,
Das Attribut ".Peer.Textlines" ist NICHT bei dynamisch erzeugten Kontrollfeldern vorhanden
konnte ich nicht glauben, Lösung:
Wenn Du das Model des Textfeldes dynamisch erzeugst, mußt du ihm die Eigenschaft der Mehrzeiligkeit mitgeben, ala
dann klappt's auch mit den TextLines.
Gruß R
Re: Dynamische Textfeld-Größenanpassung
Verfasst: Sa, 12.10.2013 15:08
von marcel_at_work
Grüß dich,
könntest du mir bitte mal sämtliche Codezeilen zeigen? Ich hatte ja das Multiline-Attribut auch gesetzt, aber "Textlines" hat bei sämtlichen Versuchen gefehlt...
LG, Marcel
EDIT:
Wie kann man denn die Rahmen sämtlicher im Dialog enthaltenen Kontrollfelder ausschalten? Ich spreche in meinen Versuchen zwar die richtige Eigenschaft an, aber es tut sich nix...?
Code: Alles auswählen
Dim i As Long
For i = 0 To ubound(dlg.Model.ElementNames())
If Left(dlg.Model.ElementNames(i), 3) = "lbl" OR Left(dlg.Model.ElementNames(i), 3) = "txt" Then dlg.getControl(dlg.Model.ElementNames(i)).Model.Border = 0
Next i
Re: Dynamische Textfeld-Größenanpassung
Verfasst: Sa, 12.10.2013 15:16
von F3K Total
Jo:
modaler Dialog
Code: Alles auswählen
REM ***** BASIC *****
Global odlg as object
Sub S_Create_Dialog
Dim oWindow As Object
Dim oMod As Object
Dim i As Integer
If not isNull (odlg) then
if odlg.isVisible() Then
odlg.setVisible(False)
odlg.dispose
end if
end if
REM ***** Initialisierung der Eigenschaften des Dialogs
odlgModel = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
With odlgModel
.setPropertyValue("PositionX", 320)
.setPropertyValue("PositionY", 111 )
.setPropertyValue("FontName", Font)
.setPropertyValue("Width", 150)
.setPropertyValue("Height", 200)
.setPropertyValue("Title", "Text")
.setPropertyValue("Name", "DLG")
'.setPropertyValue("DesktopAsParent", True )
End With
odlg = CreateUnoService("com.sun.star.awt.UnoControlDialog")
REM **********numerisches Feld erzeugen
oMod = odlgModel.createInstance("com.sun.star.awt.UnoControlEditModel")
With oMod
.setPropertyValue("Name", "Test")
.setPropertyValue("PositionX", 10)
.setPropertyValue("PositionY", 10)
.setPropertyValue("Height", 180)
.setPropertyValue("Width", 130)
.setPropertyValue("MultiLine", true)
.setPropertyValue("Text","konnte ich nicht glauben, Lösung:Wenn Du das Model des Textfeldes dynamisch erzeugst, mußt du ihm die Eigenschaft der Mehrzeiligkeit mitgeben, alakonnte ich nicht glauben, Lösung:Wenn Du das Model des Textfeldes dynamisch erzeugst, mußt du ihm die Eigenschaft der Mehrzeiligkeit mitgeben, ala")
End With
odlgModel.insertByName("Test", oMod)
odlg.setModel(odlgModel)
REM ********** Mittels des Modells den Dialog anzeigen
oWindow = CreateUnoService("com.sun.star.awt.Toolkit")
odlg.createPeer(oWindow, null)
Dim oWindowsListener as Object
oTopWindowsListener = CreateUnoListener( "Top_Win_", "com.sun.star.awt.XTopWindowListener" )
odlg.addTopWindowListener(oTopWindowsListener)
odlg.setVisible(True)
sTextlines = odlg.getcontrol("Test").Peer.Textlines
atemp = split(sTextlines,chr(10))
odlg.title = "der umgebrochene Text hat "+(Ubound(atemp)+1)+" Zeilen"
End Sub
'Diese Routinen werden von dem XTopWindowListener benötigt
Sub Top_Win_windowClosing( oEvent ) 'Dialog schließen
odlg.setVisible(False)
End Sub
Sub Top_Win_disposing( )
End Sub
Sub Top_Win_windowOpened ( oEvent )
End sub
Sub Top_Win_windowClosed ( oEvent )
End sub
Sub Top_Win_windowMinimized ( oEvent )
End sub
Sub Top_Win_windowNormalized ( oEvent )
End sub
Sub Top_Win_windowActivated ( oEvent )
Top_Win_windowDeactivated = false
End sub
function Top_Win_windowDeactivated ( oEvent ) as boolean
Top_Win_windowDeactivated = true
End function
Gruß R
Re: Dynamische Textfeld-Größenanpassung
Verfasst: Sa, 12.10.2013 15:28
von marcel_at_work
Is ja genial....... THX!
Hättest du vielleicht auch noch zu dem anderen Problem (s.o.) eine Idee?
LG, Marcel
Re: Dynamische Textfeld-Größenanpassung
Verfasst: Sa, 12.10.2013 15:40
von F3K Total