Hi, danke für eure Antworten.
Dass es auf "Benutz doch TTabControl oder TPageControl" hinausläuft, dachte ich mir irgendwie schon. Dann hole ich mal noch etwas mehr aus. Bis jetzt habe ich das auch ungefähr so gemacht, wie von euch vorgeschlagen (nur dass ich TPageControl genutzt habe). Auf meinen Tabs ist allerdings ein Knopf zum Schließen drauf. Und völlig egal wie ich Tabs schließe - es tritt immer das
hier beschriebene Problem auf. Und mittlerweile nervt mich das so extrem, dass ich mein eigenes Tab bauen möchte (Dort funktioniert es nämlich wie gewünscht - aber eben nur mit Themes z.Z.). Die
Unit, in der das genannte Problem auftritt, ist übrigens auf streamwriter.org in den Quellen mit drin, Datei common\MControls.pas.
Dort ist auf jedem Tab oben ein Knopf drauf. Wird dieser geklickt, wird das Tab per PostMessage() benachrichtigt, dass ein Tab zu schließen ist. Wenn die Message ankommt, ruft das PageControl die Methode "RemoveTab" auf, die ich hier mal poste:
Delphi-Quellcode:
procedure TMPageControl.RemoveTab(Tab: TTabSheet);
var
Idx: Integer;
begin
SendMessage(
Handle, WM_SETREDRAW, 0, 0);
try
if Assigned(TMTabSheet(Tab).FOnClosed)
then
TMTabSheet(Tab).FOnClosed(Tab);
if Tab = ActivePage
then
begin
if PageCount - 1 > ActivePageIndex
then
Idx := ActivePageIndex
else
Idx := ActivePageIndex - 1;
end else
begin
if Tab.PageIndex <= ActivePageIndex
then
Idx := ActivePageIndex - 1
else
Idx := ActivePageIndex;
end;
if Idx < 0
then
Idx := 0;
if PageCount = 0
then
Idx := -1;
Tab.Parent :=
nil;
TabClosed(TMTabSheet(Tab));
Tab.Free;
ActivePageIndex := Idx;
finally
SendMessage(
Handle, WM_SETREDRAW, 1, 0);
end;
end;
Ja, WM_SETREDRAW ist über, bitte nicht hauen. Auch wenn die Berechnung von Idx nicht perfekt sein sollte, der Variable kann ich auch fest eine "1" zuweisen, das Problem mit dem Springen im Link von oben tritt *immer* auf. Ich habe da schon wochenlang experimentiert (auch den Vorschlag aus dem verlinkten Post von Union getestet) - nichts funktioniert. So aus Langeweile würde ich ja auch nicht versuchen, so ein Control selber zu implementieren..