Ir para conteúdo
Fórum Script Brasil
  • 0

Botão Invisivel


Paulo Nobre

Pergunta

Tenho um componente que nada mais é que um botão que pode assumir cores diferentes, ou seja não é o button tradicional do delphi.

Estou tendo o seguinte problema com ele:

Ao clicar nele quero que ele(cmdInserir) fique invisível e um segundo botão(cmdCancelar) fique visível.

O botão não tem a propriedade visible disponível em tempo de projeto, mas a tem em temp de execução.

Sendo assim,no evento Onclick do cmdInserir tenho:

cmdInserir.Visible:=False;

cmdCancelar.Visible:=True;

O cmdCancelar aparece normalmente, mas o cmdInserir não desaparece normalmente.

O que quero dizer com não desaparece normalmente é o seguinte: dá para perceber que algo aconteceu, pois o botão fica desabilitado e o caption desapareceu, além disso nada acontece ao clicar nele e além disso

se o form for encoberto por outra janela, ao voltar a ela aí sim o cmdInserir realmente desaparece.

Tentei algumas coisas do tipo refresh, do botão e do form, mas não consigo resolver.

Imagino que seja problema do componente, ou seja não foi programado corretamente.

Alguém saberia como resolver este problema?

Link para o comentário
Compartilhar em outros sites

16 respostass a esta questão

Posts Recomendados

  • 0

então, como que ele ele seria criado no form????

quando eu quero criar um componente em tempo de execução em uso:

var

btn : Tbutton;

begin

btn := Tbutton.Create(form1); //cria o botão no form1

btn.name := 'btnteste';

btn.parent := form1; //agora ele aparece no form1

Link para o comentário
Compartilhar em outros sites

  • 0

Quando coloquei cmdInserir.Parent := nil;

Ele aceitou depois do ponto a opção parent, porém ao compilar dava a seguinte mensagem de erro:

EInvalidOperation with mensagem 'Control 'botao' has no parent window.

Olhei na Unit e ele descende de TGraphicControl.

Para quem quiser testar os botões colocarei a unit abaixo. Na realidade são vários botões(cinco) e estou usando o EncartaButton.

****************************************************************

unit ButtonComps;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls;

type

TEncartaButton = class(TGraphicControl)

private

Cap : string;

Col : TColor;

Border: TColor;

OverFColor: TColor;

OverColor: TColor;

DownColor: TColor;

MDown: TMouseEvent;

MUp: TMouseEvent;

MEnter : TNotifyEvent;

MLeave : TNotifyEvent;

Enab: Boolean;

Bmp: TBitmap;

SCap: Boolean;

BtnClick: TNotifyEvent;

procedure SetCol(Value: TColor);

procedure SetBorder(Value: TColor);

procedure SetCap(Value: string);

procedure SetBmp(Value: TBitmap);

procedure SetSCap(Value: Boolean);

protected

procedure Paint; override;

procedure MouseDown(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer); override;

procedure MouseUp(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer); override;

procedure MouseEnter(var Message: TMessage); message CM_MOUSEENTER;

procedure MouseLeave(var Message: TMessage); message CM_MOUSELEAVE;

procedure Click; override;

procedure SetParent(Value: TWinControl); override;

public

constructor Create(AOwner: TComponent); override;

published

property Caption : string read Cap write SetCap;

property Color : TColor read Col write SetCol;

property ColorBorder : TColor read Border write SetBorder;

property Enabled : Boolean read Enab write Enab;

property OnMouseDown: TMouseEvent read MDown write MDown;

property OnMouseUp: TMouseEvent read MUp write MUp;

property OnMouseEnter: TNotifyEvent read MEnter write MEnter;

property OnMouseLeave: TNotifyEvent read MLeave write MLeave;

property OnClick: TNotifyEvent read BtnClick write BtnClick;

property Glyph: TBitmap read Bmp write SetBmp;

property ColorOverCaption: TColor read OverFColor write OverFColor;

property ColorOver: TColor read OverColor write OverColor;

property ColorDown: TColor read DownColor write DownColor;

property ShowCaption: Boolean read SCap write SetSCap;

property ShowHint;

property ParentShowHint;

property OnMouseMove;

property Font;

end;

TAOLButton = class(TGraphicControl)

private

Cap : string;

Col : TColor;

RaiseCol: TColor;

MDown: TMouseEvent;

MUp: TMouseEvent;

MLeave : TNotifyEvent;

Enab: Boolean;

BtnClick: TNotifyEvent;

procedure SetCol(Value: TColor);

procedure SetCap(Value: string);

procedure SetRaiseCol(Value: TColor);

protected

procedure Paint; override;

procedure MouseDown(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer); override;

procedure MouseUp(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer); override;

procedure MouseLeave(var Message: TMessage); message CM_MOUSELEAVE;

procedure Click; override;

procedure SetParent(Value: TWinControl); override;

public

constructor Create(AOwner: TComponent); override;

published

property Caption : string read Cap write SetCap;

property Color : TColor read Col write SetCol;

property RaiseColor : TColor read RaiseCol write SetRaiseCol;

property Enabled : Boolean read Enab write Enab;

property OnMouseDown: TMouseEvent read MDown write MDown;

property OnMouseUp: TMouseEvent read MUp write MUp;

property OnMouseLeave: TNotifyEvent read MLeave write MLeave;

property OnClick: TNotifyEvent read BtnClick write BtnClick;

property ShowHint;

property ParentShowHint;

property OnMouseMove;

property Font;

end;

TImageButton = class(TGraphicControl)

private

MOver: TBitmap;

MDown: TBitmap;

MUp: TBitmap;

Bmp: TBitmap;

ActualBmp: TBitmap;

BmpDAble: TBitmap;

BtnClick: TNotifyEvent;

OnMDown: TMouseEvent;

OnMUp: TMouseEvent;

OnMEnter: TNotifyEvent;

OnMLeave: TNotifyEvent;

procedure SetMOver(Value: TBitmap);

procedure SetMDown(Value: TBitmap);

procedure SetMUp(Value: TBitmap);

procedure SetBmp(Value: TBitmap);

procedure SetBmpDAble(Value: TBitmap);

protected

procedure Paint; override;

procedure MouseDown(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer); override;

procedure MouseUp(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer); override;

procedure MouseEnter(var Message: TMessage); message CM_MOUSEENTER;

procedure MouseLeave(var Message: TMessage); message CM_MOUSELEAVE;

procedure Click; override;

public

constructor Create(AOwner: TComponent); override;

published

property BitmapOver: TBitmap read MOver write SetMOver;

property BitmapDown: TBitmap read MDown write SetMDown;

property BitmapUp: TBitmap read MUp write SetMUp;

property BitmapDisabled: TBitmap read BmpDAble write SetBmpDAble;

property Bitmap: TBitmap read Bmp write SetBmp;

property OnClick: TNotifyEvent read BtnClick write BtnClick;

property OnMouseDown: TMouseEvent read OnMDown write OnMDown;

property OnMouseUp: TMouseEvent read OnMUp write OnMUp;

property OnMouseEnter: TNotifyEvent read OnMEnter write OnMEnter;

property OnMouseLeave: TNotifyEvent read OnMLeave write OnMLeave;

property Enabled;

property ShowHint;

property ParentShowHint;

end;

TSelButton = class(TGraphicControl)

private

Cap : string;

Col : TColor;

Border: TColor;

OverFColor: TColor;

OverColor: TColor;

DownColor: TColor;

MDown: TMouseEvent;

MUp: TMouseEvent;

MEnter : TNotifyEvent;

MLeave : TNotifyEvent;

Enab: Boolean;

BtnClick: TNotifyEvent;

Alment: TAlignment;

BWidth: Longint;

procedure SetCol(Value: TColor);

procedure SetBorder(Value: TColor);

procedure SetCap(Value: string);

procedure SetAlment(Value: TAlignment);

procedure SetBWidth(Value: Longint);

protected

procedure Paint; override;

procedure MouseDown(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer); override;

procedure MouseUp(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer); override;

procedure MouseEnter(var Message: TMessage); message CM_MOUSEENTER;

procedure MouseLeave(var Message: TMessage); message CM_MOUSELEAVE;

procedure Click; override;

procedure SetParent(Value: TWinControl); override;

public

constructor Create(AOwner: TComponent); override;

published

property Caption : string read Cap write SetCap;

property Color : TColor read Col write SetCol;

property ColorBorder : TColor read Border write SetBorder;

property Enabled : Boolean read Enab write Enab;

property OnMouseDown: TMouseEvent read MDown write MDown;

property OnMouseUp: TMouseEvent read MUp write MUp;

property OnMouseEnter: TNotifyEvent read MEnter write MEnter;

property OnMouseLeave: TNotifyEvent read MLeave write MLeave;

property OnClick: TNotifyEvent read BtnClick write BtnClick;

property ColorOverCaption: TColor read OverFColor write OverFColor;

property ColorOver: TColor read OverColor write OverColor;

property ColorDown: TColor read DownColor write DownColor;

property Alignment: TAlignment read Alment write SetAlment;

property BorderWidth: Longint read BWidth write SetBWidth;

property ShowHint;

property ParentShowHint;

property OnMouseMove;

property Font;

end;

TSquareButton = class(TGraphicControl)

private

Cap : string;

Col : TColor;

Border: TColor;

OverFColor: TColor;

OverBorderCol: TColor;

DownBorderCol: TColor;

MDown: TMouseEvent;

MUp: TMouseEvent;

MEnter : TNotifyEvent;

MLeave : TNotifyEvent;

Enab: Boolean;

BtnClick: TNotifyEvent;

Alment: TAlignment;

BWidth: Longint;

procedure SetCol(Value: TColor);

procedure SetBorder(Value: TColor);

procedure SetCap(Value: string);

procedure SetAlment(Value: TAlignment);

procedure SetBWidth(Value: Longint);

protected

procedure Paint; override;

procedure MouseDown(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer); override;

procedure MouseUp(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer); override;

procedure MouseEnter(var Message: TMessage); message CM_MOUSEENTER;

procedure MouseLeave(var Message: TMessage); message CM_MOUSELEAVE;

procedure Click; override;

procedure SetParent(Value: TWinControl); override;

public

constructor Create(AOwner: TComponent); override;

published

property Caption : string read Cap write SetCap;

property Color : TColor read Col write SetCol;

property ColorBorder : TColor read Border write SetBorder;

property Enabled : Boolean read Enab write Enab;

property OnMouseDown: TMouseEvent read MDown write MDown;

property OnMouseUp: TMouseEvent read MUp write MUp;

property OnMouseEnter: TNotifyEvent read MEnter write MEnter;

property OnMouseLeave: TNotifyEvent read MLeave write MLeave;

property OnClick: TNotifyEvent read BtnClick write BtnClick;

property ColorOverCaption: TColor read OverFColor write OverFColor;

property Alignment: TAlignment read Alment write SetAlment;

property ColorOverBorder: TColor read OverBorderCol write OverBorderCol;

property BorderWidth: Longint read BWidth write SetBWidth;

property DownBorderColor: TColor read DownBorderCol write DownBorderCol;

property ShowHint;

property ParentShowHint;

property OnMouseMove;

property Font;

end;

procedure Register;

implementation

procedure Register;

begin

RegisterComponents('Buttons', [TEncartaButton, TAOLButton, TImageButton, TSelButton,

TSquareButton]);

end;

constructor TEncartaButton.Create(AOwner: TComponent);

begin

inherited Create(AOwner);

Width := 86;

Height := 22;

Col := clBtnFace;

OverFColor := clBlack;

OverColor := $000ABED8;

DownColor := $000ABED8;

Canvas.Brush.Color := clBlack;

Border := $00828F99;

Font.Name := 'Arial';

Font.Color := clBlack;

Enab := true;

Bmp := TBitmap.Create;

ShowHint := true;

SCap := true;

end;

procedure TEncartaButton.SetParent(Value: TWinControl);

begin

inherited;

if Value <> nil then Cap := Name;

end;

procedure TEncartaButton.Paint;

var TextWidth, TextHeight : Longint;

begin

inherited Paint;

Canvas.Font := Font;

Canvas.Brush.Color := Col;

Canvas.FillRect(Rect(1,1,Width-1,Height-1));

TextWidth := Canvas.TextWidth(Cap);

TextHeight := Canvas.TextHeight(Cap);

Canvas.Font.Color := $00D6E0E0;

if Bmp.Empty = false then begin

if SCap = true then begin

Canvas.BrushCopy(Rect(Width div 2 - (Bmp.Width+TextWidth) div 2-1,Height div 2 - Bmp.Height div 2,

bmp.width+Width div 2 - (Bmp.Width+TextWidth) div 2,bmp.height+Height div 2 - Bmp.Height div 2),

bmp,Rect(0,0,bmp.width,bmp.height),bmp.Canvas.pixels[0,0]);

Canvas.Font.Color := Font.Color;

Canvas.TextOut(Width div 2 + (Bmp.Width-TextWidth) div 2+5-1,Height div 2-TextHeight div 2,Cap);

end else Canvas.BrushCopy(Rect(Width div 2-Bmp.Width div 2,Height div 2-Bmp.Height div 2,

bmp.width+Width div 2-Bmp.Width div 2,bmp.height+Height div 2-Bmp.Height div 2),

bmp,Rect(0,0,bmp.width,bmp.height),bmp.Canvas.pixels[0,0]);

end else begin

Canvas.Font.Color := Font.Color;

if SCap = true then Canvas.TextOut(Width div 2 - TextWidth div 2,Height div 2-TextHeight div 2,Cap);

end;

Canvas.Brush.Color := Border;

Canvas.FrameRect(Rect(0,0,Width,Height));

end;

procedure TEncartaButton.Click;

begin

inherited Click;

Paint;

if Enab then if Assigned(BtnClick) then BtnClick(Self);

end;

procedure TEncartaButton.SetCol(Value: TColor);

begin

Col := Value;

Paint;

end;

procedure TEncartaButton.SetBorder(Value: TColor);

begin

Border := Value;

Paint;

end;

procedure TEncartaButton.SetCap(Value: string);

begin

Cap := value;

Paint;

end;

procedure TEncartaButton.SetBmp(Value: TBitmap);

begin

Bmp.Assign(value);

invalidate;

end;

procedure TEncartaButton.SetSCap(value: Boolean);

begin

SCap := Value;

Paint;

end;

procedure TEncartaButton.MouseDown(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer);

var TextWidth, TextHeight : Longint;

begin

inherited MouseDown(Button, Shift, X, Y);

TextWidth := Canvas.TextWidth(Cap);

TextHeight := Canvas.TextHeight(Cap);

if (Button = mbLeft) and Enab then begin

if Assigned (MDown) then MDown(Self, Button, Shift, X, Y);

Canvas.Brush.Color := DownColor;

Canvas.FillRect(Rect(1,1,Width-1,Height-1));

if Bmp.Empty = false then begin

if SCap = true then begin

Canvas.BrushCopy(Rect(Width div 2 - (Bmp.Width+TextWidth) div 2-1+1,Height div 2 - Bmp.Height div 2+1,

bmp.width+Width div 2 - (Bmp.Width+TextWidth) div 2+1,bmp.height+Height div 2 - Bmp.Height div 2+1),

bmp,Rect(0,0,bmp.width,bmp.height),bmp.Canvas.pixels[0,0]);

Canvas.TextOut(Width div 2 + (Bmp.Width-TextWidth) div 2+5-1+1,Height div 2-TextHeight div 2+1,Cap);

end else Canvas.BrushCopy(Rect(Width div 2-Bmp.Width div 2+1,Height div 2-Bmp.Height div 2+1,

bmp.width+Width div 2-Bmp.Width div 2+1,bmp.height+Height div 2-Bmp.Height div 2+1),

bmp,Rect(0,0,bmp.width,bmp.height),bmp.Canvas.pixels[0,0]);

end else if SCap = true then Canvas.TextOut(Width div 2 - TextWidth div 2+1,Height div 2-TextHeight div 2+1,Cap);

Canvas.Brush.Color := Border;

Canvas.FrameRect(Rect(0,0,Width,Height));

Canvas.Pen.Color := $00EDF4F8;

Canvas.Polyline([Point(Width-1,0),Point(Width-1,Height)]);

Canvas.Polyline([Point(Width,Height-1),Point(-1,Height-1)]);

Canvas.Pen.Color := $004F4F4F;

Canvas.Polyline([Point(0,Height-2),Point(0,0)]);

Canvas.Polyline([Point(0,0),Point(Width-1,0)]);

end;

end;

procedure TEncartaButton.MouseUp(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer);

var TextWidth, TextHeight : Longint;

MouseOverButton: Boolean;

P: TPoint;

begin

inherited MouseUp(Button, Shift, X, Y);

TextWidth := Canvas.TextWidth(Cap);

TextHeight := Canvas.TextHeight(Cap);

if (Button = mbLeft) and Enab then begin

if Assigned (MUp) then MUp(Self, Button, Shift, X, Y);

GetCursorPos(P);

MouseOverButton := (FindDragTarget(P, True) = Self);

if MouseOverButton then begin

Canvas.Brush.Color := OverColor;

Canvas.FillRect(Rect(1,1,Width-1,Height-1));

Canvas.Font.Color := OverFColor;

if Bmp.Empty = false then begin

if SCap = true then begin

Canvas.BrushCopy(Rect(Width div 2 - (Bmp.Width+TextWidth) div 2-1,Height div 2 - Bmp.Height div 2,

bmp.width+Width div 2 - (Bmp.Width+TextWidth) div 2,bmp.height+Height div 2 - Bmp.Height div 2),

bmp,Rect(0,0,bmp.width,bmp.height),bmp.Canvas.pixels[0,0]);

Canvas.TextOut(Width div 2 + (Bmp.Width-TextWidth) div 2+5-1,Height div 2-TextHeight div 2,Cap);

end else Canvas.BrushCopy(Rect(Width div 2-Bmp.Width div 2,Height div 2-Bmp.Height div 2,

bmp.width+Width div 2-Bmp.Width div 2,bmp.height+Height div 2-Bmp.Height div 2),

bmp,Rect(0,0,bmp.width,bmp.height),bmp.Canvas.pixels[0,0]);

end else if SCap = true then Canvas.TextOut(Width div 2 - TextWidth div 2,Height div 2-TextHeight div 2,Cap);

Canvas.Brush.Color := Border;

Canvas.FrameRect(Rect(0,0,Width,Height));

Canvas.Pen.Color := $00EDF4F8;

Canvas.Polyline([Point(0,Height-2),Point(0,0)]);

Canvas.Polyline([Point(0,0),Point(Width-1,0)]);

Canvas.Pen.Color := $004F4F4F;

Canvas.Polyline([Point(Width-1,0),Point(Width-1,Height)]);

Canvas.Polyline([Point(Width,Height-1),Point(-1,Height-1)]);

end;

end;

end;

procedure TEncartaButton.MouseEnter(var Message: TMessage);

var TextWidth, TextHeight : Integer;

begin

TextWidth := Canvas.TextWidth(Cap);

TextHeight := Canvas.TextHeight(Cap);

if Enab then begin

Canvas.Brush.Color := OverColor;

Canvas.FillRect(Rect(1,1,Width-1,Height-1));

Canvas.Font.Color := OverFColor;

if Bmp.Empty = false then begin

if SCap = true then begin

Canvas.BrushCopy(Rect(Width div 2 - (Bmp.Width+TextWidth) div 2-1,Height div 2 - Bmp.Height div 2,

bmp.width+Width div 2 - (Bmp.Width+TextWidth) div 2,bmp.height+Height div 2 - Bmp.Height div 2),

bmp,Rect(0,0,bmp.width,bmp.height),bmp.Canvas.pixels[0,0]);

Canvas.TextOut(Width div 2 + (Bmp.Width-TextWidth) div 2+5-1,Height div 2-TextHeight div 2,Cap);

end else Canvas.BrushCopy(Rect(Width div 2-Bmp.Width div 2,Height div 2-Bmp.Height div 2,

bmp.width+Width div 2-Bmp.Width div 2,bmp.height+Height div 2-Bmp.Height div 2),

bmp,Rect(0,0,bmp.width,bmp.height),bmp.Canvas.pixels[0,0]);

end else if SCap = true then Canvas.TextOut(Width div 2 - TextWidth div 2,Height div 2-TextHeight div 2,Cap);

Canvas.Brush.Color := Border;

Canvas.FrameRect(Rect(0,0,Width,Height));

Canvas.Pen.Color := $00EDF4F8;

Canvas.Polyline([Point(0,Height-2),Point(0,0)]);

Canvas.Polyline([Point(0,0),Point(Width-1,0)]);

Canvas.Pen.Color := $004F4F4F;

Canvas.Polyline([Point(Width-1,0),Point(Width-1,Height)]);

Canvas.Polyline([Point(Width,Height-1),Point(-1,Height-1)]);

end;

end;

procedure TEncartaButton.MouseLeave(var Message: TMessage);

var TextWidth, TextHeight : Integer;

begin

TextWidth := Canvas.TextWidth(Cap);

TextHeight := Canvas.TextHeight(Cap);

Canvas.Brush.Color := Col;

Canvas.FillRect(Rect(1,1,Width-1,Height-1));

Canvas.Font.Color := $00D6E0E0;

Canvas.Brush.Color := Col;

Canvas.Font.Color := Font.Color;

if Bmp.Empty = false then begin

if SCap = true then begin

Canvas.BrushCopy(Rect(Width div 2 - (Bmp.Width+TextWidth) div 2-1,Height div 2 - Bmp.Height div 2,

bmp.width+Width div 2 - (Bmp.Width+TextWidth) div 2,bmp.height+Height div 2 - Bmp.Height div 2),

bmp,Rect(0,0,bmp.width,bmp.height),bmp.Canvas.pixels[0,0]);

Canvas.Font.Color := Font.Color;

Canvas.TextOut(Width div 2 + (Bmp.Width-TextWidth) div 2+5-1,Height div 2-TextHeight div 2,Cap);

end else Canvas.BrushCopy(Rect(Width div 2-Bmp.Width div 2,Height div 2-Bmp.Height div 2,

bmp.width+Width div 2-Bmp.Width div 2,bmp.height+Height div 2-Bmp.Height div 2),

bmp,Rect(0,0,bmp.width,bmp.height),bmp.Canvas.pixels[0,0]);

end else if SCap = true then Canvas.TextOut(Width div 2 - TextWidth div 2,Height div 2-TextHeight div 2,Cap);

Canvas.Brush.Color := Border;

Canvas.FrameRect(Rect(0,0,Width,Height));

end;

constructor TAOLButton.Create(AOwner: TComponent);

begin

inherited Create(AOwner);

Width := 89;

Height := 23;

Col := $00A56934;

Canvas.Brush.Color := clBlack;

Font.Name := 'Arial';

Font.Color := clWhite;

Font.Size := 8;

Font.Style :=[fsBold];

Enab := true;

ShowHint := true;

RaiseCol := $00D7A28A;

end;

procedure TAOLButton.SetParent(Value: TWinControl);

begin

inherited;

if Value <> nil then Cap := Name;

end;

procedure TAOLButton.Paint;

var TextWidth, TextHeight : Longint;

begin

inherited Paint;

Canvas.Font := Font;

Canvas.Brush.Color := Col;

Canvas.FillRect(Rect(1,1,Width-1,Height-1));

Canvas.Brush.Color := RaiseCol;

Canvas.FillRect(Rect(1,1,3,Height-1));

Canvas.FillRect(Rect(1,1,Width-1,3));

Canvas.Brush.Color := clBlack;

Canvas.FillRect(Rect(Width-1,1,Width-3,Height-1));

Canvas.FillRect(Rect(Width-1,Height-1,1,Height-3));

TextWidth := Canvas.TextWidth(Cap);

TextHeight := Canvas.TextHeight(Cap);

Canvas.Font.Color := $00D6E0E0;

Canvas.Brush.Color := Col;

Canvas.Font.Color := Font.Color;

Canvas.TextOut(Width div 2 - TextWidth div 2,Height div 2-TextHeight div 2,Cap);

Canvas.Brush.Color := clBlack;

Canvas.FrameRect(Rect(0,0,Width,Height));

end;

procedure TAOLButton.Click;

begin

inherited Click;

Paint;

if Enab then if Assigned(BtnClick) then BtnClick(Self);

end;

procedure TAOLButton.SetCol(Value: TColor);

begin

Col := Value;

Paint;

end;

procedure TAOLButton.SetCap(Value: string);

begin

Cap := value;

Paint;

end;

procedure TAOLButton.SetRaiseCol(Value: TColor);

begin

RaiseCol := value;

Paint;

end;

procedure TAOLButton.MouseDown(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer);

var TextWidth, TextHeight : Longint;

begin

inherited MouseDown(Button, Shift, X, Y);

TextWidth := Canvas.TextWidth(Cap);

TextHeight := Canvas.TextHeight(Cap);

if (Button = mbLeft) and Enab then begin

if Assigned (MDown) then MDown(Self, Button, Shift, X, Y);

Canvas.Brush.Color := Color;

Canvas.FillRect(Rect(1,1,Width-1,Height-1));

Canvas.Brush.Color := clBlack;

Canvas.FillRect(Rect(1,1,Width-1,2));

Canvas.Brush.Color := Col;

Canvas.TextOut(Width div 2 - TextWidth div 2+2,Height div 2-TextHeight div 2+2,Cap);

Canvas.Brush.Color := clBlack;

Canvas.FrameRect(Rect(0,0,Width,Height));

end;

end;

procedure TAOLButton.MouseUp(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer);

begin

inherited MouseUp(Button, Shift, X, Y);

if (Button = mbLeft) and Enab then begin

if Assigned (MUp) then MUp(Self, Button, Shift, X, Y);

if (X>0) and (Y>0) and (X<=Width) and (Y<=Height) then Paint;

end;

end;

procedure TAOLButton.MouseLeave(var Message: TMessage);

begin

Paint;

end;

constructor TImageButton.Create(AOwner: TComponent);

begin

inherited Create(AOwner);

MOver := TBitmap.Create;

MDown := TBitmap.Create;

MUp := TBitmap.Create;

Bmp := TBitmap.Create;

BmpDAble := TBitmap.Create;

ActualBmp := TBitmap.Create;

Width := 50;

Height := 50;

Canvas.Brush.Color := clBtnFace;

ShowHint := true;

end;

procedure TImageButton.Paint;

begin

inherited Paint;

if ActualBmp.Width = 0 then ActualBmp.Assign(Bmp);

Canvas.FillRect(Rect(0,0,Width,Height));

if Enabled or (BmpDAble.Width = 0) then Canvas.Draw(0,0,ActualBmp)

else begin

Width := BmpDAble.Width;

Height := BmpDAble.Height;

Canvas.Draw(0,0,BmpDAble);

end;

end;

procedure TImageButton.Click;

begin

inherited Click;

Paint;

if Enabled then if Assigned(BtnClick) then BtnClick(Self);

end;

procedure TImageButton.SetMOver(Value: TBitmap);

begin

MOver.Assign(Value);

Paint;

end;

procedure TImageButton.SetMDown(Value: TBitmap);

begin

MDown.Assign(Value);

Paint;

end;

procedure TImageButton.SetMUp(Value: TBitmap);

begin

MUp.Assign(Value);

Paint;

end;

procedure TImageButton.SetBmp(Value: TBitmap);

begin

Bmp.Assign(Value);

ActualBmp.Assign(Value);

Width := Bmp.Width;

Height := Bmp.Height;

Paint;

end;

procedure TImageButton.SetBmpDAble(Value: TBitmap);

begin

BmpDAble.Assign(Value);

paint;

end;

procedure TImageButton.MouseDown(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer);

begin

inherited MouseDown(Button, Shift, X, Y);

if (Button = mbLeft) and Enabled then begin

if Assigned (OnMDown) then OnMDown(Self, Button, Shift, X, Y);

if MDown.Width > 0 then begin

ActualBmp.Assign(MDown);

Width := MDown.Width;

Height := MDown.Height;

Paint;

end;

end;

end;

procedure TImageButton.MouseUp(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer);

var MouseOverButton: Boolean;

P: TPoint;

begin

inherited MouseUp(Button, Shift, X, Y);

if (Button = mbLeft) and Enabled then begin

if Assigned (OnMUp) then OnMUp(Self, Button, Shift, X, Y);

if MUp.Width > 0 then begin

GetCursorPos(P);

MouseOverButton := (FindDragTarget(P, True) = Self);

if MouseOverButton then begin

Width := MUp.Width;

Height := MUp.Height;

Canvas.FillRect(Rect(0,0,Width,Height));

Canvas.Draw(0,0,MUp);

end else begin

Width := bmp.Width;

Height := Bmp.Height;

Canvas.FillRect(Rect(0,0,Width,Height));

Canvas.Draw(0,0,Bmp);

end;

end else begin

if MouseOverButton = false then begin

Width := MOver.Width;

Height := MOver.Height;

Canvas.FillRect(Rect(0,0,Width,Height));

Canvas.Draw(0,0,MOver);

end else begin

Width := bmp.Width;

Height := Bmp.Height;

Canvas.FillRect(Rect(0,0,Width,Height));

Canvas.Draw(0,0,Bmp);

end;

end;

end;

end;

procedure TImageButton.MouseEnter(var Message: TMessage);

begin

if Enabled then begin

if MOver.Width > 0 then begin

ActualBmp.Assign(MOver);

Width := MOver.Width;

Height := MOver.Height;

Paint;

end;

end;

end;

procedure TImageButton.MouseLeave(var Message: TMessage);

begin

if Enabled then begin

if Bmp.Width > 0 then begin

ActualBmp.Assign(Bmp);

Width := Bmp.Width;

Height := Bmp.Height;

Paint;

end;

end;

end;

constructor TSelButton.Create(AOwner: TComponent);

begin

inherited Create(AOwner);

Width := 105;

Height := 20;

Col := clBtnFace;

OverFColor := clBlack;

OverColor := $00A4B984;

DownColor := $00A4B984;

Canvas.Brush.Color := clBlack;

Border := clGray;

Font.Name := 'Arial';

Font.Color := clGray;

Font.Size := 8;

Enab := true;

ShowHint := true;

Alment := taLeftJustify;

BWidth := 1;

end;

procedure TSelButton.SetParent(Value: TWinControl);

begin

inherited;

if Value <> nil then Cap := Name;

end;

procedure TSelButton.Paint;

var TextWidth, TextHeight : Longint;

i: Longint;

begin

inherited Paint;

Canvas.Font := Font;

Canvas.Brush.Color := Col;

Canvas.FillRect(Rect(1,1,Width-1,Height-1));

TextWidth := Canvas.TextWidth(Cap);

TextHeight := Canvas.TextHeight(Cap);

Canvas.Font.Color := $00D6E0E0;

Canvas.Font.Color := Font.Color;

if Alment = taCenter then Canvas.TextOut(Width div 2 - TextWidth div 2,Height div 2-TextHeight div 2,Cap);

if Alment = taLeftJustify then Canvas.TextOut(5,Height div 2-TextHeight div 2,Cap);

if Alment = taRightJustify then Canvas.TextOut(Width - TextWidth - 6,Height div 2-TextHeight div 2,Cap);

Canvas.Brush.Color := Border;

for i := 0 to BWidth-1 do Canvas.FrameRect(Rect(i,i,Width-i,Height-i));

end;

procedure TSelButton.Click;

begin

inherited Click;

Paint;

if Enab then if Assigned(BtnClick) then BtnClick(Self);

end;

procedure TSelButton.SetCol(Value: TColor);

begin

Col := Value;

Paint;

end;

procedure TSelButton.SetBorder(Value: TColor);

begin

Border := Value;

Paint;

end;

procedure TSelButton.SetCap(Value: string);

begin

Cap := value;

Paint;

end;

procedure TSelButton.SetAlment(Value: TAlignment);

begin

Alment := Value;

Paint;

end;

procedure TSelButton.SetBWidth(Value: Longint);

begin

BWidth := value;

Paint;

end;

procedure TSelButton.MouseDown(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer);

var TextWidth, TextHeight : Longint;

i: Longint;

begin

inherited MouseDown(Button, Shift, X, Y);

TextWidth := Canvas.TextWidth(Cap);

TextHeight := Canvas.TextHeight(Cap);

if (Button = mbLeft) and Enab then begin

if Assigned (MDown) then MDown(Self, Button, Shift, X, Y);

Canvas.Brush.Color := DownColor;

Canvas.FillRect(Rect(1,1,Width-1,Height-1));

if Alment = taCenter then Canvas.TextOut(Width div 2 - TextWidth div 2+1,Height div 2-TextHeight div 2+1,Cap);

if Alment = taLeftJustify then Canvas.TextOut(5+1,Height div 2-TextHeight div 2+1,Cap);

if Alment = taRightJustify then Canvas.TextOut(Width - TextWidth - 6-1,Height div 2-TextHeight div 2+1,Cap);

Canvas.Brush.Color := Border;

for i := 0 to BWidth-1 do Canvas.FrameRect(Rect(i,i,Width-i,Height-i));

end;

end;

procedure TSelButton.MouseUp(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer);

var TextWidth, TextHeight : Longint;

i: Longint;

MouseOverButton: Boolean;

P: TPoint;

begin

inherited MouseUp(Button, Shift, X, Y);

TextWidth := Canvas.TextWidth(Cap);

TextHeight := Canvas.TextHeight(Cap);

if (Button = mbLeft) and Enab then begin

if Assigned (MUp) then MUp(Self, Button, Shift, X, Y);

GetCursorPos(P);

MouseOverButton := (FindDragTarget(P, True) = Self);

if MouseOverButton then begin

Canvas.Brush.Color := OverColor;

Canvas.FillRect(Rect(1,1,Width-1,Height-1));

Canvas.Font.Color := OverFColor;

if Alment = taCenter then Canvas.TextOut(Width div 2 - TextWidth div 2,Height div 2-TextHeight div 2,Cap);

if Alment = taLeftJustify then Canvas.TextOut(5,Height div 2-TextHeight div 2,Cap);

if Alment = taRightJustify then Canvas.TextOut(Width - TextWidth - 6,Height div 2-TextHeight div 2,Cap);

Canvas.Brush.Color := Border;

for i := 0 to BWidth-1 do Canvas.FrameRect(Rect(i,i,Width-i,Height-i));

end;

end;

end;

procedure TSelButton.MouseEnter(var Message: TMessage);

var TextWidth, TextHeight : Integer;

i: Longint;

begin

TextWidth := Canvas.TextWidth(Cap);

TextHeight := Canvas.TextHeight(Cap);

if Enab then begin

Canvas.Brush.Color := OverColor;

Canvas.FillRect(Rect(1,1,Width-1,Height-1));

Canvas.Font.Color := OverFColor;

if Alment = taCenter then Canvas.TextOut(Width div 2 - TextWidth div 2,Height div 2-TextHeight div 2,Cap);

if Alment = taLeftJustify then Canvas.TextOut(5,Height div 2-TextHeight div 2,Cap);

if Alment = taRightJustify then Canvas.TextOut(Width - TextWidth - 6,Height div 2-TextHeight div 2,Cap);

Canvas.Brush.Color := Border;

for i := 0 to BWidth-1 do Canvas.FrameRect(Rect(i,i,Width-i,Height-i));

end;

end;

procedure TSelButton.MouseLeave(var Message: TMessage);

var TextWidth, TextHeight : Integer;

i: integer;

begin

TextWidth := Canvas.TextWidth(Cap);

TextHeight := Canvas.TextHeight(Cap);

Canvas.Brush.Color := Col;

Canvas.FillRect(Rect(1,1,Width-1,Height-1));

Canvas.Font.Color := $00D6E0E0;

Canvas.Brush.Color := Col;

Canvas.Font.Color := Font.Color;

if Alment = taCenter then Canvas.TextOut(Width div 2 - TextWidth div 2,Height div 2-TextHeight div 2,Cap);

if Alment = taLeftJustify then Canvas.TextOut(5,Height div 2-TextHeight div 2,Cap);

if Alment = taRightJustify then Canvas.TextOut(Width - TextWidth - 6,Height div 2-TextHeight div 2,Cap);

Canvas.Brush.Color := Border;

for i := 0 to BWidth-1 do Canvas.FrameRect(Rect(i,i,Width-i,Height-i));

end;

constructor TSquareButton.Create(AOwner: TComponent);

begin

inherited Create(AOwner);

Width := 113;

Height := 17;

Col := clBtnFace;

OverFColor := clWhite;

Canvas.Brush.Color := clBlack;

Border := clBlack;

Font.Name := 'Arial';

Font.Color := clBlack;

Font.Size := 8;

Enab := true;

ShowHint := true;

Alment := taLeftJustify;

OverBorderCol := clBlack;

BWidth := 2;

DownBorderCol := clWhite;

end;

procedure TSquareButton.SetParent(Value: TWinControl);

begin

inherited;

if Value <> nil then Cap := Name;

end;

procedure TSquareButton.Paint;

var TextWidth, TextHeight : Longint;

begin

inherited Paint;

Canvas.Font := Font;

Canvas.Brush.Color := Col;

Canvas.FillRect(Rect(0,0,Width,Height));

TextWidth := Canvas.TextWidth(Cap);

TextHeight := Canvas.TextHeight(Cap);

Canvas.Font.Color := $00D6E0E0;

Canvas.Font.Color := Font.Color;

if Alment = taCenter then Canvas.TextOut(Width div 2 - TextWidth div 2,Height div 2-TextHeight div 2-1,Cap);

if Alment = taLeftJustify then Canvas.TextOut(6,Height div 2-TextHeight div 2-1,Cap);

if Alment = taRightJustify then Canvas.TextOut(Width - TextWidth - 7,Height div 2-TextHeight div 2-1,Cap);

Canvas.Brush.Color := Border;

Canvas.FillRect(Rect(0,Height,Width,Height-BWidth));

Canvas.FillRect(Rect(0,0,BWidth,Height));

end;

procedure TSquareButton.Click;

begin

inherited Click;

Paint;

if Enab then if Assigned(BtnClick) then BtnClick(Self);

end;

procedure TSquareButton.SetCol(Value: TColor);

begin

Col := Value;

Paint;

end;

procedure TSquareButton.SetBorder(Value: TColor);

begin

Border := Value;

Paint;

end;

procedure TSquareButton.SetCap(Value: string);

begin

Cap := value;

Paint;

end;

procedure TSquareButton.SetAlment(Value: TAlignment);

begin

Alment := Value;

Paint;

end;

procedure TSquareButton.SetBWidth(Value: Longint);

begin

BWidth := Value;

Paint;

end;

procedure TSquareButton.MouseDown(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer);

var TextWidth, TextHeight : Longint;

begin

inherited MouseDown(Button, Shift, X, Y);

TextWidth := Canvas.TextWidth(Cap);

TextHeight := Canvas.TextHeight(Cap);

if (Button = mbLeft) and Enab then begin

if Assigned (MDown) then MDown(Self, Button, Shift, X, Y);

Canvas.Brush.Color := Col;

Canvas.FillRect(Rect(0,0,Width,Height));

if Alment = taCenter then Canvas.TextOut(Width div 2 - TextWidth div 2,Height div 2-TextHeight div 2-1,Cap);

if Alment = taLeftJustify then Canvas.TextOut(6,Height div 2-TextHeight div 2-1,Cap);

if Alment = taRightJustify then Canvas.TextOut(Width - TextWidth - 7,Height div 2-TextHeight div 2-1,Cap);

Canvas.Brush.Color := DownBorderCol;

Canvas.FillRect(Rect(0,Height,Width,Height-BWidth));

Canvas.FillRect(Rect(0,0,BWidth,Height));

end;

end;

procedure TSquareButton.MouseUp(Button: TMouseButton; Shift: TShiftState;

X, Y: Integer);

var TextWidth, TextHeight : Longint;

P: TPoint;

MouseOverButton: Boolean;

begin

inherited MouseUp(Button, Shift, X, Y);

TextWidth := Canvas.TextWidth(Cap);

TextHeight := Canvas.TextHeight(Cap);

if (Button = mbLeft) and Enab then begin

if Assigned (MUp) then MUp(Self, Button, Shift, X, Y);

GetCursorPos(P);

MouseOverButton := (FindDragTarget(P, True) = Self);

if MouseOverButton then begin

Canvas.Brush.Color := Col;

Canvas.FillRect(Rect(0,0,Width,Height));

Canvas.Font.Color := OverFColor;

if Alment = taCenter then Canvas.TextOut(Width div 2 - TextWidth div 2,Height div 2-TextHeight div 2-1,Cap);

if Alment = taLeftJustify then Canvas.TextOut(6,Height div 2-TextHeight div 2-1,Cap);

if Alment = taRightJustify then Canvas.TextOut(Width - TextWidth - 7,Height div 2-TextHeight div 2-1,Cap);

Canvas.Brush.Color := OverBorderCol;

Canvas.FillRect(Rect(0,Height,Width,Height-BWidth));

Canvas.FillRect(Rect(0,0,BWidth,Height));

end;

end;

end;

procedure TSquareButton.MouseEnter(var Message: TMessage);

var TextWidth, TextHeight : Longint;

begin

if Enab then begin

TextWidth := Canvas.TextWidth(Cap);

TextHeight := Canvas.TextHeight(Cap);

Canvas.Brush.Color := Col;

Canvas.FillRect(Rect(0,0,Width,Height));

Canvas.Font.Color := OverFColor;

if Alment = taCenter then Canvas.TextOut(Width div 2 - TextWidth div 2,Height div 2-TextHeight div 2-1,Cap);

if Alment = taLeftJustify then Canvas.TextOut(6,Height div 2-TextHeight div 2-1,Cap);

if Alment = taRightJustify then Canvas.TextOut(Width - TextWidth - 7,Height div 2-TextHeight div 2-1,Cap);

Canvas.Brush.Color := OverBorderCol;

Canvas.FillRect(Rect(0,Height,Width,Height-BWidth));

Canvas.FillRect(Rect(0,0,BWidth,Height));

end;

end;

procedure TSquareButton.MouseLeave(var Message: TMessage);

begin

Paint;

end;

end.

*****************************************************************************

Desculpe por não colocar entre code e code/, mas não sei porque no meu caso não está funcionando.

Clico Adicionar quote e code e não acontece nada.!!??

Link para o comentário
Compartilhar em outros sites

  • 0
O botão nem tem o método paint.
D4n1l0d, Se é descendente de TGraphiControl então ele tem. O que ocorre é que o método está na seção Protected da classe - o que o deixa "oculto".

A propriedade Visible também existe, como você já constatou, mas se também quizer que a propriedade Visible apareça no Object Inspector - para alterá-la em design-time, você deve publicar esta propriedade. Basta acrescentar o código abaixo:

TEncartaButton = class(TGraphicControl)
  private
  ...
  property OnMouseMove;
  property Font;
  property Visible;
end;
O problema com a visibilidade do botão citado está relacionado ao fato de que o mesmo sofre alteração (desenho) não apenas no método Paint. Quando o mouse move-se por ele ou deixa ele, estes eventos também desenham no canvas. E não leva em consideração se o botão está visível ou não. Eu percebi que através de um botão comum (TButton) ele aparecia e sumia corretamente. Daí caiu a ficha de olhar outro lugar que não os associados ao Paint. Como você está sobre o botão quando clica nele e altera sua visibilidade, o evento MouseUp redesenha o botão - por isso não "sumia". Mas quando você colocava uma outra janela sobre ele, ao retirá-la quem desenhava o botão era o método Paint e, neste caso, a questão da visibilidade era respeitada. Inclua os testes referentes a propriedade Visible como abaixo para corrigir o problema:
procedure TEncartaButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var TextWidth, TextHeight : Longint;
begin
  inherited MouseDown(Button, Shift, X, Y);
  if Not Visible then
    Exit;
  TextWidth := Canvas.TextWidth(Cap);
  TextHeight := Canvas.TextHeight(Cap);
...

procedure TEncartaButton.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var TextWidth, TextHeight : Longint;
  MouseOverButton: Boolean;
  P: TPoint;
begin
  inherited MouseUp(Button, Shift, X, Y);
  if Not Visible then
    Exit;
  TextWidth := Canvas.TextWidth(Cap);
  TextHeight := Canvas.TextHeight(Cap);
...

procedure TEncartaButton.MouseEnter(var Message: TMessage);
var TextWidth, TextHeight : Integer;
begin
  if Not Visible then
    Exit;
  TextWidth := Canvas.TextWidth(Cap);
  TextHeight := Canvas.TextHeight(Cap);
...

procedure TEncartaButton.MouseLeave(var Message: TMessage);
var TextWidth, TextHeight : Integer;
begin
  if Not Visible then
    Exit;
  TextWidth := Canvas.TextWidth(Cap);
  TextHeight := Canvas.TextHeight(Cap);
...

Eu não verifiquei os demais tipos de botões na unit. Talvez seja conveniente verificar se há algo similar.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

D4n1l0d, Se é descendente de TGraphiControl então ele tem. O que ocorre é que o método está na seção Protected da classe - o que o deixa "oculto".

A propriedade Visible também existe, como você já constatou, mas se também quizer que a propriedade Visible apareça no Object Inspector - para alterá-la em design-time, você deve publicar esta propriedade. Basta acrescentar o código abaixo:CODETEncartaButton = class(TGraphicControl)

private

...

property OnMouseMove;

property Font;

property Visible;

end;

Micheus,

Tentei fazer o que você sugeriu, de colocar property Visible; na posição sugerida, mas a propriedade

VISIBLE, não aparece no Object Inspector.

Os demais problemas desapareceram com a sua correção.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

D4n1l0d, eu testei com D7 (hoje) e funciona. Então segue abaixo a declaração completa do primeiro botão para você comparar:

type
  TEncartaButton = class(TGraphicControl)
  private
    Cap : string;
    Col : TColor;
    Border: TColor;
    OverFColor: TColor;
    OverColor: TColor;
    DownColor: TColor;
    MDown: TMouseEvent;
    MUp: TMouseEvent;
    MEnter : TNotifyEvent;
    MLeave : TNotifyEvent;
    Enab: Boolean;
    Bmp: TBitmap;
    SCap: Boolean;
    BtnClick: TNotifyEvent;
    procedure SetCol(Value: TColor);
    procedure SetBorder(Value: TColor);
    procedure SetCap(Value: string);
    procedure SetBmp(Value: TBitmap);
    procedure SetSCap(Value: Boolean);
  protected
    procedure Paint; override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure MouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure MouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
    procedure Click; override;
    procedure SetParent(Value: TWinControl); override;
  public
    constructor Create(AOwner: TComponent); override;
  published
    property Caption : string read Cap write SetCap;
    property Color : TColor read Col write SetCol;
    property ColorBorder : TColor read Border write SetBorder;
    property Enabled : Boolean read Enab write Enab;
    property OnMouseDown: TMouseEvent read MDown write MDown;
    property OnMouseUp: TMouseEvent read MUp write MUp;
    property OnMouseEnter: TNotifyEvent read MEnter write MEnter;
    property OnMouseLeave: TNotifyEvent read MLeave write MLeave;
    property OnClick: TNotifyEvent read BtnClick write BtnClick;
    property Glyph: TBitmap read Bmp write SetBmp;
    property ColorOverCaption: TColor read OverFColor write OverFColor;
    property ColorOver: TColor read OverColor write OverColor;
    property ColorDown: TColor read DownColor write DownColor;
    property ShowCaption: Boolean read SCap write SetSCap;
    property ShowHint;
    property ParentShowHint;
    property OnMouseMove;
    property Font;
    property Visible;
  end;

Só para salientar, quando eu falei em publicar a propriedade quiz chamar a tenção para o fato de que esta propriedade deverá ser declarada na cláusula published da classe.

Desculpe por não colocar entre code e code/, mas não sei porque no meu caso não está funcionando.
Realmente fica meio ruim de ler o código quando não está identado. Caso continue com este problema, você pode incluí-lo simplesmente digitando os comandos antes([ code]) e depois([ /code]) do seu texto (o espaço após o "[" não deve ser incluido).

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

s3c,

fazer Bt.Parent := nil até funciona, mas não é o tipo de ação correta - você está apenas "dizendo" que ele não tem um "local onde se desenhar" (é um quebra-galho).

O evento onMouseEnter é executado somente quando o botão está visível.
Positivo.

Realmente não é necessário incluir nos eventos Enter e Leave o teste de visibilidade. Nestes deveriamos, na verdade, fazer outro teste:

procedure TEncartaButton.MouseEnter(var Message: TMessage);
var TextWidth, TextHeight : Integer;
begin
  if csDesigning in ComponentState then
    Exit;
  TextWidth := Canvas.TextWidth(Cap);
  TextHeight := Canvas.TextHeight(Cap);
...

procedure TEncartaButton.MouseLeave(var Message: TMessage);
var TextWidth, TextHeight : Integer;
begin
  if csDesigning in ComponentState then
    Exit;
  TextWidth := Canvas.TextWidth(Cap);
  TextHeight := Canvas.TextHeight(Cap);
...

Porque, se você obsevar, quando o botão é colocado no form, durante o desenho do mesmo, o botão já está "operando" (muda a cor quando tem o foco) - coisa que normalmente não encontramos em qualquer componente padrão.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

fazer Bt.Parent := nil até funciona, mas não é o tipo de ação correta - você está apenas "dizendo" que ele não tem um "local onde se desenhar" (é um quebra-galho).

Se você observar o post inicial, notará que o problema era que o botão não desaparecia; daí sugerí duas possíveis soluções e uma delas foi atribuir nil ao Parent.

Não acho que seja um macete. Se você analisar o método SetParent de TControl, verá que atribuindo-se qualquer Parent que não seja o mesmo, é executado o método RemoveControl, onde sua visibilidade é retirada e em seguida é executado o método InsertControl recolocando a visibilidade(quando Parent <> nil).

Note que InsertControl só é executado quando o novo Parent for <> nil; portanto a condição é prevista em SetParent e na minha opinião é perfeitamente válida sem que seja um macete.

Link para o comentário
Compartilhar em outros sites

  • 0
(por s3s) Se você observar o post inicial, notará que o problema era que o botão não desaparecia; daí sugerí duas possíveis soluções e uma delas foi atribuir nil ao Parent.
(por Paulo Nobre) O que quero dizer com não desaparece normalmente é o seguinte: dá para perceber que algo aconteceu, pois o botão fica desabilitado e o caption desapareceu, além disso nada acontece ao clicar nele e além disso se o form for encoberto por outra janela, ao voltar a ela aí sim o cmdInserir realmente desaparece.
Assim, na verdade desaparecia após ser encoberto e ao ser exibida a tela novamente, o processo funcionava normalmente - "sumindo" com o botão - o que caracteriza um problema no processo de desenho do botão. Nestas circustâncias, acho que é sempre mais conveniente tentar encontrar a origem do problema.

Se você analisar o método SetParent de TControl, verá que atribuindo-se qualquer Parent que não seja o mesmo, é executado o método RemoveControl, onde sua visibilidade é retirada e em seguida é executado o método InsertControl recolocando a visibilidade(quando Parent <> nil).

Note que InsertControl só é executado quando o novo Parent for <> nil; portanto a condição é prevista em SetParent e na minha opinião é perfeitamente válida sem que seja um macete.

Essa parte eu não tinha conhecimento (nunca havia percebido que ocorria). Obrigado pela explicação. :)

[]s

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...