Dynamische Textfeld-Größenanpassung

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Dynamische Textfeld-Größenanpassung

Beitrag von marcel_at_work »

Hallihallöchen allerseits :D ,

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
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Dynamische Textfeld-Größenanpassung

Beitrag 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
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Dynamische Textfeld-Größenanpassung

Beitrag 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?
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Dynamische Textfeld-Größenanpassung

Beitrag 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
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Dynamische Textfeld-Größenanpassung

Beitrag 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.;-)
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Dynamische Textfeld-Größenanpassung

Beitrag 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
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Dynamische Textfeld-Größenanpassung

Beitrag von Stephan »

Wenn dort im Text wirklich Umbrüche in der Form von CHR(10) vorkommen dann tuts z.B.:

Code: Alles auswählen

tmp = Split(DeinText, CHR(10))
Msgbox UBOUND(tmp())

Gruß
Stephan
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Dynamische Textfeld-Größenanpassung

Beitrag von marcel_at_work »

Man bist du zackig... :lol:

... 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. :D

Voila... und schon ist das Thema gelöst.


Vielen herzlichen Dank noch einmal und einen wundervollen Abend noch!

Marcel
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
F3K Total
********
Beiträge: 3723
Registriert: Mo, 28.02.2011 17:49

Re: Dynamische Textfeld-Größenanpassung

Beitrag 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
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Dynamische Textfeld-Größenanpassung

Beitrag 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 :D ). 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
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
F3K Total
********
Beiträge: 3723
Registriert: Mo, 28.02.2011 17:49

Re: Dynamische Textfeld-Größenanpassung

Beitrag 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

Code: Alles auswählen

.setPropertyValue("MultiLine", true)
dann klappt's auch mit den TextLines.
Gruß R
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Dynamische Textfeld-Größenanpassung

Beitrag 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
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
F3K Total
********
Beiträge: 3723
Registriert: Mo, 28.02.2011 17:49

Re: Dynamische Textfeld-Größenanpassung

Beitrag 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
marcel_at_work
****
Beiträge: 195
Registriert: Sa, 24.04.2010 15:51
Wohnort: Basel [CH]

Re: Dynamische Textfeld-Größenanpassung

Beitrag von marcel_at_work »

Is ja genial....... THX! :lol:

Hättest du vielleicht auch noch zu dem anderen Problem (s.o.) eine Idee?

LG, Marcel
[Win 10 Pro x64/Downgrade 7, AOO 4.1.6 und LO 6.3.0.4]
F3K Total
********
Beiträge: 3723
Registriert: Mo, 28.02.2011 17:49

Re: Dynamische Textfeld-Größenanpassung

Beitrag von F3K Total »

Hi,
versuchs mit

Code: Alles auswählen

.border = -1
Gruß R
Antworten