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

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

Проблема перехода из режима Design Time в Run Time [D7, WinME]


bosia ©   (2005-10-20 02:38:00) 

Мною создан визуальный компонент, наследник о TPanel, который осуществляет градиентную заливку между двумя цветами. Есть св-во UseGradient:Boolean. В режиме Design-Time при установке этого св-во в true, всё отрабатывает хорошо.
Проблема: при переходе в режим Run-Time св-во сбрасывается или возможно не читается из файла формы. Если создавать компонент в режиме Run-Time, всё опять отлично отрабатывает. Пожайлуста подскажите как устранить проблему?
Заранее спасибо!!!


DHDD   (2005-10-21 12:51:00) [1]

проверь в Create:

если Enable:=false то при создании формы будет false

не путай FEnable и Enable

значение Enable хранится в *.dfm


bosia   (2005-10-20 21:05:00) [2]

В последней реализации, как отдельный компонент, создаёться  в режиме Design-Time, все манипуляции в этом же режиме, что бы упростить работу с ним. Если подключать в режиме Rune-Time всё работает. Идея создания заключалась в том, чтобы создать панель, которая имела бы более привлекательный вид, чем стандартная. Получается, что для корректной работы необходимо убрать проверку из обоих процедур...

if (FDirection=gdNone) then
FEnable:=false;


Но это меня не устраивает.


umbra   (2005-10-20 19:46:00) [3]

а как этот TGradient участвует в форме?


bosia   (2005-10-20 19:29:00) [4]

Спасибо всем, я обнаружил неполадку, но устранить не могу... Всё по порядку... я переписал код компонента и вот что получается. Это интерфейсная часть...


{----Class TGradient----}
 TGradient = class(TGraphicControl)
  private
    {----private declaration----}
   FLevel:Integer;
   FColor1:TColor;
   FColor2:TColor;
   FEnable:Boolean;
   FDirection:TDirection;
  protected
    {----protected declaration----}
    ProcedureHGradient;
    ProcedurePaint; override;
    ProcedureSetLevel( constValue:Integer);
    ProcedureSetColor1( constValue:TColor);
    ProcedureSetColor2( constValue:TColor);
    ProcedureSetEnable( constValue:Boolean);
    ProcedureSetDirection( constValue:TDirection);
  public
    {----public declaration----}
    ConstructorCreate(AOwner:TComponent); override;
  published
    {----published declaration----}
    PropertyLevel:Integer readFLevel writeSetLevel default0;
    PropertyEnable:Boolean readFEnable writeSetEnable defaultfalse;
    PropertyColor1:TColor readFColor1 writeSetColor1 defaultclBlack;
    PropertyColor2:TColor readFColor2 writeSetColor2 defaultclBlack;
    PropertyDirection:TDirection readFDirection writeSetDirection defaultgdNone;
  end;


Есть направление градиентной заливки FDirectionи переключатель FEnable. Если написать процедуры обработки св-в таким образом, то всё отрабатывает отлично:


{----Set "FDirection" Value----}
ProcedureTGradient.SetDirection( constValue:TDirection);
begin
 if (FDirection<>Value) then
  begin
   FDirection:=Value;
   Invalidate;
  end;
end;

{----Set "FEnable" Value----}
ProcedureTGradient.SetEnable( constValue:Boolean);
begin
 if (FEnable<>Value) then
  begin
   FEnable:=Value;
   Invalidate;
  end;
end;


Но мне необходимо сделать проверку:
- если направление не установлено, то не включать переключатель;
- если переключатель включён, то при установке направления в gdNone выключить его.

<CODE >{----Set "FDirection" Value----}
ProcedureTGradient.SetDirection( constValue:TDirection);
begin
 if (FDirection<>Value) then
  begin
   FDirection:=Value;
   Invalidate;
   if (FDirection=gdNone) then
    FEnable:=false;
  end;
end;

{----Set "FEnable" Value----}
ProcedureTGradient.SetEnable( constValue:Boolean);
begin
 if (FEnable<>Value) then
  begin
   FEnable:=Value;
   Invalidate;
   if (FDirection=gdNone) then
    FEnable:=false;
  end;
end;

При такой реализации в инспекторе объектов всё работает, но при переходе
к выполнению, опять ничего...


bosia   (2005-10-20 14:36:00) [5]

Спасибо всем... Я уже нашёл неполадку.
Вот интерфейсная часть...

{----Gradient Direction----}
 TGradientDirection = (gdNone ,gdHorizontal);

 {----Class TGradientPanel----}
 TGradientPanel = class (TPanel)
  private
   {----private declarations----}
   FUseGradient:Boolean;
   FGradientColor1:TColor;
   FGradientColor2:TColor;
   FGradientLevel:Integer;
   FGradientDirection:TGradientDirection;
  protected
   {----protected declarations----}
   Procedure HGradient;
   Procedure Paint; Override;
   Procedure GradientDrawing;
   Procedure SetUseGradient(Enable:Boolean);
   Procedure SetGradientLevel(Level:Integer);
   Procedure SetGradientColor1(Color1:TColor);
   Procedure SetGradientColor2(Color2:TColor);
   Procedure SetGradientDirection(Direction:TGradientDirection);
  public
   {----public declarations----}
  published
   {----published declarations----}
   Property UseGradient:Boolean read FUseGradient write SetUseGradient default false;
   Property GradientLevel:Integer read FGradientLevel write SetGradientLevel default 0;
   Property GradientColor1:TColor read FGradientColor1 write SetGradientColor1 default clBlack;
   Property GradientColor2:TColor read FGradientColor2 write SetGradientColor2 default clBlack;
   Property GradientDirection:TGradientDirection read FGradientDirection write SetGradientDirection default gdNone;
 end;


Igorek   (2005-10-20 14:00:00) [6]


> Пожайлуста подскажите как устранить проблему?

- проверьте, меняется ли поле св-ва только в методе записи
- укажите Делфи путь к исходникам компонента
- поставьте точку останова на метод записи
- запустите, выведите окно стека вызовов и все увидите


MBo   (2005-10-20 06:10:00) [7]

СтОит привести хотя бы интерфейсную часть класса и  реализацию конструктора.


Наверх

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