Zuerst einmal das Prinzip: Wie schon gesagt hat jeder Tabsheet ein Dialogfenster als Container für die Controls. Das erspart uns die Arbeit, bei einem Wechsel des Seitenreiters alle Elemente, die sich auf einem Tabsheet befinden, zu verwalten. Wird also nun der Tabsheet gewechselt, gehen wir alle Dialogfenster durch und gucken, was mit ihnen geschen muss: anzeigen oder verbergen. Damit man sieht, wovon ich rede, hier der entsprechende Ausschnitt aus dem Code:
// which tabsheet is selected index := SendMessage(hTab, TCM_GETCURSEL, 0, 0);
Mit der Nachricht "TCM_GETCURSEL" ermitteln wir, welcher Tabsheet angeklickt wurde. Die Nachricht hat keine Parameter und liefert uns den Index des Tabsheets zurück.
Dann gehen wir in einer Schleife alle Dialogfenster durch und machen alle unsichtbar, die zu dem nicht ausgewählten Tabsheet gehören. Und das Fenster, das zum Tabsheet gehört, wird natürlich sichtbar gemacht:
// enum all available tabsheets for i := 0 to length(hTabDlgs) - 1 do begin // number of tabsheet does not equal selected tabsheet -> hide it if i <> index then ShowWindow(hTabDlgs[i], SW_HIDE) else // else make dialog visible begin SendMessage(hdr^.hwndFrom, TCM_GETITEMRECT, i, Longint(@rect)); SetWindowPos(hTabDlgs[index], 0, 50, (rect.Bottom - rect.Top) + 50, 0, 0, SWP_NOSIZE or SWP_NOZORDER or SWP_SHOWWINDOW); end; end;
Wie bekommen wir nun mit, dass ein Tabsheet angeklickt wurde? Das ist recht einfach: klickt der Benutzer einen Seitenreiter an, bekommen wir eine "WM_NOTIFY"-Nachricht. In der NMHDR-Struktur erhalten wir als Benachrichtigungscode "TCN_SELCHANGE" für einen Klick auf einen Seitenreiter:
WM_NOTIFY:
begin
hdr := PNMHDR(lParam);
case hdr^.code of
TCN_SELCHANGE:
// tabsheet selection has changed
{ ... }
end;
end;