AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

RightAlign bei SpTBXToolbar (Code inside)

Ein Thema von Codehunter · begonnen am 16. Apr 2012
Antwort Antwort
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

RightAlign bei SpTBXToolbar (Code inside)

  Alt 16. Apr 2012, 10:38
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz