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

📄 mxoutlookbarproeditor.pas

📁 可以在C++中实现OutLook界面和windows资源管理器的效果。
💻 PAS
📖 第 1 页 / 共 2 页
字号:

Procedure TmxHeaderEditor.SelectButton( AButton: TmxButton );
Var
  FComponents: TDesignerSelectionList;
Begin
  If CheckCollection And Active Then
  Begin
    FComponents := {$IFDEF DELPHI6_UP}TDesignerSelections{$ELSE}TDesignerSelectionList{$ENDIF}.Create;

    If AButton <> Nil Then
      FComponents.Add( AButton ) Else
      FComponents.Add( OutlookBarPro );

    SetSelection( FComponents );
  End;
End;

Function TmxHeaderEditor.ButtonByRow( ARow: Integer ): TmxButton;
Begin
  Result := Nil;
  If ARow >= 0 Then
  Begin
    If FActiveHeader <> Nil Then
    Begin
      If ARow < FActiveHeader.ButtonCount Then
        Result := FActiveHeader.Buttons[ ARow ];
    End;
  End;
End;

Function TmxHeaderEditor.HeaderByRow( ARow: Integer ): TmxHeader;
Begin
  Result := Nil;
  If CheckCollection And ( ARow >= 0 ) And ( ARow < OutlookBarPro.HeaderCount ) Then
  Begin
    Result := OutlookBarPro.Headers[ ARow ];
  End;
End;

{$IFDEF DELPHI6_UP}

Procedure TmxHeaderEditor.ItemDeleted( Const ADesigner: IDesigner; Item: TPersistent );
Begin
  If Item = OutlookBarPro Then
  Begin
    OutlookBarPro := Nil;
    Close;
  End;

  If Item = FActiveHeader Then
  Begin
    FActiveHeader := Nil;
    Grid_Buttons.RowCount := 2;
  End;
End;

{$ELSE}

Procedure TmxHeaderEditor.ComponentDeleted( Component: IPersistent );
Begin
  If ExtractPersistent( Component ) = OutlookBarPro Then
  Begin
    OutlookBarPro := Nil;
    Close;
  End;

  If ExtractPersistent( Component ) = FActiveHeader Then
  Begin
    FActiveHeader := Nil;
    Grid_Buttons.RowCount := 2;
  End;
End;
{$ENDIF}

Procedure DrawCellTextEx( Control: TCustomControl; ACol, ARow: Longint; Const S: String; Const ARect: TRect; Align: TAlignment; VerticalAlign: TmxVerticalAlignment; WordWrap: Boolean; ARightToLeft: Boolean );
Var
  H: Integer;
Begin
  H := 2;
  Case VerticalAlign Of
    vaTopJustify: H := 2;
    vaCenter: H := Max( 1, ( ARect.Bottom - ARect.Top - TCustomClass( Control ).Canvas.TextHeight( 'W' ) ) Div 2 );
    vaBottomJustify: H := Max( 2, ARect.Bottom - ARect.Top - TCustomClass( Control ).Canvas.TextHeight( 'W' ) );
  End;
  WriteText( TCustomClass( Control ).Canvas, ARect, 2, H, S, Align, WordWrap, ARightToLeft );
End;

Procedure DrawCellText( Control: TCustomControl; ACol, ARow: Longint; Const S: String; Const ARect: TRect; Align: TAlignment; VerticalAlign: TmxVerticalAlignment; ARightToLeft: Boolean );
Begin
  DrawCellTextEx( Control, ACol, ARow, S, ARect, Align, VerticalAlign, Align = taCenter, ARightToLeft );
End;

Procedure TmxHeaderEditor.grid_HeadersDrawCell( Sender: TObject; Col, Row: Longint; Rect: TRect; State: TGridDrawState );
Var
  Text: String;
  AHeader: TmxHeader;
Begin
  If FDeleting Then Exit;
  Text := '';
  If gdFixed In State Then Text := 'Header name' Else
  Begin
    AHeader := HeaderByRow( Row - 1 );
    If AHeader <> Nil Then Text := AHeader.Name;
  End;
  DrawCellText( grid_Headers, Col, Row, Text, Rect, taLeftJustify, vaCenter, False );
End;

Procedure TmxHeaderEditor.grid_HeadersSelectCell( Sender: TObject; Col, Row: Longint; Var CanSelect: Boolean );
Begin
  SelectHeader( HeaderByRow( Row - 1 ) );
End;

Procedure TmxHeaderEditor.btn_CloseClick( Sender: TObject );
Begin
  Close;
End;

Procedure TmxHeaderEditor.btn_DeleteClick( Sender: TObject );
Var
  AHeader: TmxHeader;
Begin
  AHeader := HeaderByRow( grid_Headers.Row - 1 );

  If AHeader <> Nil Then
  Begin
    If FActiveHeader <> Nil Then
      If FActiveHeader = AHeader Then FActiveHeader := Nil;

    FDeleting := True;
    OutlookBarPro.DeleteHeader( AHeader.HeaderIndex );
    FDeleting := False;

    If OutlookBarPro.HeaderCount > 0 Then
    Begin
      AHeader := HeaderByRow( grid_Headers.Row - 1 );
      SelectHeader( AHeader );
    End
    Else SelectHeader( Nil );
    UpdateData;
    Designer.Modified;
  End;
End;

Procedure TmxHeaderEditor.grid_HeadersKeyDown( Sender: TObject; Var Key: Word; Shift: TShiftState );
Begin
  If Shift = [ ] Then
    Case Key Of
      VK_RETURN: If HeaderByRow( grid_Headers.Row - 1 ) <> Nil Then ActivateInspector( #0 );
      VK_DELETE: btn_DeleteClick( Nil );
    End;
End;

Procedure TmxHeaderEditor.FormCreate( Sender: TObject );
Begin
  OutlookBarPro := Nil;
  FActiveHeader := Nil;
  FDeleting := False;
  If NewStyleControls Then Font.Style := [ ];
End;

Procedure TmxHeaderEditor.FormResize( Sender: TObject );
Begin
  With grid_Headers Do ColWidths[ 0 ] := ClientWidth;
End;

{$IFDEF DELPHI6_UP}

Function TmxHeaderEditor.EditAction( Action: TEditAction ): Boolean;
Begin
  Result := True;
{$ELSE}

Procedure TmxHeaderEditor.EditAction( Action: TEditAction );
Begin
{$ENDIF}
  Case Action Of
    eaDelete: btn_DeleteClick( Self );
  End;
End;

Procedure TmxHeaderEditor.btn_NewClick( Sender: TObject );
Var
  I: Integer;
  AHeader: TmxHeader;
Begin
  AHeader := OutlookBarPro.AddHeader;

  If AHeader <> Nil Then
  Try
    With OutlookBarPro Do
    Begin
      I := AHeader.HeaderIndex;
      If ActiveHeader = Nil Then ActiveHeader := AHeader;
    End;
    SelectHeader( AHeader );
    Designer.Modified;
    ActivateInspector( #0 );
    grid_Headers.Row := I + 1;
  Except
    AHeader.Free;
    Raise;
  End
  Else Raise Exception.Create( 'Cannot create new header' );
End;

Procedure TmxHeaderEditor.btn_ClearClick( Sender: TObject );
Begin
  If MessageDlg( 'Do you really want to delete all headers?', mtConfirmation, [ mbOK, mbCancel ], 0 ) = mrOK Then
  Begin
    OutlookBarPro.ClearHeaders;
    UpdateData;
  End;
End;

Procedure TmxHeaderEditor.Activated;
Begin
  SelectHeader( HeaderByRow( grid_Headers.Row - 1 ) );
End;

Function TmxHeaderEditor.UniqueName( Component: TComponent ): String;
Begin
  Result := '';
End;

Procedure TmxHeaderEditor.Splitter1Moved( Sender: TObject );
Begin
  ClientPanelResize( Self );
End;

Procedure TmxHeaderEditor.ClientPanelResize( Sender: TObject );
Begin
  grid_Headers.ColWidths[ 0 ] := grid_Headers.ClientWidth;
  Grid_Buttons.ColWidths[ 0 ] := Grid_Buttons.ClientWidth;
End;

Procedure TmxHeaderEditor.FormShow( Sender: TObject );
Begin
  ClientPanelResize( Self );
End;

Procedure TmxHeaderEditor.Grid_ButtonsDrawCell( Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState );
Var
  Text: String;
  AButton: TmxButton;
Begin
  If FDeleting Then Exit;
  Text := '';
  If gdFixed In State Then Text := 'Button name' Else
  Begin
    AButton := ButtonByRow( ARow - 1 );
    If AButton <> Nil Then Text := AButton.Name;
  End;
  DrawCellText( Grid_Buttons, ACol, ARow, Text, Rect, taLeftJustify, vaCenter, False );
End;

Procedure TmxHeaderEditor.Grid_ButtonsKeyDown( Sender: TObject; Var Key: Word; Shift: TShiftState );
Begin
  If Shift = [ ] Then
    Case Key Of
      VK_RETURN: If ButtonByRow( Grid_Buttons.Row - 1 ) <> Nil Then ActivateInspector( #0 );
      VK_DELETE: btn_DeleteClick( Nil );
    End;
End;

Procedure TmxHeaderEditor.btn_DeleteButtonClick( Sender: TObject );
Var
  AHeader: TmxHeader;
  AButton: TmxButton;
Begin
  AHeader := HeaderByRow( grid_Headers.Row - 1 );

  If AHeader <> Nil Then
  Begin
    AButton := ButtonByRow( Grid_Buttons.Row - 1 );

    If AButton <> Nil Then
    Begin
      AHeader.DeleteButton( AButton.ButtonIndex );
      SelectHeader( AHeader );

      If Grid_Buttons.RowCount > 2 Then Grid_Buttons.RowCount := Grid_Buttons.RowCount - 1;
      UpdateData;
      Designer.Modified;
    End;
  End;
End;

Procedure TmxHeaderEditor.Grid_ButtonsSelectCell( Sender: TObject; ACol, ARow: Integer; Var CanSelect: Boolean );
Begin
  SelectButton( ButtonByRow( ARow - 1 ) );
End;

Procedure TmxHeaderEditor.btn_NewButtonClick( Sender: TObject );
Var
  AButton: TmxButton;
Begin
  AButton := FActiveHeader.AddButton;

  If AButton <> Nil Then
  Try
    SelectHeader( FActiveHeader );
    SelectButton( AButton );
    Designer.Modified;
    ActivateInspector( #0 );
    grid_Buttons.Row := AButton.ButtonIndex + 1;
  Except
    AButton.Free;
    Raise;
  End
  Else Raise Exception.Create( 'Cannot create new button' );
End;

End.

⌨️ 快捷键说明

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