![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Коряво работает свой компоннет на основе 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