Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Gedimen ©   (2012-04-22 18:05:00) 

Доброго времени суток, господа форумчане.
Использую 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.


MBo   (2012-04-23 13:45:00) [1]

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


Gedimen   (2012-04-23 10:26:00) [2]


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


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


MBo   (2012-04-23 05:36:00) [3]

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


sniknik   (2012-04-22 20:09:00) [4]

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


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


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

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


sniknik   (2012-04-22 19:33:00) [6]

EM_SETRECTNP
вместо
EM_SETMARGINS

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо