Ok. Pokusiłem się żeby coś napisać. Nie wiem czy jest to najlepsze i najbardziej optymalne rozwiązanie ale jakoś to działa. W PageControl ustawiasz OwnerDraw na True, następnie tworzysz sobie taką procedurkę:
procedure TForm1.RefreshTabSize;
var
TabI, CapI: Integer;
S: TStringList;
begin
PageControl.TabHeight := 10;// poczatkowe rozmiary Tabó'w - koniecznie male
PageControl.TabWidth := 10;
S := TStringList.Create;
try
for TabI := 0 to PageCOntrol.PageCount -1 do
begin
S.Text := PageControl.Pages[TabI].Caption;
for CapI := 0 to S.Count -1 do
if PageControl.TabWidth < Canvas.TextWidth(S[CapI]) then
PageControl.TabWidth := Canvas.TextWidth(S[CapI]) + 10;
if PageControl.TabHeight < S.Count * 15 + 5 then
PageControl.TabHeight := S.Count * 15 + 5;
end;
finally
S.Free;
end;
end;
A zdarzenie OnDrawTab powinno wyglądać tak:
procedure TForm1.PageControlDrawTab(Control: TCustomTabControl;
TabIndex: Integer; const Rect: TRect; Active: Boolean);
var
S: TStringList;
I: Integer;
begin
S := TStringList.Create;
try
PageControl.Canvas.FillRect(Rect);
ExtractStrings([#13], [], PChar(PageControl.Pages[TabIndex].Caption), S);
for I := 0 to S.Count -1 do
PageControl.Canvas.TextOut(Rect.Left +3+Integer(Active)*2, Rect.Top +4 + 15*I, S[I]);
finally
S.Free;
end;
end;
Teraz po każdej zmianie etykiety jakiegos Tab'a wywołujesz RefreshTabSize np.:
begin
PageControl.Pages[0].Caption := 'linijka nr1' #13 'to linijka nr2';
RefreshTabSize;
{...}
Wszystkie współrzędne dobrane zostały eksperymentalnie, także różnie to może z nimi być :-P
Mam nadzieję, że będzie działać ;-)