home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2001 September
/
Chip_2001-09_cd1.bin
/
zkuste
/
delphi
/
kolekce
/
d56
/
RMCTL.ZIP
/
rmBtnEdit.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
2001-06-22
|
15KB
|
525 lines
{================================================================================
Copyright (C) 1997-2001 Mills Enterprise
Unit : rmBtnEdit
Purpose : An edit control with a combo type button (or two). Also used as a
basis for a couple of the "rm" combo boxes.
Date : 03-15-1999
Author : Ryan J. Mills
Version : 1.80
================================================================================}
unit rmBtnEdit;
interface
{$I CompilerDefines.INC}
uses Windows, Classes, StdCtrls, Controls, Messages, SysUtils,
Forms, Graphics, Buttons, rmSpeedBtns, rmBaseEdit;
type
{ TrmCustomBtnEdit }
TrmCustomBtnEdit = class(TrmCustomEdit)
private
fundo : string;
FButton1, FButton2: TrmSpeedButton;
fOnBtn1Click,
fOnBtn2Click : TNotifyEvent;
FEditorEnabled: Boolean;
FBtnWidth : integer;
fBtn2IsVisible,
fBtn1IsEnabled,
fBtn2IsEnabled : boolean;
fBtn1DefaultGlyph,
fBtn2DefaultGlyph : boolean;
fUseDefaultGlyphs : boolean;
procedure SetEditRect;
procedure SetBtnWidth(value:integer);
function GetBtn1Enabled: boolean;
function GetBtn1Glyph:TBitMap;
function GetBtn1NumGlyphs:TNumGlyphs;
function GetBtn1Visible:boolean;
function GetBtn2Enabled: boolean;
function GetBtn2Glyph:TBitMap;
function GetBtn2NumGlyphs:TNumGlyphs;
function GetBtn2Visible: boolean;
procedure SetBtn1Enabled(const Value: boolean);
procedure SetBtn1Glyph(value:TBitMap);
procedure SetBtn1NumGlyphs(value:TNumGlyphs);
procedure SetBtn1Visible(value:boolean);
procedure SetBtn2Enabled(const Value: boolean);
procedure SetBtn2Glyph(value:TBitMap);
procedure SetBtn2NumGlyphs(value:TNumGlyphs);
procedure SetBtn2Visible(const Value: boolean);
procedure ResetDefaultGlyphs;
procedure WMSize(var Message: TWMSize); message WM_SIZE;
procedure CMEnter(var Message: TCMGotFocus); message CM_ENTER;
procedure WMPaste(var Message: TWMPaste); message WM_PASTE;
procedure WMCut(var Message: TWMCut); message WM_CUT;
procedure CMSysColorChange(var Message:TMessage); message CM_SYSCOLORCHANGE;
{$ifdef D4_OR_HIGHER}
procedure SetEnabled(value:Boolean); reintroduce; (* reintroduce is D4 Modification *)
function GetEnabled:Boolean; reintroduce; (* reintroduce is D4 Modification *)
{$else}
procedure SetEnabled(value:Boolean);
function GetEnabled:Boolean;
{$endif}
procedure SetUseDefaultGlyphs(const Value: boolean);
protected
procedure BtnClick (Sender: TObject); virtual;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure KeyPress(var Key: Char); override;
procedure CreateParams(var Params: TCreateParams); override;
procedure CreateWnd; override;
function GetButton(index:integer):TrmSpeedButton;
property BtnWidth:integer read FBtnWidth write setBtnWidth stored true default 16;
property Btn1Enabled : boolean read GetBtn1Enabled write SetBtn1Enabled stored true default true;
property Btn1Glyph:TBitmap read GetBtn1Glyph write SetBtn1Glyph stored True;
property Btn1NumGlyphs: TNumGlyphs read GetBtn1NumGlyphs write SetBtn1NumGlyphs stored true;
property Btn1Visible:boolean read GetBtn1Visible write SetBtn1Visible stored true default true;
property Btn2Enabled : boolean read GetBtn2Enabled write SetBtn2Enabled stored true default true;
property Btn2Glyph:TBitmap read GetBtn2Glyph write SetBtn2Glyph stored True;
property Btn2NumGlyphs: TNumGlyphs read GetBtn2NumGlyphs write SetBtn2NumGlyphs stored true;
Property Btn2Visible:boolean read GetBtn2Visible write SetBtn2Visible stored true default false;
property UseDefaultGlyphs : boolean read fUseDefaultGlyphs write SetUseDefaultGlyphs default true;
property EditorEnabled: Boolean read FEditorEnabled write FEditorEnabled default True;
property Enabled: Boolean read GetEnabled write SetEnabled default True;
property OnBtn1Click:TNotifyEvent read fOnBtn1Click write fOnBtn1Click;
property OnBtn2Click:TNotifyEvent read fOnBtn2Click write fOnBtn2Click;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure SetFocus; override;
end;
TrmBtnEdit = class(TrmCustomBtnEdit)
published
property Align;
{$ifdef D4_OR_HIGHER}
property Anchors;
property Constraints;
{$endif}
property AutoSelect;
property AutoSize;
property BtnWidth;
property Btn1Enabled;
property Btn1Glyph;
property Btn1NumGlyphs;
property Btn1Visible;
property Btn2Enabled;
property Btn2Glyph;
property Btn2NumGlyphs;
Property Btn2Visible;
property BorderStyle;
property Color;
property Ctl3D;
property DragCursor;
property DragMode;
property EditorEnabled;
property Enabled;
property Font;
property MaxLength;
property ParentColor;
property ParentCtl3D;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ReadOnly;
property ShowHint;
property TabOrder;
property TabStop;
property Text;
property Visible;
property OnChange;
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnEnter;
property OnExit;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnStartDrag;
property OnBtn1Click;
property OnBtn2Click;
end;
implementation
{$R rmBtnEdit.res}
uses rmLibrary;
{ TrmCustomBtnEdit }
constructor TrmCustomBtnEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
fUseDefaultGlyphs := true;
FButton1 := TrmSpeedButton.Create (Self);
with FButton1 do
begin
Visible := True;
Style := sbsComboButton;
Cursor := crArrow;
Parent := Self;
Align := alRight;
OnClick := BtnClick;
enabled := true;
Layout := blGlyphTop;
end;
fBtn1IsEnabled := true;
fBtn1DefaultGlyph := true;
Btn1Glyph := nil;
FButton2 := TrmSpeedButton.Create (Self);
with FButton2 do
begin
Visible := false;
Style := sbsComboButton;
Cursor := crArrow;
Parent := Self;
Align := alRight;
OnClick := BtnClick;
Layout := blGlyphTop;
enabled := true;
end;
fBtn2IsEnabled := true;
fBtn2IsVisible := false;
fBtn2DefaultGlyph := true;
Btn2Glyph := nil;
BtnWidth := 16;
Text := '';
ControlStyle := ControlStyle - [csSetCaption];
FEditorEnabled := True;
end;
destructor TrmCustomBtnEdit.Destroy;
begin
FButton1.free; // := nil;
FButton2.free; // := nil;
inherited Destroy;
end;
procedure TrmCustomBtnEdit.KeyDown(var Key: Word; Shift: TShiftState);
begin
if (Key = VK_RETURN) then
begin
if ([ssCtrl] = Shift) then BtnClick (FButton1)
else
if ([ssctrl, ssShift] = Shift) then BtnClick (FButton2)
else
if (shift = []) then
begin
setfocus;
inherited KeyDown(key, shift);
end;
end
else
if (key = vk_escape) then
begin
if (shift = []) and (text <> fundo) then
begin
text := fundo;
selectall;
end;
end
else
inherited KeyDown(Key, Shift);
end;
procedure TrmCustomBtnEdit.setfocus;
begin
fundo := text;
inherited;
end;
procedure TrmCustomBtnEdit.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
{ Params.Style := Params.Style and not WS_BORDER; }
Params.Style := Params.Style or WS_CLIPCHILDREN or ES_MULTILINE;
end;
procedure TrmCustomBtnEdit.CreateWnd;
begin
inherited CreateWnd;
SetEditRect;
end;
procedure TrmCustomBtnEdit.SetEditRect;
var
R: TRect;
begin
SendMessage(Handle, EM_GETRECT, 0, LongInt(@R));
if FButton1.visible then
R.Right := ClientWidth - fBtnWidth - 1
else
R.right := ClientWidth;
if FButton2.visible then
R.Right := R.right - fBtnWidth;
R.Top := 0;
R.Left := 0;
SendMessage(Handle, EM_SETRECTNP, 0, LongInt(@R));
SendMessage(Handle, EM_GETRECT, 0, LongInt(@R)); {debug}
end;
procedure TrmCustomBtnEdit.WMSize(var Message: TWMSize);
begin
inherited;
if NewStyleControls and Ctl3D then
begin
if fButton2.Visible then
begin
FButton1.SetBounds((width - (fBtnWidth shl 1)) - 4, 0, fBtnWidth, Height - 4);
FButton2.SetBounds((width - fBtnWidth) - 4, 0, fBtnWidth, Height - 4);
end
else
FButton1.SetBounds((width - fBtnWidth) - 4, 0, fBtnWidth, Height - 4);
end
else
begin
if fButton2.Visible then
begin
FButton1.SetBounds (width - (fBtnWidth shl 1), 1, fBtnWidth, Height - 2);
FButton2.SetBounds (width - fBtnWidth, 1, fBtnWidth, Height - 2);
end
else
FButton1.SetBounds (width - fBtnWidth, 1, fBtnWidth, Height - 2);
end;
if csdesigning in componentstate then
begin
if not fbutton1.visible then fbutton1.width := 0;
if not fbutton2.visible then fbutton2.width := 0;
end;
SetEditRect;
end;
procedure TrmCustomBtnEdit.BtnClick (Sender: TObject);
begin
SetFocus;
if (Sender is TrmSpeedButton) and (TrmSpeedButton(Sender) = fbutton1) and assigned(fOnBtn1Click) then
fOnBtn1Click(self)
else
if (Sender is TrmSpeedButton) and (TrmSpeedButton(Sender) = fbutton2) and assigned(fOnBtn2Click) then
fOnBtn2Click(self)
end;
procedure TrmCustomBtnEdit.WMPaste(var Message: TWMPaste);
begin
if not FEditorEnabled or ReadOnly then Exit;
inherited;
end;
procedure TrmCustomBtnEdit.WMCut(var Message: TWMPaste);
begin
if not FEditorEnabled or ReadOnly then Exit;
inherited;
end;
procedure TrmCustomBtnEdit.CMEnter(var Message: TCMGotFocus);
begin
if AutoSelect and not (csLButtonDown in ControlState) then
SelectAll;
inherited;
end;
procedure TrmCustomBtnEdit.SetBtn1Glyph(value:TBitMap);
var
bmp : TBitmap;
begin
FButton1.glyph := value;
fBtn1DefaultGlyph := false;
if fUseDefaultGlyphs and (value = nil) then
begin
fBtn1DefaultGlyph := true;
bmp := tbitmap.create;
try
bmp.LoadFromResourceName(HInstance,'RM_ELLIPSIS');
ReplaceColors(bmp, clBtnFace, clBtnText);
fButton1.Glyph.Assign(bmp);
finally
bmp.free;
end;
end;
end;
function TrmCustomBtnEdit.GetBtn1Glyph:TBitMap;
begin
result := FButton1.glyph;
end;
procedure TrmCustomBtnEdit.SetBtn2Glyph(value:TBitMap);
var
bmp : TBitmap;
begin
FButton2.glyph := value;
fBtn2DefaultGlyph := false;
if fUseDefaultGlyphs and (value = nil) then
begin
fBtn2DefaultGlyph := true;
bmp := tbitmap.create;
try
bmp.LoadFromResourceName(HInstance,'RM_ELLIPSIS');
ReplaceColors(bmp, clBtnFace, clBtnText);
fButton2.Glyph.Assign(bmp);
finally
bmp.free;
end;
end;
end;
function TrmCustomBtnEdit.GetBtn2Glyph:TBitMap;
begin
result := FButton2.glyph;
end;
procedure TrmCustomBtnEdit.SetBtn1Visible(value:boolean);
begin
FButton1.visible := value;
fButton2.Visible := FBtn2IsVisible and fButton1.visible;
if fButton2.Visible then
fButton2.Left := fButton1.left+1;
recreatewnd;
end;
function TrmCustomBtnEdit.GetBtn1Visible:boolean;
begin
result := FButton1.visible;
end;
procedure TrmCustomBtnEdit.SetEnabled(value:Boolean);
begin
inherited enabled := value;
FButton1.enabled := fBtn1IsEnabled and value;
FButton2.Enabled := fBtn2IsEnabled and value;
end;
procedure TrmCustomBtnEdit.KeyPress(var Key: Char);
begin
if key in [#10,#13] then key := #0;
inherited;
end;
function TrmCustomBtnEdit.GetEnabled:Boolean;
begin
result := inherited Enabled;
end;
procedure TrmCustomBtnEdit.SetBtnWidth(value:integer);
begin
if value <> FBtnWidth then
begin
FBtnWidth := value;
FButton1.width := FBtnWidth;
FButton2.Width := FBtnWidth;
recreatewnd;
end;
end;
procedure TrmCustomBtnEdit.SetBtn2Visible(const Value: boolean);
begin
fBtn2IsVisible := Value;
fButton2.Visible := FBtn2IsVisible and FButton1.visible;
if fButton2.Visible then
fButton2.Left := fButton1.left+1;
if csdesigning in componentstate then
fButton2.Visible := FBtn2IsVisible and FButton1.visible;
recreatewnd;
end;
function TrmCustomBtnEdit.GetBtn2Visible: boolean;
begin
result := fBtn2IsVisible;
end;
function TrmCustomBtnEdit.GetBtn1Enabled: boolean;
begin
result := fBtn1IsEnabled;
end;
function TrmCustomBtnEdit.GetBtn2Enabled: boolean;
begin
result := fBtn2IsEnabled;
end;
procedure TrmCustomBtnEdit.SetBtn1Enabled(const Value: boolean);
begin
fbutton1.enabled := enabled and value;
fBtn1IsEnabled := value;
end;
procedure TrmCustomBtnEdit.SetBtn2Enabled(const Value: boolean);
begin
fbutton2.enabled := enabled and value;
fBtn2IsEnabled := value;
end;
function TrmCustomBtnEdit.GetBtn1NumGlyphs: TNumGlyphs;
begin
result := fbutton1.NumGlyphs;
end;
function TrmCustomBtnEdit.GetBtn2NumGlyphs: TNumGlyphs;
begin
result := fbutton2.NumGlyphs;
end;
procedure TrmCustomBtnEdit.SetBtn1NumGlyphs(value: TNumGlyphs);
begin
FButton1.numglyphs := value;
end;
procedure TrmCustomBtnEdit.SetBtn2NumGlyphs(value: TNumGlyphs);
begin
FButton2.numGlyphs := value;
end;
function TrmCustomBtnEdit.GetButton(index: integer): TrmSpeedButton;
begin
case index of
1: result := FButton1;
2: result := FButton2;
else
result := nil;
end;
end;
procedure TrmCustomBtnEdit.CMSysColorChange(var Message: TMessage);
begin
ResetDefaultGlyphs;
end;
procedure TrmCustomBtnEdit.SetUseDefaultGlyphs(const Value: boolean);
begin
fUseDefaultGlyphs := Value;
ResetDefaultGlyphs;
end;
procedure TrmCustomBtnEdit.ResetDefaultGlyphs;
begin
if fBtn1DefaultGlyph then
SetBtn1Glyph(nil);
if fBtn2DefaultGlyph then
SetBtn2Glyph(nil);
end;
end.