Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Bericht mit Felder variabler Höhe

Begonnen von Walterio, Oktober 13, 2022, 16:03:46

⏪ vorheriges - nächstes ⏩

Walterio

Ein Bericht enthält lange Text-Felder und Unterformulare; und bei jedem steht noch oberhalb ein Unterstrichenes Textfeld (Labelxy) mit dem Namen.
Die Höhe-Eigenschaft der Text-Felder passe ich im Lade-Ereignis mit
Dim ZeileLang as Long: ZeileLang = 128
(Len(Nz(Me.Beschreibung, 0)) / ZeileLang) * 567
an (als Beispiel 128, muss wegen der Auflösung dann noch angepasst werden).
Für die Höhe der Unterformulare verwende ich die Anzahl Sätze (+ 1 für die Spalten-Titel):
(DCount("*", "[MeineTabelle]", "MeinFeld = " & Me.Meinfeld) + 1) * 567 Nun sollen diese Felder mit einem Abstand von 1 cm ( = 567) untereinander stehen.
Das oberste Feld ist kein Problem. Bei den weiteren Feldern greife ich auf die Werte vom Vorgänger (wobei ich immer das Feld selbst und das Label-Feld als 1 Paket betrachte):
Labelxy.Oben  =  Vorgänger.Oben + Vorgänger.Höhe + 567
Feldxy.Oben = Labelxy.Oben + 340
Und jetzt kommt noch die Sache mit der Seite: Die Pakete (Label und Feld) sollen ja zusammenbleiben, bzw. zusammen auf der nächsten Seite erscheinen, wenn nicht mehr genug Platz da ist. Habe ich so lösen wollen, dass ich eine Seiten-Grösse festlege, prüfe ob das Paket noch Platz hat und wenn nicht, erhöhe ich die Oben-Eigenschaft von Label und Feld um eben diese Seitengrössse (als Beispiel 12'000):
Dim SeiteLang as Long: SeiteLang = 12000
If Me.Meinfeld.Top + Me.Meinfeld.Heigth > SeiteLang Then
        Me.LabelMeinfeld.Top = SeiteLang + 567 * 4   'damit das Feld nicht ganz oben an der Seite klebt
        Me.Meinfeld.Top = Me.LabelMeinfeld.Top + 340
End If
Aber es geht nicht! Habe mit verschiedenen Seitengrössen versucht. Also habe ich gedacht, ich muss einen Seitenumbruch eizufügen. Aber wo? Versuche damit sind noch schlimmer.
Also: was ist falsch an meinem Ansatz?  Wie setze ich den Seitenumbruch ein (es können mehrere Seiten entstehen).
Vielen Dank für das "zuhören" und jeder Hilfe
Walterio
P.S. Habe noch eine Ergänzung eingefügt: wenn der lange Text Zeilenumbrüche (vbCrLf) enthält, wird das auch bei der Berechnung der Höhe berücksichtigt.
  •  

Walterio

Liebes Forum
Das Problem ist gelöst. Zum Verständnis vom Code:
MeinFeld ist das Feld mit variabler Höhe. Dazu gehört ein Titel - LabelMeinFeld - das vor dem Textfeld kommt.
VorFeld ist der Vorgänger, der schon richtig plaziert ist.
Zudem sind die Variablen SeitenGr mit 13000, Textzeile mit 120, und AktSeite mit 1 initialisiert. Je Auflösung müssen diese Werte angepasst werden.
    Me.LabelMeinFeld.Top = Me.VorFeld.Top + Me.VorFeld.Height + 567   ' Titel wird plaziert
    Me.MeinFeld.Top = Me.LabelMeinFeld.Top + 340    ' Feld unter dem Titel
' Berechnung der Feldhöhe mit Berücksichtigung vorkommender Zeilenumbrüche   
    AnzUmbruch = 0
    TxtRest = Nz(Me.MeinFeld, "")
    Do While (InStr(TxtRest, vbCrLf)) > 0
        TxtPos = InStr(TxtRest, vbCrLf)
        AnzUmbruch = AnzUmbruch + 1
        TxtRest = Right(TxtRest, Len(TxtRest) - TxtPos)
    Loop
' Platzbedarf vom Feld samt Titel
    Me.MeinFeld.Height = ((Len(Nz(Me.MeinFeld, 0)) / TextZeile) + AnzUmbruch + 1) * 567
    Me.MeinFeld.Height = Me.MeinFeld.Height * 3 / 5         ' Justierung
' wenn Seitenüberlauf
    If Me.MeinFeld.Top + Me.MeinFeld.Height > SeitenGr * AktSeite Then
        Me.LabelMeinFeld.Top = SeitenGr * AktSeite + 567
        Me.MeinFeld.Top = Me.LabelMeinFeld.Top + 340
        AktSeite = AktSeite + 1
    End If

Hoffentlich habe ich den Sachverhalt klar genug dargestellt (sonst nachfragen).
Und ebenso hoffe ich Hilfesuchende mit diesem Problem auch zu helfen.

Walter
  •