написал я компонент TExtProgressBar который создан при помощи базового класа TGraphicControl
Если в нем задать __property любого типа и при выполнении присвоить значение равное нулю тогда это значение ей не присвоится хотя никаких проверок на ее значение не ведется Например:
ExtProgressBar.h
Цитата:
#include
#include
#include
//---------------------------------------------------------------------------
class PACKAGE TExtProgressBar : public TGraphicControl
{
private:
void __fastcall SetProgress(bool value);
bool FProgress;
///............................
__published:
__property bool Progress = { read=FProgress, write=SetProgress };
};
ExtProgressBar.cpp
Цитата:
#include
#pragma hdrstop
#include "ExtProgressBar.h"
#pragma package(smart_init)
static inline void ValidCtrCheck(TExtProgressBar *)
{
new TExtProgressBar(NULL);
}
//---------------------------------------------------------------------------
namespace Extprogressbar
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TExtProgressBar)};
RegisterComponents("Samples", classes, 0);
}
}
//---------------------------------------------------------------------------
void __fastcall TExtProgressBar::SetProgress(bool value)
{
if(value!=FProgress)
{
FProgress=value;
//.............
Paint();
}
}
//.......
C++Builder 6.0 -> проблема с компонентами неправилно работает __property
-
pva
Re: C++Builder 6.0 -> проблема с компонентами неправилно работает __property
Цитата:
хотя никаких проверок на ее значение не ведется
а это что?
Код:
при построении объекта нет инициализации FProgress, поэтому вполне возможно, что в памяти он оказывается нулём.
сделайте конструктор
Код:
и всё должно заработать. Или добавьте default в описание свойства
хотя никаких проверок на ее значение не ведется
а это что?
Код:
Код: Выделить всё
if(value!=FProgress) // допустим fvalue==0 && FProgress==0
{
FProgress=value;
//.............
Paint();
}при построении объекта нет инициализации FProgress, поэтому вполне возможно, что в памяти он оказывается нулём.
сделайте конструктор
Код:
Код: Выделить всё
TExtProgressBar::TExtProgressBar(...) : TProgressBar(...), FProgress(-1) {}и всё должно заработать. Или добавьте default в описание свойства
-
MPru
Re: C++Builder 6.0 -> проблема с компонентами неправилно работает __property
Кстати маленькая ошибочка переменая Progress и FProgress не bool а int
pva
Ты немного меня не понял. Я создал компонент, установил его и поместил его на свою форму но даже если в Design-time изменить например свойство Progress сначала на 10 а потом присвоить занчение 0 тода переменная будет..... 10
Точнее покажет что 0 но после компиляции будет 10.
Цитата:
сделайте конструктор
Контруктор конечно же есть и с такими начальними парамертрами
FWidth = 100;
FHeight = 20;
FProgress = 10;
FMin = 0;
FMax = 100;
...и т.д.
но как я понял это влияет только на создание компонента но не на дальнейшее его существование
Цитата:
а это что?
Это лиш проверка на то равно ли FProgress значеннию которое мы записали в Progress
Это освобождает компонент от отрисовки того же самого состояния (зачем нам перерисовывать весь рисунок если ничего не изменилось)
pva
Ты немного меня не понял. Я создал компонент, установил его и поместил его на свою форму но даже если в Design-time изменить например свойство Progress сначала на 10 а потом присвоить занчение 0 тода переменная будет..... 10
Точнее покажет что 0 но после компиляции будет 10.
Цитата:
сделайте конструктор
Контруктор конечно же есть и с такими начальними парамертрами
FWidth = 100;
FHeight = 20;
FProgress = 10;
FMin = 0;
FMax = 100;
...и т.д.
но как я понял это влияет только на создание компонента но не на дальнейшее его существование
Цитата:
а это что?
Это лиш проверка на то равно ли FProgress значеннию которое мы записали в Progress
Это освобождает компонент от отрисовки того же самого состояния (зачем нам перерисовывать весь рисунок если ничего не изменилось)
-
pva
Re: C++Builder 6.0 -> проблема с компонентами неправилно работает __property
так, а если 20, а потом 0? Просто подозрительная кореляция с инициализируемым в конструкторе значением...
А, и вот ещё что: проверь типы.
Код:
В C++ тип выражений приводится к типу результата выполнения предыдущего оператора, поэтому это следует понимать как:
Код:
value не равно нулю, значит равно true, FProgress - то же самое. Не будет выполняться. Странно только, что нулю не присвоилось (в дизайнере). А что если MessageBox везде понавставлять? как блок отрабатывает то?
А, и вот ещё что: проверь типы.
Код:
Код: Выделить всё
void __fastcall TExtProgressBar::SetProgress(bool value)
{
if(value!=FProgress)
{
FProgress=value;
//.............
Paint();
}
}В C++ тип выражений приводится к типу результата выполнения предыдущего оператора, поэтому это следует понимать как:
Код:
Код: Выделить всё
bool value = ...;
if (value != bool(FProgress)) {...}value не равно нулю, значит равно true, FProgress - то же самое. Не будет выполняться. Странно только, что нулю не присвоилось (в дизайнере). А что если MessageBox везде понавставлять? как блок отрабатывает то?
-
MPru
Re: C++Builder 6.0 -> проблема с компонентами неправилно работает __property
Цитата:
Кстати маленькая ошибочка переменая Progress и FProgress не bool а int
...все нет уже у нас никакого bool`а
10 это тько для наглядности в принципе знач. может быть любым (и 20 и 100 и ...)
Кстати маленькая ошибочка переменая Progress и FProgress не bool а int
...все нет уже у нас никакого bool`а
10 это тько для наглядности в принципе знач. может быть любым (и 20 и 100 и ...)
-
pva
Re: C++Builder 6.0 -> проблема с компонентами неправилно работает __property
я вот про это: void __fastcall TExtProgressBar::SetProgress(bool value)
просто придираться как компилятор уже стал.
Цитата:
10 это тько для наглядности
предлагаю попробовать протестировать с разными значениями. И вставь везде MessageBox-ы. Если тебе ещё интересно разобраться, конечно
просто придираться как компилятор уже стал.
Цитата:
10 это тько для наглядности
предлагаю попробовать протестировать с разными значениями. И вставь везде MessageBox-ы. Если тебе ещё интересно разобраться, конечно