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