Hallo!
Ich habe die aktuelle SpTBXLib ein wenig gepatched weil ich ein klitzekleines Problem hatte:
Es gibt doch diesen schönen "TSpTBXRightAlignSpacerItem", welcher eigentlich eine Art selbst-stretchender Spacer sein soll, sodass nachfolgende Items am rechten (horizontale Toolbars) bzw. unteren (vertikale Toolbars) Rand kleben sollten. Das funktioniert lustigerweise zwar bei einem TSpTBXTabControl, nicht aber bei normalen Toolbars. Auch nicht, wenn man sich peinlich genau an die FAQ hält (
http://www.silverpointdevelopment.co.../support.htm#4).
Grund: Die entsprechende Routine ist schlicht und ergreifend an der falschen Stelle implementiert. Statt in der SpTBXItem.pas, wo die Toolbar implementiert ist, findet man den entsprechenden Code in der SpTBXTabs.pas. Das halte ich für unsinnig, da ein TSpTBXTabControl letztendlich auch eine normale spTBXToolbar verwendet.
Also habe ich die beiden Units ein wenig gepatched, damit das auch mit den Toolbars funktioniert. 100%ig sauber ist das noch nicht, beim Verkleinern einer Toolbar "flickert" der ganze rechte/untere Teil ein wenig hin und her. Aber das Grundprinzip steht erstmal. Vielleicht verfeinert das ja noch jemand von euch
In der SpTBXItem.pas:
Delphi-Quellcode:
procedure TSpTBXToolbar.WMSize(
var Message: TWMSize);
var
I: Integer;
// Codehunter's implementation of TSpTBXRightAlignSpacerItem width calc
SpacerSize: Integer;
Sp: TSpTBXRightAlignSpacerItem;
// End of Cody's patch
V: TTBItemViewer;
R: TRect;
begin
inherited;
if Docked
and ((CurrentDock
is TSpTBXDock)
and not TSpTBXDock(CurrentDock).FResizing)
then begin
for I := 0
to View.ViewerCount - 1
do begin
V := View.Viewers[I];
if V.Show
and not IsRectEmpty(V.BoundsRect)
and not (V.Item
is TTBControlItem)
then
View.Invalidate(V);
end;
Self.Update;
InvalidateRect(
Handle,
nil, True);
for I := 0
to View.ViewerCount - 1
do begin
V := View.Viewers[I];
if V.Show
and not IsRectEmpty(V.BoundsRect)
and not (V.Item
is TTBControlItem)
then begin
R := V.BoundsRect;
ValidateRect(
Handle, @R);
end;
end;
// Codehunter's implementation of TSpTBXRightAlignSpacerItem width calc
end else if Docked
then begin
Sp:=
NIL;
if IsVertical
then begin
SpacerSize:= Self.ClientHeight;
end else begin
SpacerSize:= Self.ClientWidth;
end;
for I := 0
to View.ViewerCount - 1
do begin
V := View.Viewers[I];
// Detecting first TSpTBXRightAlignSpacerItem
if (Sp =
NIL)
and (V.Item
is TSpTBXRightAlignSpacerItem)
then begin
Sp:= TSpTBXRightAlignSpacerItem(V.Item);
end;
if V.Item.Visible
and not IsRectEmpty(V.BoundsRect)
and not (V.Item
is TSpTBXRightAlignSpacerItem)
then begin
if IsVertical
then begin
Dec(SpacerSize, (V.BoundsRect.Bottom - V.BoundsRect.Top));
end else begin
Dec(SpacerSize, (V.BoundsRect.Right - V.BoundsRect.Left));
end;
end;
end;
if Sp <>
NIL then begin
if IsVertical
then begin
Sp.CustomHeight:= SpacerSize - GetRightAlignMargin;
end else begin
Sp.CustomWidth:= SpacerSize - GetRightAlignMargin;
end;
end;
// End of Codehunter's patch
end;
end;
In der SpTBXTabs.pas:
Delphi-Quellcode:
procedure TSpTBXTabToolbar.Autofit;
var
I, TabsCount, TabsWidth, TabsArea, NonTabsArea, RightAlignWidth: Integer;
IV: TTBItemViewer;
R: TRect;
begin
if not FTabAutofit or IsUpdating or (Items.Count = 0) then Exit;
View.ValidatePositions;
View.BeginUpdate;
try
// Make all the clipped items visible
for I := 0 to FHiddenTabs.Count - 1 do
FHiddenTabs.Items[I].Item.Visible := True;
FHiddenTabs.Clear;
TabsCount := 0;
TabsWidth := 0;
NonTabsArea := 0;
RightAlignWidth := 0;
// Get TabsCount and NonTabsArea
for I := 0 to View.ViewerCount - 1 do begin
IV := View.Viewers[I];
if IV.Item.Visible then begin
if IV.Item is TSpTBXTabItem then
Inc(TabsCount)
else
if IV.Item is TSpTBXRightAlignSpacerItem then
Inc(RightAlignWidth, 20)
else begin
R := SpGetBoundsRect(IV, Items);
Inc(NonTabsArea, R.Right - R.Left);
end;
end;
end;
// Get TabsArea
if TabsCount > 0 then begin
TabsArea := CurrentDock.ClientWidth - 4 - NonTabsArea - RightAlignWidth;
TabsWidth := TabsArea div TabsCount;
if TabsWidth > FTabAutofitMaxSize then
TabsWidth := FTabAutofitMaxSize;
end;
// Get RightAlignWidth
Inc(RightAlignWidth, CurrentDock.Width - ((TabsWidth * TabsCount) + NonTabsArea + RightAlignWidth));
// Set TabsWidth and RightAlignWidth to the Items
for I := 0 to View.ViewerCount - 1 do begin
IV := View.Viewers[I];
if IV.Item.Visible then begin
if IV.Item is TSpTBXTabItem then
TSpTBXTabItem(IV.Item).CustomWidth := TabsWidth
else
// Moved implementation of TSpTBXRightAlignSpacerItem to TSpTBXToolbar.WMSize
// to work for SpTBXToolbar also. (Codehunter)
// if IV.Item is TSpTBXRightAlignSpacerItem then
// TSpTBXRightAlignSpacerItem(IV.Item).CustomWidth := RightAlignWidth - GetRightAlignMargin;
// End of Codehunter's patch
end;
end;
finally
View.EndUpdate;
end;
end;