[Back to DELPHI SWAG index]  [Back to Main SWAG index]  [Original]


*****************************************************************************
The following component might help you.
This is derived from TCustomPanel
To install:
        Put this source in a unit.
        Compile to a DCU
        Install it on a component palette
To use:
        To use as vertical split.
                1. Put a panel in the form. Align it to the top 
                    Let us call it DynamicPanel
                    Set Align property to alTop
                2. Add the TSplitBar component,
                    Set the SplitStyle property to splitVertical
                    Set Align property to alTop
                     Set the AdjucentControl to DynamicPanel
               3. Add a third panel and set Align property to alClient
                 4. Run the application. Click and drag the splitbar 
                5. Is this what you wanted.

You can make horizontal or vertical split, combination of both, any no
of splits in a single form. Just use the TPanel, TSplitBar and Align
properties with imaginations.

**** BUG ****
If you assign a control as the AdjuscentControl and later delete it,
this won't be reflected in the SplitBar component. This might generate
faults.
There are few more improvements that can be made. Correct it and
enjoy.
***************

kind regards
R.Venkatesh

{ ************* The source starts here ****************** }
unit Splitbar;

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, ExtCtrls;

type
  TSplitStyles = ( splitVertical, splitHorizontal );

  TSplitBar = class(TCustomPanel)
  private
     FSplitStyle : TSplitStyles;
     InResize    : Boolean;
     FAdjControl : TWinControl;
     OldX, OldY  : Integer;

     procedure SetSplitStyle(TheStyle : TSplitStyles);

  protected
     procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
                                 X, Y: Integer); Override;

     procedure MouseMove( Shift: TShiftState; X,Y : Integer);
Override;
     procedure MouseUp( Button: TMouseButton; Shift: TShiftState;
                                 X, Y: Integer); Override;
  public
     constructor Create( AOwner : TComponent); override;
     destructor Destroy; override;
  published
     property Align;
     property AdjucentControl : TWinControl read FAdjControl write
FAdjControl;
     property Enabled;
     property ShowHint;
     property SplitStyle : TSplitStyles read FSplitStyle write
SetSplitStyle;
  end;

procedure Register;

implementation

{*****************************************************************************}
procedure Register;
begin
  RegisterComponents('Samples', [TSplitBar]);
end;
{.........................................................................}
constructor TSplitBar.Create( AOwner : TComponent );
begin
   inherited Create(AOwner);
   Caption     := ' ';
   InResize    := False;
end;
{.........................................................................}
destructor TSplitBar.Destroy;
begin
   inherited Destroy;
end;
{.........................................................................}
procedure TSplitBar.SetSplitStyle(TheStyle : TSplitStyles);
begin
   FSplitStyle := TheStyle;
   { The following code is unncessory. 
      You can do this in design time itself }
   if TheStyle = splitVertical then
   begin
      Align := alTop;
      Cursor := crVSplit;
   end
   else
   begin
      Align := alLeft;
      Cursor := crHSplit;
   end;
end;
{.........................................................................}
procedure TSplitBar.MouseDown( Button: TMouseButton; Shift:
                                TShiftState;   X, Y: Integer);
begin
   inherited MouseDown(Button, Shift, X, Y);
   If NOT Enabled Then Exit;
   if FAdjControl = Nil then Exit;
   InResize := True;
   OldX := X;
   OldY := Y;
end;
{.........................................................................}
procedure TSplitBar.MouseMove( Shift: TShiftState; X,Y: Integer);
begin
   inherited MouseMove( Shift, X, Y);
   if InResize then
   begin
      if FSplitStyle = splitHorizontal then
         FAdjControl.Width := FAdjControl.Width + (X - OldX)
      else
         FAdjControl.Height := FAdjControl.Height + (Y - OldY)
   end;
end;
{.........................................................................}
procedure TSplitBar.MouseUp( Button: TMouseButton; Shift: TShiftState;
                             X, Y: Integer);
begin
   inherited MouseUp( Button, Shift, X, Y);
   InResize := False;
end;

{.........................................................................}

end.

{ ********** End of source ********************** }

[Back to DELPHI SWAG index]  [Back to Main SWAG index]  [Original]