Delphi is still a language and an environment valid to use, it is a like David against Golia, where Golia is Visual Studio. I’m still working with Delphi 2010 and to be honest has many lacks that VS has not, but on the other hand it is very efficient.
I was in the past a supporter of standard component and every time I had necessity of one I have developed it. Today it is different because there are too many companies that work to develop components, so maybe, it is not stupid to think about buying these.
By the way, I’m not here to talk about Delphi but to document how to realize a custom component like an "Explode\Collapse Panel". The idea is to group homogenous information (controls) inside these panels, to display in a user window. The main function should be activable by button on top left corner of panel that will collapse and expand the area and also it should drag an attached panel.
Here the
property of this component:
Events:
|
|
GrtOnExpand:
TNotifyEvent;
|
It is fired when the
area is expanded
|
GrtOnCollapse:
TNotifyEvent;
|
It is fired when the
area is collapsed
|
Properties
|
|
GrtCaption: string;
|
Control Caption
|
GrtHeight: ineteger;
|
Control Height when
expanded
|
GrtAttachedPanel:
TPanel;
|
Control Panel attached.
It is repositioned when the status of the control change.
|
GrtAutoCollapse:
boolean;
|
The control is
resized automatically.
|
GrtStatus: TEnumExpandStatus;
|
Control status
(expanded or collapsed)
|
GrtBtnImage: TBitmap;
|
Button Image
|
Many improvements can be done, this is a base object.
![]() |
| A sample of improved panel |
![]() |
| Exploded Panels on that application |
unit GrtPanel;
interface
uses
Windows, SysUtils, Classes, Controls, ExtCtrls, Buttons, StdCtrls, Graphics;
procedure Register;
type TEnumExpandStatus = (esExpanded, esCollapsed);
type
TGrtPanel = class(TPanel)
private
{ Private declarations }
FPanel: TPanel;
FExpandButton: TSpeedButton;
FCaptionLabel: TLabel;
FOnCollapse: TNotifyEvent;
FOnExpand: TNotifyEvent;
FAttachedPanel: TPanel;
FAutoCollapse: boolean;
FHeight: integer;
FStatus: TEnumExpandStatus;
procedure SetImage(AValue: TBitmap);
function GetImage(): TBitmap;
procedure SetHeight(AValue: integer);
procedure SetStatus(const AValue: TEnumExpandStatus);
procedure SetAutoCollapse(const AValue: boolean);
procedure SetLabel(AValue: string);
function GetLabel(): string;
procedure SetOnCollapse(const AValue: TNotifyEvent);
procedure SetOnExpand(const AValue: TNotifyEvent);
procedure SetAttachedPanel(const AValue: TPanel);
procedure ResizePanel();
const UP = '5';
const DOWN = '6';
const MIN_HEIGHT = 24;
protected
{ Protected declarations }
procedure OnMyButtonClick(Sender: TObject);
procedure OnShowPanel(Sender: TObject);
procedure AllignAttachedPanel();
procedure Paint; override;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
property GrtOnExpand: TNotifyEvent read FOnExpand write SetOnExpand;
property GrtOnCollapse: TNotifyEvent read FOnCollapse write SetOnCollapse;
property GrtCaption: string read GetLabel write SetLabel;
property GrtHeight: integer read FHeight write SetHeight;
property GrtAttachedPanel: TPanel read FAttachedPanel write SetAttachedPanel;
property GrtAutoCollapse: boolean read FAutoCollapse write SetAutoCollapse;
property GrtStatus: TEnumExpandStatus read FStatus write SetStatus;
property GrtBtnImage: TBitmap read GetImage write SetImage;
end;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TGrtPanel]);
end;
{ TGrtPanel }
procedure TGrtPanel.AllignAttachedPanel;
begin
if not Assigned(FAttachedPanel) then Exit;
FAttachedPanel.Top := Self.Top + Self.Height;
FAttachedPanel.Left := Self.Left;
if FAttachedPanel is TGrtPanel then
TGrtPanel(FAttachedPanel).AllignAttachedPanel();
end;
constructor TGrtPanel.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Self.Constraints.MinHeight := MIN_HEIGHT;
FStatus := esExpanded;
FAutoCollapse := false;
if FHeight > 0 then Self.Height := FHeight;
if not Assigned(FPanel) then begin
FPanel := TPanel.Create(Self);
with FPanel do
begin
Parent := Self;
Align := alTop;
Constraints.MinHeight := MIN_HEIGHT;
Height := MIN_HEIGHT;
BevelOuter := bvNone;
BorderWidth := 4;
Caption := '';
end; { PanTopContainer1 }
end;
if not Assigned(FExpandButton) then begin
FExpandButton := TSpeedButton.Create(Self);
with FExpandButton do
begin
Parent := FPanel;
Align := alLeft;
Width := 20;
Flat := true;
Font.Size := 12;
Caption := '6';
Font.Name := 'Webdings';
OnClick := OnMyButtonClick;
end; { ExpandButton1 }
end;
if not Assigned(FCaptionLabel) then begin
FCaptionLabel := TLabel.Create(Self);
with FCaptionLabel do
begin
Parent := FPanel;
Align := alClient;
Caption := 'Panel Caption';
Font.Style := [fsBold];
end; { CaptionLabel1 }
end;
AllignAttachedPanel();
end;
destructor TGrtPanel.Destroy;
begin
if Assigned(FExpandButton) then FreeAndNil(FExpandButton);
if Assigned(FCaptionLabel) then FreeAndNil(FCaptionLabel);
if Assigned(FPanel) then FreeAndNil(FPanel);
inherited;
end;
function TGrtPanel.GetImage: TBitmap;
begin
Result := FExpandButton.Glyph;
end;
function TGrtPanel.GetLabel: string;
begin
Result := FCaptionLabel.Caption;
end;
procedure TGrtPanel.OnMyButtonClick(Sender: TObject);
begin
if (FStatus = esExpanded) then begin
if Assigned(FOnCollapse) then FOnCollapse(Self);
FStatus := esCollapsed;
end else begin
if Assigned(FOnExpand) then FOnExpand(Self);
FStatus := esExpanded;
end;
ResizePanel();
end;
procedure TGrtPanel.Paint;
begin
inherited;
if (Assigned(FExpandButton.Glyph) and (not FExpandButton.Glyph.Empty)) then
FExpandButton.Caption := ''
else
FExpandButton.Caption := '6';
end;
procedure TGrtPanel.ResizePanel;
begin
if not FAutoCollapse then Exit;
if (FStatus = esExpanded) then begin
Self.Height := FHeight;
end else begin
Self.Height := FPanel.Height;
end;
AllignAttachedPanel();
end;
procedure TGrtPanel.SetAttachedPanel(const AValue: TPanel);
begin
FAttachedPanel := AValue;
AllignAttachedPanel();
end;
procedure TGrtPanel.SetAutoCollapse(const AValue: boolean);
begin
FAutoCollapse := AValue;
ResizePanel();
end;
procedure TGrtPanel.SetHeight(AValue: integer);
begin
FHeight := AValue;
end;
procedure TGrtPanel.SetImage(AValue: TBitmap);
begin
FExpandButton.Glyph := AValue;
if (Assigned(FExpandButton.Glyph) and (not FExpandButton.Glyph.Empty)) then
FExpandButton.Caption := ''
else
FExpandButton.Caption := '6';
end;
procedure TGrtPanel.SetLabel(AValue: string);
begin
FCaptionLabel.Caption := AValue;
end;
procedure TGrtPanel.SetOnCollapse(const AValue: TNotifyEvent);
begin
FOnCollapse := AValue;
end;
procedure TGrtPanel.SetOnExpand(const AValue: TNotifyEvent);
begin
FOnExpand := AValue;
end;
procedure TGrtPanel.SetStatus(const AValue: TEnumExpandStatus);
begin
FStatus := AValue;
if (FAutoCollapse) then ResizePanel();
end;
end.



No comments :
Post a Comment