Die Tabsheets erzeugen


Die einzelnen Tabsheets müssen zur Laufzeit dynamisch im Code erzeugt werden. Weil der Quellcode mit einem Tabsheet-Control und mehreren Registerseiten leicht unübersichtlich werden kann, ist es wichtig, von Anfang an effizienten und leicht zu wartenden Code zu schreiben. Aus diesem Grund erzeuge ich die einzelnen Tabsheets in einer Schleife:

for i := 0 to CNT_TABS - 1 do
begin

In dieser Schleife wird ein paar der benötigten Membervariablen des TCItem-Records gefüllt. Hier ist der Text des Reiters ausreichend, der in pszText angegeben wird. Damit er auch akzeptiert wird, ist die mask-Variable vorher auf TCIF_TEXT zu setzen:

  tcItem.mask := TCIF_TEXT;
  tcItem.pszText := pointer(tabSheetCaptions[i]);

Das Record wird dann als lParam-Wert mit der Nachricht "TCM_INSERTITEM" an das Tabsheet-Control übergeben:

  SendMessage(hTab, TCM_INSERTITEM, i, Integer(@tcItem));
end;


Das TCItem-Record enthält natürlich noch ein paar andere Membervariablen:

typedef struct tagTCITEM {
  UINT mask;
#if (_WIN32_IE >= 0x0300)
  DWORD dwState;
  DWORD dwStateMask;
#else
  UINT lpReserved1;
  UINT lpReserved2;
#endif
  LPTSTR pszText;
  int cchTextMax;
  int iImage;
  LPARAM lParam;
}

mask, pszText, cchTextMax und iImage sind uns in ähnlicher Form bereits von anderen Records bekannt. Als Beispiele sollen stellvertretend die List-View und der Tree-View genannt werden. In aller Kürze: mask gibt an, welche Membervariablen Gültigkeiten haben. pszText ist logischerweise der Text der Seitenreiter, und cchTextMax ist die Anzahl der Textzeichen (diese Variable wird aber nur beim Auslesen der Beschriftungen benötigt). iImage ist der Index eines Bildes einer Imageliste.
Bleiben noch dwState und dwStateMask. Diese beiden Membervariablen sind von der Version des Internet Explorer abhängig. Wie man an der bedingten Compilierung erkennen kann, ist der IE3 das Minimum, um auf die beiden Variablen zugreifen zu können. Das bedeutet, lediglich unter Windows 95 und NT stehen Ihnen diese beiden Variablen nicht zur Verfügung, sondern wären dort durch reservierte (und damit nicht benutzbare) UINT-Variablen ersetzt.