Programmierung

Gleichbleibende Zeilenhöhe im RecView

RecView mit unterschiedlicher Zeilenhöhe

Das RecView-Objekt eignet sich für die Darstellung von Inhalten aus der Datenbank mit variabler Zeilenhöhe. Es ist Beispielsweise die Anzeige von RTF-Inhalten, Texten und Bildern möglich.
Im Gegensatz zu einer RecList, welche eine gleichbleibende Zeilenhöhe besitzt, bietet das RecView-Objekt die Möglichkeit die Zeilenhöhe pro Zelle zu variieren. Es gibt allerdings Situationen, in welchen eine uneinheitliche Zeilenhöhe unvorteilhaft ist. Im weiteren Verlauf dieses Artikels möchte ich Ihnen eine Möglichkeit aufzeigen, eine gleichbleibende Zeilenhöhen im RecView zu realisieren.



Wie ich bereits im Artikel SelectorItem im RecView beschrieben habe, können einzelne Items innerhalb einer Group unter Verwendung von wpSelectorItem angesprochen werden.
Nach dem Ereignis EvtLstGroupInit, in welchem eine Veränderung der Feldinhalte, das Lesen von verknüpften Dateiinhalten oder das Anpassen der Itemfarbe in der aktuellen Gruppe erfolgen kann, wird das Ereignis EvtLstGroupArrange ausgelöst.
Diese Ereignis wird nach der Initialisierung einer Gruppe aufgerufen. Die Ausgabe der Gruppe erfolgte jedoch noch nicht. Hier können nun die SubItems neu positioniert oder weitere Veränderungen vorgenommen werden. Nun kann prozedural ermittelt werden, wie hoch die momentan höchste Zelle in einer Zeile ist. Dies kann ohne größere Probleme mit der Maximum-Funktion Max() realisiert werden. Anschließend wird dieser Wert der Gruppe zugewiesen.

RecView mit gleicher Zeilenhöhe

sub EvtLstGroupArrange
(
   aEvt     : event;    // Ereignis
   aRecBuf  : handle;   // Datensatzpuffer
   aGroup   : handle;   // Gruppe
   aViewId  : int;      // Nummer des View
)  : logic;
local
{
   tItemNo      : int;
   tMaxHeight   : int;
}
{
   // Ermitteln des höchsten Items
   for tItemNo # 1
   loop inc(tItemNo)
   while (tItemNo <= aEvt:obj->WinInfo(_WinCount))
   {
      aGroup->wpSelectorItem # tItemNo;

      if (aGroup->wpVisible) {
        tMaxHeight # Max(aGroup->wpContentHeight, tMaxHeight)};
   }
   // Setzen aller Items auf diese Höhe
   for tItemNo # 1
   loop inc(tItemNo)
   while (tItemNo <= aEvt:obj->WinInfo(_WinCount))
   {
      aGroup->wpSelectorItem # tItemNo;

      if (aGroup->wpVisible) {
        aGroup->wpContentHeight # tMaxHeight};
   }
}
5 Kommentare

5 Kommentare “Gleichbleibende Zeilenhöhe im RecView”

  1. Im Beispiel werden die senkrechten Linien wahrscheinlich durch die Border-Eigenschaft gezeichnet. Wären dann nicht alle Spalten gleich hoch, wären die Linien nicht durchgehend.

    Unterschiedliche Zeilenhöhen sind schon sinnvoll beim Anzeigen von Bildern und Texten. Das Review ist halt nicht nur eine erweiterte Reclist, man kann da sehr viel prozedural gestalten und so z.B. aufgrund eines Kennzeichens ganz unterschiedliche Informationen pro Zeile anzeigen.

  2. Aber das Event EvtLstGroupArrange wird doch dann beim Anzeigen jeder Zeile (also auch beim Scollen?) immer wieder ausgeführt, oder? Wenn man dann relativ viele Spalten hat und diese gleich zwei mal durchiteriert, hemmt das doch schon etwas das Reaktionsverhalten des RecViews.
    Wäre da eine native Unterstützung für angepasste Zeilenhöhe durch C16 schneller?

  3. Ok, habe die Abbildungen jetzt verstanden, scheinbar ist tatsächlich die Zeile gemeint. Die Zeile wird letztlich immer mindestens so hoch sein, wie ihre höchste Zelle, aber die Darstellung kleinerer Zellen beginnt dann schon vorher.

    Habe gerade Probleme, mir ein Beispiel für die sinnvolle Verwendung unterschiedlicher Zellenhöhen innerhalb einer Zeile vorzustellen. Hat jemand eins?

  4. Wie ist denn diese Aussage: "[…] bietet das RecView-Objekt die Möglichkeit die Zeilenhöhe pro Zelle zu variieren" gemeint? Ich habe gerade Probleme mir vorzustellen, wie man sich eine Zeile mit pro Zelle variierender Höhe vorzustellen hat, vielleicht so:

    gleichbleibend:
    —————-
    | | | |
    —|—|—|—|

    variierend:
    —————-
    |—| |—|
    —| |—| |

    Wo beginnt nun die nachfolgende Zeile? Je nach Zellenhöhe, oder insgesamt fühestens ab dem Ende der höchsten Zelle der Vorzeile?

    Ich frage nach, weil falls mit gleichbleibender Zeilenhöhe doch die Zeilenhöhe im gesamten RecView (und nicht nur einer Zeile) gemeint sein sollte, liesse sich anschliessend an die Diskussion im Artikel “Einbinden dynamischer Werte in das RecView-Objekt” evtl. eine Möglichkeit für einen aussagekräftigen vertikalen Scrollbalken im RecView finden.

Kommentar abgeben