Absender : pries@informatik.tu-muenchen.de (Karsten Pries) ------------------------------------------------------------------------ In Berichten Tabellen mit variabler Zeilenhoehe drucken ------------------------------------------------------------------------ Eines der Probleme beim Druck von Berichten in Tabellenform taucht erst auf, wenn die Inhalte der gedruckten Felder unterschiedlich lang sind (z.B. Text mit 10 bzw. 200 Buchstaben) und aus diesem Grund die Feldeigenschaft 'Vergroesserbar' auf 'Wahr' eingestellt wurde. Um das Aussehen einer Tabelle zu erreichen, haben sie vermutlich die Rahmenart 'Normal' eingestellt und die Felder so aneinandergelegt, daß sich benachbarte Rahmen überschneiden. Alle Felder besitzen die gleiche Höhe. Auf diese Art entsteht das Aussehen einer Tabelle. Ueberschreitet jetzt der Inhalt eines der Felder im Detailbereich die festgelegte Laenge und ist die Eigenschaft 'Vergroesserbar'='Wahr', so wird der Text in diesem Feld in die naechste Zeile umgebrochen. Dabei wird auch der Rahmen vergroessert, allerdings nur für dieses Feld!!! Alle anderen Felder behalten ihre bisherige Hoehe, das resultierende Layout sieht etwa so aus: -------------------------------------------------- NEU | NEWS | Hier koennen sie woechentlich | ----------------| Tips zu verschiedenen Gebieten | | erhalten | -------------------------------------------------- NEU | 1.Zeile | einzeiliger Text | -------------------------------------------------- Mit Standardmitteln ist dieses Problem nicht zu loesen, weder in Version 2.0 noch in 7.0 gibt es geeignete Eigenschaften, um allen Feldern im Detailbereich die Rahmenhöhe des gerade höchsten Feldes zuzuweisen (8.0 kenne ich nicht). Die Grundidee des Lösungsansatzes ist nur konsequent: Da die automatischen Feldrahmen nicht das leisten, was ich will, muss ich die Rahmen ausschalten ('Rahmenart'= 'Transparent') und die Felder 'per Hand' umrahmen. Genau das macht die folgende Funktion 'GleicheHoehe'. Darin wird zuerst die Hoehe des hoechsten Feldes ermittelt. Dabei sind alle in Frage kommenden Felder (das werden in der Regel alle im Detailbereich enthaltenen sein) mit einer speziellen Markierung versehen, um nicht auch Felder im Berichtskopf oder -fuss ungewollt mit einzubeziehen. Als Markierung verwende ich die Eigenschaft 'Marke', die im allgemeinen unbenutzt ist. Sollte sie doch fuer andere Zwecke benoetigt werden, so waere z.B. auch eine Abgrenzung ueber den Namen ("alle Namen, die mit 'x' anfangen") moeglich. In unserem Fall wie gesagt die Eigenschaft 'Marke', welche ein "X" enthalten muss. Die Einrahmung der Felder wird innerhalb einer Schleife erledigt, die durch alle Felder des Berichtes geht. Von den Felder mit Marke = "X" werden die X- und Y-Koordinaten der linken oberen Ecke und die Breite ermittelt. Dann wird mittels der 'Line'-Methode ein Rechteck mit der vorhin ermittelten maximalen Höhe gezeichnet. Die Funktion ist ohne Änderungen in allen Berichten lauffähig und wird im Ereignis 'BeimDrucken' (OnPrint) des Detailbereiches aufgerufen. Aufruf in Access 2.0: Sub Detail1_Print (Cancel As Integer, PrintCount As Integer) Call GleicheHoehe End Sub Aufruf in Access 7.0: Private Sub Detailbereich_Print(Cancel As Integer, PrintCount As Integer) Call GleicheHoehe End Sub Nochmal zur Zusammenfassung die zwei wichtigen Punkte: 1. 'Rahmenart' = 'Transparent' 2. 'Marke' = "X" Es folgt die Funktion, viel Spaß und ein allzeit sauberes Layout. --------------------------------------------------------- Private Sub GleicheHoehe () '** Zeichnen von gleich hohen Umrahmungen für alle Felder mit 'Marke'="X" On Error GoTo Error_GleicheHoehe Dim X1 As Single, Y1 As Single Dim X2 As Single Dim Color As Integer Dim i As Integer, MaxHeight As Integer ' max. Hoehe aller Felder ermitteln, die ein "X" in der Eigenschaft ' 'Marke' stehen haben For i = 0 To Me.Count - 1 If Me(i).Tag = "X" Then If MaxHeight < Me(i).Height Then MaxHeight = Me(i).Height End If Next Me.ScaleMode = 1 ' ...in twips (1440 twips = 1 inch). Me.DrawWidth = 3 ' Breite der Linie (in Pixels). Color = RGB(0, 0, 0) ' Schwarze Linie For i = 0 To Me.Count - 1 If Me(i).Tag = "X" Then ' X- und Y-Koordinaten der oberen linken Ecke des Rahmens X1 = Me(i).Left Y1 = Me(i).Top ' X-Koordinate der rechten unteren Ecke X2 = X1 + Me(i).Width ' Rahmen mit der Methode 'Line' zeichnen Me.Line (X1, Y1)-(X2, MaxHeight), Color, B End If Next Exit_GleicheHoehe: Exit Sub Error_GleicheHoehe: MsgBox Error$, , "GleicheHoehe" Resume Exit_GleicheHoehe End Sub ---------------------------------------------------------