⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sframebar.pas

📁 Alpha Controls 界面控件包
💻 PAS
📖 第 1 页 / 共 2 页
字号:

constructor TsFrameBar.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  SkinData.COC := COC_TsFrameBar;
  FItems := TsTitles.Create(Self);

  Caption := ' ';
  Align := alLeft;
  BevelOuter := bvLowered;
  FTitleHeight := 28;
  VertScrollBar.Tracking := True;
  HorzScrollBar.Visible := False;
  FBorderWidth := 2;
  FAnimation := True;
  FAllowAllClose := False;
  FAllowAllOpen := False;
end;

function TsFrameBar.CreateDefaultFrame: TFrame;
begin

  Result := TFrame.Create(Self);
  Result.Height := 150;
  with TsFrameAdapter.Create(Result) do begin
    SkinData.SkinManager := Self.SkinData.FSkinManager;
    SkinData.SkinSection := s_BarPanel;
  end;
  with TsLabel.Create(Result) do begin
    Align := alClient;
    Caption := 'Frame creation'#13#10'event has not been defined.';
    Alignment := taCenter;
    Layout := tlCenter;
    WordWrap := True;
    Font.color := clRed;
    Parent := Result;
  end;
end;

destructor TsFrameBar.Destroy;
begin
  FreeAndNil(FItems);
  inherited Destroy;
end;

procedure TsFrameBar.ExpandAll(AllowAnimation : boolean);
var
  i : integer;
begin

  for i := 0 to Items.Count - 1 do if AllowAnimation then Items[i].State := stOpening else Items[i].State := stOpened;
  ArrangeTitles;
end;

procedure TsFrameBar.Loaded;
var
  i : integer;
begin
  inherited;
  for i := 0 to Items.Count - 1 do Items[i].TitleButton.SkinData.SkinManager := SkinData.FSkinManager;
  if Visible then Rearrange
end;

function TsFrameBar.Offset: integer;
begin
  if Assigned(ListSW) and (ListSW.sBarVert <> nil) and ListSW.sBarVert.fScrollVisible
    then Result := ListSW.sBarVert.ScrollInfo.nPos else Result := 0
end;

procedure TsFrameBar.OpenItem(Index: integer; AllowAnimation: boolean);
var
  i : integer;
begin

  if AllowAnimation then Items[Index].State := stOpening else Items[Index].State := stOpened;
  if not AllowAllOpen then begin
    for i := 0 to Items.Count - 1 do if Items[i].State = stOpened then Items[i].State := stClosing;
    Items[Index].State := stOpened;
  end;
  DontAnim := not AllowAnimation;
  ArrangeTitles;
  DontAnim := False;
end;

procedure TsFrameBar.Rearrange;
begin
  DontAnim := True;
  ArrangeTitles;
  DontAnim := False;
end;

procedure TsFrameBar.SetAllowAllOpen(const Value: boolean);
begin
  if FAllowAllOpen <> Value then begin
    if Value and FAutoFrameSize then FAutoFrameSize := False;
    FAllowAllOpen := Value;
    if not (csLoading in ComponentState) then Rearrange;
  end;
end;

procedure TsFrameBar.SetAutoFrameSize(const Value: boolean);
begin
  if FAutoFrameSize <> Value then begin
    if Value then begin
      if AllowAllOpen then AllowAllOpen := False;
      AutoScroll := False;
    end;
    FAutoFrameSize := Value;
    if not (csLoading in ComponentState) then Rearrange;
  end;
end;

procedure TsFrameBar.SetBorderWidth(const Value: integer);
begin
  if FBorderWidth <> Value then begin
    FBorderWidth := Value;
    RecreateWnd;
    if not (csLoading in ComponentState) then Rearrange;
  end;
end;

procedure TsFrameBar.SetImages(const Value: TCustomImageList);
var
  i : integer;
begin
  if FImages <> Value then begin
    FImages := Value;
    for i := 0 to Items.Count - 1 do if Items[i].TitleButton.Visible then Items[i].TitleButton.Images := Images;
  end;
end;

procedure TsFrameBar.SetItems(const Value: TsTitles);
begin

  FItems.Assign(Value);
end;

procedure TsFrameBar.SetSpacing(const Value: integer);
begin

  if FSpacing <> Value then begin
    FSpacing := Value;
    if not (csLoading in ComponentState) then Rearrange;
  end;
end;

procedure TsFrameBar.SetTitleHeight(const Value: integer);
begin

  if FTitleHeight <> Value then begin
    FTitleHeight := Value;
    if not (csLoading in ComponentState) then Rearrange;
  end;
end;

function TsFrameBar.UpdateFrame(i, y, h, w : integer) : boolean;
var
  rgn : hrgn;
begin
  Result := False;
  if Items.Count <= i then Exit;
  if (Items[i].Frame = nil) and not (csDesigning in ComponentState) then begin
    if Assigned(Items[i].OnCreateFrame)
      then Items[i].OnCreateFrame(Items[i], Items[i].Frame)
      else Items[i].Frame := CreateDefaultFrame;
  end;
  if (Items[i].Frame <> nil) then begin
    if (Items[i].FrameSize = 0) then Items[i].FrameSize := Items[i].Frame.Height;
    if h = -1 then begin
      h := Items[i].FrameSize; // if frame has not been created
      Items[i].Frame.Height := Items[i].FrameSize;
    end;
    if h = 0 then begin
      rgn := CreateRectRgn(-1, -1, -1, -1);
      SetWindowRgn(Items[i].Frame.Handle, rgn, False);
      Items[i].Frame.Visible := False;
    end
    else if h = Items[i].Frame.Height then begin
      rgn := CreateRectRgn(0, 0, Items[i].Frame.Width, Items[i].Frame.Height);
      SetWindowRgn(Items[i].Frame.Handle, rgn, False);
      Items[i].Frame.Visible := True;
    end
    else begin
      rgn := CreateRectRgn(0, Items[i].Frame.Height - h, w, Items[i].Frame.Height);
      SetWindowRgn(Items[i].Frame.Handle, rgn, False);
      Items[i].Frame.Visible := True;
    end;
    Items[i].Frame.SetBounds(Items[i].TitleButton.Left, y - (Items[i].Frame.Height - h), w, Items[i].Frame.Height);
    Result := True
  end
  else Result := False;
end;

procedure TsFrameBar.UpdateWidths;
var
  i, cWidth : integer;
begin
  Arranging := True;
  cWidth := WidthOf(CalcClientRect);
  for i := 0 to Items.Count - 1 do if Items[i].TitleButton.Visible and Items[i].Visible then begin
    if Items[i].TitleButton.Width <> cWidth then begin
      Items[i].TitleButton.SkinData.BGChanged := True;
      Items[i].TitleButton.Width := cWidth;
    end;
    if (Items[i].Frame <> nil) and (Items[i].Frame.Width <> cWidth) then begin
      Items[i].Frame.Width := cWidth;
    end;
  end;
  Arranging := False;
  if AutoScroll then UpdateScrolls(ListSW);
end;

procedure TsFrameBar.WndProc(var Message: TMessage);
var
  i : integer;
begin
  inherited;          
  case Message.Msg of
    WM_SIZE : if Showing then begin
      if AutoFrameSize then Rearrange else begin
        UpdateWidths;
        SendMessage(Handle, WM_NCPAINT, 0, 0);
      end;
    end;
    CM_VISIBLECHANGED : if Showing then begin
      Rearrange;
    end;
    CM_ENABLEDCHANGED: begin
      for i := 0 to Items.Count - 1 do begin
        Items[i].TitleButton.Enabled := Enabled;
        if Items[i].Frame <> nil then Items[i].Frame.Enabled := Enabled;
      end;
      Repaint
    end;
  end;
  if Message.Msg = cardinal(SM_ALPHACMD) then case Message.WParamHi of
    AC_REFRESH : if (LongWord(Message.LParam) = LongWord(SkinData.SkinManager)) and SkinData.Skinned then UpdateWidths
  end;
end;

{ TsTitleItem }

constructor TsTitleItem.Create(Collection: TCollection);
begin
  inherited Create(Collection);

  FOwner := TsTitles(Collection);
  TitleButton := TsTitleButton.InternalCreate(FOwner.FOwner, Index);
  TitleButton.TitleItem := Self;
  TitleButton.OnClick := TitleButtonClick;
  FVisible := True;
  DontAnim := True;
  FOwner.FOwner.ArrangeTitles;
  DontAnim := False;
  FImageIndex := -1;
  State := stClosed;
end;

destructor TsTitleItem.Destroy;
begin
  if not (csDestroying in FOwner.FOwner.ComponentState) and (TitleButton <> nil) then begin
    TitleButton.Visible := False;
    TitleButton.Free;
    TitleButton := nil;
    if Frame <> nil then FreeAndNil(Frame);
  end;
  inherited Destroy;
  if not (csDestroying in FOwner.FOwner.ComponentState) then FOwner.FOwner.ArrangeTitles;
end;

function TsTitleItem.GetMargin: integer;
begin
  Result := TitleButton.Margin; 
end;

function TsTitleItem.GetSkinSection: string;
begin
  Result := TitleButton.SkinData.SkinSection;
end;

function TsTitleItem.GetSpacing: integer;
begin
  if Result <> TitleButton.Spacing then begin
    Result := TitleButton.Spacing;
    if csDesigning in TitleButton.ComponentState then TitleButton.SkinData.Invalidate;
  end;
end;

procedure TsTitleItem.SetCaption(const Value: string);
begin
  TitleButton.Caption := Value;
  FCaption := Value;
end;

procedure TsTitleItem.SetImageIndex(const Value: integer);
begin
  if FImageIndex <> Value then begin
    FImageIndex := Value;
    TitleButton.ImageIndex := Value;
    if TitleButton.Images <> FOwner.FOwner.Images then TitleButton.Images := FOwner.FOwner.Images
  end;
end;

procedure TsTitleItem.SetMargin(const Value: integer);
begin
  if TitleButton.Margin <> Value then begin
    TitleButton.Margin := Value;
    if csDesigning in TitleButton.ComponentState then TitleButton.SkinData.Invalidate;
  end;
end;

procedure TsTitleItem.SetSkinSection(const Value: string);
begin

  TitleButton.SkinData.SkinSection := Value
end;

procedure TsTitleItem.SetSpacing(const Value: integer);
begin
  TitleButton.Spacing := Value;
end;

procedure TsTitleItem.SetVisible(const Value: boolean);
begin
  if FVisible <> Value then begin
    FVisible := Value;
    if Value then TitleButton.Parent := FOwner.FOwner else TitleButton.Parent := nil;
    FOwner.FOwner.ArrangeTitles;
  end;
end;

procedure TsTitleItem.TitleButtonClick;
var
  i : integer;
begin
  if (csDesigning in FOwner.FOwner.ComponentState) then Exit;
  if Assigned(TitleButton) and Assigned(FOnClick) then FOnClick(TitleButton);
  case State of
    stClosed : begin
      State := stOpening;
      if not FOwner.FOwner.AllowAllOpen
        then for i := 0 to FOwner.Count - 1 do if FOwner[i].State = stOpened then FOwner[i].State := stClosing;
    end;
    stOpened : if FOwner.FOwner.AllowAllClose then FOwner[Index].State := stClosing;
  end;
  FOwner.FOwner.ArrangeTitles;
end;

{ TsTitleButton }
function TsTitleButton.CurrentState: integer;
begin

  Result := inherited CurrentState;
  if (Result = 0) and Active then Result := 1; // 4.84
end;

constructor TsTitleButton.InternalCreate(AOwner: TsFrameBar; Index: integer);
begin
  inherited Create(AOwner);

  SkinData.COC := COC_TsBarTitle;
  Name := 'sTitleButton' + IntToStr(Index + 1);
  Alignment := taLeftJustify;
  Spacing := 8;
  Margin := 5;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -