Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Коряво работает свой компоннет на основе TEdit   Найти похожие ветки 

 
Gedimen ©   (2012-04-22 18:05) [0]

Доброго времени суток, господа форумчане.
Использую Delphi XE2.
Нужна Ваша помощь. Пишу свой компонент на основе TEdit - поле с кнопкой. Кнопка находится справа, поэтому чтобы текст при вводе не лез поверх кнопки сделал отступ:

self.Perform(EM_SETMARGINS, EC_RightMargin, MakeLong(0,20));

Все вроде нормально, только в рунтайме если кликнуть мышью в это поле, то фон текста закрывает кнопку, отпускаем и отводим курсор - опять нормально. Как побороть не знаю.

Исходник:

unit GpButtonEdit;

interface

uses
 Winapi.Windows,System.SysUtils, System.Classes, Vcl.Controls, Vcl.StdCtrls, Vcl.Buttons,
 Vcl.ExtCtrls, Messages;

type
 TGpButtonEdit = class(TEdit)
 private
   { Private declarations }
   FEdit       : TEdit;
   FSelButton  : TBitBtn;
   procedure WMSize(var Message: TMessage); message WM_SIZE;
   function GetSelBtnCheck: boolean;
   procedure SetSelBtnCheck(const Value: boolean);
   procedure EditWndProc(Sender: TObject);
   //procedure ButtonPosition;
 protected
   { Protected declarations }
 public
   { Public declarations }
   constructor Create(AOwner: TComponent); override;
 published
   { Published declarations }
   property SelButton: boolean read GetSelBtnCheck write SetSelBtnCheck;
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents("MyComponents", [TGpButtonEdit]);
end;

constructor TGpButtonEdit.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 width := 121;
 height := 21;

 FSelButton := TBitBtn.Create(self);
 FSelButton.Parent := self;
 FSelButton.Top := -1;
 FSelButton.Width:=21;
 FSelButton.Caption := "...";

self.OnChange:=EditWndProc;
end;

procedure TGpButtonEdit.EditWndProc(Sender: TObject);
begin
 // делаю отступ справа при вводе текста, чтобы не лез на кнопку
 self.Perform(EM_SETMARGINS, EC_RightMargin, MakeLong(0,20));
end;

function TGpButtonEdit.GetSelBtnCheck: boolean;
begin
 Result := FSelButton.Visible;
end;

procedure TGpButtonEdit.SetSelBtnCheck(const Value: boolean);
begin
 FSelButton.Visible := Value;
end;

procedure TGpButtonEdit.WMSize(var Message: TMessage);
begin
 inherited;
 FSelButton.height := height-2;
 FSelButton.Left := width - FSelButton.width-3;
end;

end.



 
sniknik ©   (2012-04-22 19:33) [1]

EM_SETRECTNP
вместо
EM_SETMARGINS

+ нужно добавить ES_MULTILINE


 
Омлет ©   (2012-04-22 19:43) [2]


> + нужно добавить ES_MULTILINE

?? Чтобы при нажатии Enter вставлялся перевод строки?


 
sniknik ©   (2012-04-22 20:09) [3]

> ?? Чтобы при нажатии Enter вставлялся перевод строки?
нет, чтобы заработал EM_SETRECTNP, без него бессмысленно. а чтобы не вставлялся перевод(не работал ентер), его можно отключить.


 
MBo ©   (2012-04-23 05:36) [4]

На всякий случай - в XE/XE2 есть TButtonedEdit


 
Gedimen ©   (2012-04-23 10:26) [5]


> На всякий случай - в XE/XE2 есть TButtonedEdit


Есть. Но у меня будет свой функционал у компонента.
И, почему-то, у стандартного TButtonedEdit у меня кнопки не отображаются, ставлю visible (что у левой, что у правой), а они не отображаются.


 
MBo ©   (2012-04-23 13:45) [6]

>а они не отображаются
рисунки надо назначить



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.076 c
2-1330501412
AV
2012-02-29 11:43
2013.03.22
Заменяя ProcessMessages


15-1332879004
Дмитрий С
2012-03-28 00:10
2013.03.22
Как скрыть диски для пользователя?


2-1328618080
JohnKorsh
2012-02-07 16:34
2013.03.22
Работа с MediaPlayer.


15-1342015306
Дмитрий С
2012-07-11 18:01
2013.03.22
Apache mod_rewrite


6-1256728864
Usov
2009-10-28 14:21
2013.03.22
Проблема с логином на сайте (Indy)