Hej
Jeg har lavet en komponent baseret på tPanel for at lave en trykknap
som har 2 mulige functioner. (Dette vælges med "OkButton").
1. Knappen skifter farve når man trykker på den og skifter tilbage når
den slippes.
2: Knappen skifter farve når man trykker på den, men skifter først
tilbage ved næste tryk.
Mit problem er at jeg gerne ville "Override" den procedure der kaldes
når man tildeler color en ny værdi (man kunne gætte på at den hed
setcolor), men enten er proceduren ikke public eller også har den et
navn som jeg ikke kan finde. Nu har jeg lavet en mindre elegant løsning
for at huske den farve som der skal vendes tilbage til. Den virker dog
ikke i alle situationer.
Er der nogle der har en løsning.
En ting der undre mig er at color bliver tildelt den farve der er valgt
ved "design time" efter kaldet til "create", det kan jeg se ved at
gemmes farven i proceduren "create" er den altid grå, uanset farven der
vælges ved "design time".
Carsten
{------------------------------------------------------------------------------}
unit ManButton;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, DsgnIntf, BeInc;
type
TManButton = class(TPanel)
private
{ Private declarations }
FPressColor: tColor;
ColorSave: tColor;
fTextColor:tColor;
fOkButton:boolean;
fOkStatus:boolean;
protected
{ Protected declarations }
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure OpdateStatus(value:boolean);
public
{ Public declarations }
ButtonValue:char;
constructor Create(AOwner: TComponent); override; { override
to set new default }
procedure pEnable(ena:boolean);
published
{ Published declarations }
property PressColor: tColor read FPressColor write FPressColor
default Clyellow;
property OkButton: boolean read fOkButton write fOkButton default
false;
property OkStatus: boolean read fOkStatus write OpdateStatus
default false;
end;
procedure Register;
implementation
constructor TManButton.Create(AOwner: TComponent);
begin
inherited Create(AOwner); { perform inherited initialization }
FPressColor:=Clyellow;
BeVelInner:=BvRaised;
fTextColor:=font.Color;
fOkStatus:=false;
ColorSave:=0;
end;
procedure Register;
begin
RegisterComponents(cBE_Componenter, [TManButton]);
RegisterPropertyEditor(TypeInfo(tcolor),TManButton, 'PressColor',
TColorProperty);
RegisterPropertyEditor(TypeInfo(Boolean),TManButton,'OK
color',tIntegerProperty);
end;
procedure TManButton.OpdateStatus(value:boolean);
Begin
if ColorSave=0 then
ColorSave:=Color;
fOkStatus:=value;
if fOkStatus then
Color:=fPressColor
else Color:=ColorSave;
End;
procedure TManButton.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
Begin
Inherited MouseDown(Button,Shift,X,Y);
if ColorSave=0 then
ColorSave:=Color;
if fOkButton then
begin
if fOkStatus then
Color:=ColorSave
else Color:=fPressColor;
fOkStatus:= not fOkStatus;
end else
begin
Color:=fPressColor;
end;
BeVelInner:=BvLowered;
BeVelOuter:=BvLowered;
End;
procedure TManButton.MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
Begin
Inherited MouseUp(Button,Shift,X,Y);
if not fOkButton then
begin
Color:=ColorSave;
end;
if enabled then
BeVelInner:=BvRaised
else BeVelInner:=BvNone;
BeVelOuter:=BvRaised;
End;
procedure TManButton.pEnable(ena:boolean);
Begin
if ena then begin
enabled:=true;
font.Color:=fTextColor;
BeVelInner:=BvRaised;
end else begin
enabled:=false;
font.Color:=clGrayText;
BeVelInner:=BvNone;
end;
End;
end.
|