Конференция "Компоненты" » глюк при добавлении на pagecontrol [D7, WinXP]
 
  • vogel max (02.07.07 12:58) [0]
    День добрый! Что то я неправильно делаю (опыта маловато)
    Взял 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
        { Private-Deklarationen }
        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
        { Protected-Deklarationen }
        procedure CreateParams(var Params: TCreateParams); override;
      public
        { Public-Deklarationen }
        constructor Create(AOwner: TComponent); override;
      published
        { Published-Deklarationen }
        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.

  • DimaBr © (02.07.07 13:43) [1]
    Данный код хоть и глючный однако ошибок не возникает
  • vogel max (02.07.07 13:59) [2]
    взял исходный AlignEdit - он работает. Т.е. это я что то неверно написал в определении OnExit OnEnter. Опытным путём проверил при переходе по tabsheet мой AlignEdit теряет текст.
  • DimaBr © (02.07.07 14:40) [3]

    > tabsheet мой AlignEdit теряет текст.

    Это скорее всего из за RecreateWnd; при  bevelkind <> bknone
  • vogel max (02.07.07 19:48) [4]
    отнюдь )
    пробовал вынести за условие (текст не воодится), убрать вообще (не вводится ещё и пропадает сам edit при переходах по tabsheet)
  • DimaBr © (03.07.07 08:34) [5]
    Ничего не понятно. Давайте с начала. Что (какой компонент) вы хотите получить ???
  • vogel max (03.07.07 11:54) [6]
    Итак. Мне нужен edit у которого:
    1 текст по середине (найденый TAlignEdit это условие выполняет)
    2 по клику мышью (onEnter) появляется бордюр, появляется маска типа --,-
       с центровкой слева
    3 когда переходим от этого edit a (onExit) бордюр опять пропадает, текст становится посередине

    В приведённом примере это работает, до тех пор пока parent форма. А мне нужно подобные edit ы помещать на  страницы из PageControl
  • DimaBr © (03.07.07 13:45) [7]
    Не вижу никакой разницы между формой и PageControl-ом в вашем варианте.

    Приведённый код весь или вырезка ???
  • vogel max (04.07.07 06:43) [8]
    В том то и дело! Код весь.
  • Юрий Зотов © (04.07.07 09:26) [9]
    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, там поставьте брейки и смотрите стек вызовов при потере текста.
  • vogel max (04.07.07 12:39) [10]
    1 пересоздание убрал
    2 переименовал TAlign в TAlign1 )
    3 не требуется
    4
    без пересоздания ведёт себя немного иначе, сделал наследником не TEdit а TMaskEdit (маска нужна).
    На pagecontrole (как и на tabcontrol e, panel e ) при клике бордюр появляется маска исчезает и вводятся символы по одному (каждый последующий заменяет предыдущий) и в середине! хотя должно слева.
    pls пишите подробней как что проверять. Первый опыт переопределения,создания компонент. В голове пока каша.. )
 
Конференция "Компоненты" » глюк при добавлении на pagecontrol [D7, WinXP]
Есть новые Нет новых   [134427   +38][b:0][p:0.002]