Array
(
)

Botão dentro de um Edit

Raserafim
   - 11 jan 2006

Já vi algumas aplicações que dentro do Edit tem um botão. geralmente com um ícone de pesquisar.

Acho que devem ser provavelmente algum componente de terceiro.

mas como faço para colocar um botão dentro do Edit sem utilizar componentes de terceiro?


Raserafim
   - 18 fev 2006

consegui colocar o botão dentro caso eu crie dinamicamente um botão e coloque como Paret o Edit que quero.
mas quando clico no edit, o botão é deslocado para baixo.


Godzilla_xf
   - 20 fev 2007

Olá, bem gostaria de saber se vc resoveu o seu problema, pois estou com o mesmo problema e naum consigo achar a solução. Caso vc tenha resolvido poderia me postar uma pequena ajuda, de como fez???

obrigado. té +++


Raserafim
   - 25 mar 2007

não achei nenhuma solução.

desisti MOMENTANEAMENTE, de fazer isto, mas sei que em algum momento vou voltar a precisar.

agora faço o inverso. se vc achar alguma solução, poste aqui que vai me ajudar muito, e tenho certeza que várias amigos aqui do forum


Macario
   - 25 mar 2007

Olá.

Existe componente com esta caracteristica na RxLib.

Agora caso queira voce mesmo fazer seu componente de ´terceiros´ indico que olhe a implementação nas units da RxLib, assim terá como resolver seu impasse.


[]´s 8)


Godzilla_xf
   - 29 jul 2007


Citação:
não achei nenhuma solução.

desisti MOMENTANEAMENTE, de fazer isto, mas sei que em algum momento vou voltar a precisar.

agora faço o inverso. se vc achar alguma solução, poste aqui que vai me ajudar muito, e tenho certeza que várias amigos aqui do forum


Não achei mais a pagina que baixei entaum ta aqui o codigo, rsrs, espero que te ajude, té +++

#Código

unit uEditButton;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Mask, Buttons,ExtCtrls;

type
TEditBtn = class(TEdit)
private
FButton: TSpeedButton;
FEditorEnabled: Boolean;
FOnBtnClick : TNotifyEvent;

procedure SetGlyph(Pic: TBitmap);
function GetGlyph : TBitmap;

procedure SetNumGlyphs(ANumber: Integer);
function GetNumGlyphs:Integer;




function GetMinHeight: Integer;
procedure SetEditRect;
procedure WMSize(var Message: TWMSize); message WM_SIZE;
procedure CMEnter(var Message: TCMGotFocus); message CM_ENTER;
procedure CMExit(var Message: TCMExit); message CM_EXIT;
procedure WMPaste(var Message: TWMPaste); message WM_PASTE;
procedure WMCut(var Message: TWMCut); message WM_CUT;
protected
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
function IsValidChar(Key: Char): Boolean; virtual;
procedure aClick (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;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property Button: TSpeedButton read FButton;
published
property AutoSelect;
property AutoSize;
property Color;
property Ctl3D;
property DragCursor;
property DragMode;
property EditorEnabled: Boolean read FEditorEnabled write FEditorEnabled default True;
property Enabled;
property Font;
property Glyph : TBitmap read GetGlyph write SetGlyph;
property NumGlyphs : Integer read GetNumGlyphs write SetNumGlyphs;
property MaxLength;
property ParentColor;
property ParentCtl3D;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ReadOnly;
property ShowHint;
property TabOrder;
property TabStop;
property Visible;
property OnChange;
property OnClick;
property OnBtnClick : TNotifyEvent read FOnBtnClick write FOnBtnClick;
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;
end;

procedure Register;

implementation

{ TEditBtn }

constructor TEditBtn.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FButton := TSpeedButton.Create (Self);
FButton.Width := 15;
FButton.Height := 17;
FButton.Flat := true; //Tenho que ver isso aqui tbm
if csDesigning in ComponentState then
FButton.Visible := True
else FButton.Visible := False;

FButton.Parent := Self;
FButton.OnClick := aClick;
FButton.Cursor := crArrow;
ControlStyle := ControlStyle - [csSetCaption];
FEditorEnabled := True;
end;

destructor TEditBtn.Destroy;
begin
FButton := nil;
inherited Destroy;
end;

procedure TEditBtn.GetChildren(Proc: TGetChildProc; Root: TComponent);
begin
end;

procedure TEditBtn.KeyDown(var Key: Word; Shift: TShiftState);
begin
inherited KeyDown(Key, Shift);
end;

procedure TEditBtn.SetGlyph(Pic: TBitmap);
Begin
FButton.Glyph.Assign(Pic);
end;

function TEditBtn.GetGlyph : TBitmap;
Begin
Result:=FButton.Glyph;
end;

procedure TEditBtn.SetNumGlyphs(ANumber: Integer);
Begin
FButton.NumGlyphs:=ANumber;
end;

function TEditBtn.GetNumGlyphs:Integer;
begin
Result:=FButton.NumGlyphs;
end;

procedure TEditBtn.KeyPress(var Key: Char);
begin
if not IsValidChar(Key) then
begin
Key := #0;
MessageBeep(0)
end;
if Key <> 0 then inherited KeyPress(Key);
end;

function TEditBtn.IsValidChar(Key: Char): Boolean;
begin
Result := True;
end;

procedure TEditBtn.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
{ Params.Style := Params.Style and not WS_BORDER; }
Params.Style := Params.Style or ES_MULTILINE or WS_CLIPCHILDREN;
end;

procedure TEditBtn.CreateWnd;
begin
inherited CreateWnd;
SetEditRect;
end;

procedure TEditBtn.SetEditRect;
var
Loc: TRect;
begin
SendMessage(Handle, EM_GETRECT, 0, LongInt(@Loc));
Loc.Bottom := ClientHeight + 1; {+1 is workaround for windows paint bug}
Loc.Right := ClientWidth - FButton.Width - 2;
Loc.Top := 0;
Loc.Left := 0;
SendMessage(Handle, EM_SETRECTNP, 0, LongInt(@Loc));
SendMessage(Handle, EM_GETRECT, 0, LongInt(@Loc)); {debug}
end;

procedure TEditBtn.WMSize(var Message: TWMSize);
var
MinHeight: Integer;
begin
inherited;
MinHeight := 5;
{ text edit bug: if size to less than minheight, then edit ctrl does
not display the text }
if Height < MinHeight then
Height := MinHeight
else if FButton <> nil then
begin
FButton.Width:=Height;
if NewStyleControls and Ctl3D then
FButton.SetBounds(Width - FButton.Width - 5, 0, FButton.Width, Height - 5)
else FButton.SetBounds (Width - FButton.Width, 1, FButton.Width, Height - 1);
SetEditRect;
end;
end;

function TEditBtn.GetMinHeight: Integer;
var
DC: HDC;
SaveFont: HFont;
I: Integer;
SysMetrics, Metrics: TTextMetric;
begin
DC := GetDC(0);
GetTextMetrics(DC, SysMetrics);
SaveFont := SelectObject(DC, Font.Handle);
GetTextMetrics(DC, Metrics);
SelectObject(DC, SaveFont);
ReleaseDC(0, DC);
I := SysMetrics.tmHeight;
if I > Metrics.tmHeight then I := Metrics.tmHeight;
Result := Metrics.tmHeight + I div 4 + GetSystemMetrics(SM_CYBORDER) * 4 + 2;
end;

procedure TEditBtn.aClick (Sender: TObject);
begin
if ReadOnly then MessageBeep(0)
else IF Assigned(FOnBtnClick) then FOnBtnClick(Self);

end;


procedure TEditBtn.WMPaste(var Message: TWMPaste);
begin
if not FEditorEnabled or ReadOnly then Exit;
inherited;
end;

procedure TEditBtn.WMCut(var Message: TWMPaste);
begin
if not FEditorEnabled or ReadOnly then Exit;
inherited;
end;

procedure TEditBtn.CMExit(var Message: TCMExit);
begin
FButton.Visible:=False;
inherited;

end;


procedure TEditBtn.CMEnter(var Message: TCMGotFocus);
begin
FButton.Visible:=True;
if AutoSelect and not (csLButtonDown in ControlState) then
SelectAll;

inherited;
end;


procedure Register;
begin
RegisterComponents(´freeware´, [TEditBtn]);
end;

end.



Distribuidora Coimbra
   - 14 mar 2015

Alguém conseguiu colocar um botão dentro de um edit?
Bem.. Eu até que consegui colocar porém o botão fica por cima do texto.
Alguém sabe se tem alguma propriedade que mexe exatamente com isso?

Thiago Santana
   - 16 mar 2015

O JEDI já tem componentes que fazem isso automaticamente!
Componente já pronto!

Download Jedi