![]() |
RightAlign bei SpTBXToolbar (Code inside)
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 ( ![]() 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:
In der SpTBXTabs.pas:
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;
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz