-
День добрый! Что то я неправильно делаю (опыта маловато) Взял TAlignEdit (в инете во многих источниках) немного переделал, т.к. надо много подобных edit ов. Если ложу на форму то всё отлчно работает, если на pagecontrol то свойства bevel* явно изменяются. и определённые onenter onexit работают неправильно.. в чём ошибка?
unit AlignEdit;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TAlign = (eaLeft, eaCenter, eaRight);
TAlignEdit = class(TEdit)
private
FAlign: TAlign;
FOnExit: TNotifyEvent;
FOnEnter: TNotifyEvent;
procedure SetAlign(const Value: TAlign);
procedure CMEnter(var Message: TMessage); message CM_ENTER;
procedure CMExit(var Message: TMessage); message CM_EXIT;
protected
procedure CreateParams(var Params: TCreateParams); override;
public
constructor Create(AOwner: TComponent); override;
published
property Alignment: TAlign read FAlign write SetAlign default eaCenter;
property OnExit: TNotifyEvent read FOnExit write FOnExit;
property OnEnter: TNotifyEvent read FOnEnter write FOnEnter;
end;
procedure Register;
implementation
constructor TAlignEdit.Create(Aowner: TComponent);
begin
inherited Create(AOwner);
FAlign := eaCenter;
autosize:=false;
font.Name:='Arial';
font.Size:=9;
height:=15;
width:=56;
text:='--';
bevelinner:=bvRaised;
bevelkind:=bknone;
bevelouter:=bvraised;
alignment:=eaCenter;
borderstyle:=bsnone;
color:=RGB(187,187,175)
end;
procedure TAlignEdit.SetAlign(const Value: TAlign);
begin
if FAlign <> Value then
begin
FAlign := Value;
RecreateWnd;
end;
end;
procedure TAlignEdit.CreateParams(var Params: TCreateParams);
begin
inherited;
case FAlign of
eaLeft: Params.Style := Params.Style or ES_LEFT;
eaCenter: Params.Style := Params.Style or ES_CENTER;
eaRight: Params.Style := Params.Style or ES_RIGHT;
end;
end;
procedure TAlignEdit.CMEnter(var Message: TMessage);
begin
if Assigned(FOnEnter) then
FOnEnter(Self);
if readonly=false then
begin
bevelkind:=bkflat;
alignment:=eaLeft;
borderstyle:=bsSingle;
left:=left-2;
width:=width+4;
top:=top-2;
height:=height+4
end;
end;
procedure TAlignEdit.CMExit(var Message: TMessage);
begin
if Assigned(FOnExit) then
FOnExit(Self);
if bevelkind <> bknone then
begin
bevelkind:=bknone;
borderstyle:=bsnone;
alignment:=eaCenter;
left:=left+2;
width:=width-4;
top:=top+2;
height:=height-4;
RecreateWnd;
end;
end;
procedure Register;
begin
RegisterComponents('SwissDelphiCenter', [TAlignEdit]);
end;
end.
-
Данный код хоть и глючный однако ошибок не возникает
-
взял исходный AlignEdit - он работает. Т.е. это я что то неверно написал в определении OnExit OnEnter. Опытным путём проверил при переходе по tabsheet мой AlignEdit теряет текст.
-
> tabsheet мой AlignEdit теряет текст.
Это скорее всего из за RecreateWnd; при bevelkind <> bknone
-
отнюдь ) пробовал вынести за условие (текст не воодится), убрать вообще (не вводится ещё и пропадает сам edit при переходах по tabsheet)
-
Ничего не понятно. Давайте с начала. Что (какой компонент) вы хотите получить ???
-
Итак. Мне нужен edit у которого: 1 текст по середине (найденый TAlignEdit это условие выполняет) 2 по клику мышью (onEnter) появляется бордюр, появляется маска типа --,- с центровкой слева 3 когда переходим от этого edit a (onExit) бордюр опять пропадает, текст становится посередине
В приведённом примере это работает, до тех пор пока parent форма. А мне нужно подобные edit ы помещать на страницы из PageControl
-
Не вижу никакой разницы между формой и PageControl-ом в вашем варианте.
Приведённый код весь или вырезка ???
-
В том то и дело! Код весь.
-
1. Зачем в CMExit пресоздается окно? Не нужно.
2. Переименуйте тип TAlign (такой в VCL уже есть и лучше заранее избежать возможных конфликтов, чем потом вылавливать непонятные глюки). А еще луше - используйте уже имеющийся тип TAlignment (кстати, он специально для этого и введен).
3. Под Windows 95, а также под Windows NT 4.0 и более ранними стили ES_CENTER, ES_RIGHT окон класса EDIT работают только в сочетании со стилем ES_MULTILINE. Соответственно, под этими ОС Ваш компонент в том виде, как он есть, работать не будет. Дело хозяйское, но я бы подправил - доработка мелкая (добавить стиль ES_MULTILINE и убрать ES_WANTRETURN), зато компонент будет работать всегда и везде.
4. Чтобы обнаружить, где теряется текст, заместите метод SetText и обработчик WM_SETTEXT, там поставьте брейки и смотрите стек вызовов при потере текста.
-
1 пересоздание убрал 2 переименовал TAlign в TAlign1 ) 3 не требуется 4 без пересоздания ведёт себя немного иначе, сделал наследником не TEdit а TMaskEdit (маска нужна). На pagecontrole (как и на tabcontrol e, panel e ) при клике бордюр появляется маска исчезает и вводятся символы по одному (каждый последующий заменяет предыдущий) и в середине! хотя должно слева. pls пишите подробней как что проверять. Первый опыт переопределения,создания компонент. В голове пока каша.. )
|