C++Builder 6.0 -> проблема с компонентами неправилно работает __property

Ответить
Аватара пользователя
MPru

C++Builder 6.0 -> проблема с компонентами неправилно работает __property

Сообщение MPru »

написал я компонент 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();

}

}



//.......
Аватара пользователя
pva

Re: C++Builder 6.0 -> проблема с компонентами неправилно работает __property

Сообщение pva »

Цитата:



хотя никаких проверок на ее значение не ведется



а это что?



Код:

Код: Выделить всё

if(value!=FProgress)  // допустим fvalue==0 && FProgress==0
        {
        FProgress=value;   
        //.............
        Paint();
        }

при построении объекта нет инициализации FProgress, поэтому вполне возможно, что в памяти он оказывается нулём.

сделайте конструктор



Код:

Код: Выделить всё

TExtProgressBar::TExtProgressBar(...) : TProgressBar(...), FProgress(-1) {}

и всё должно заработать. Или добавьте default в описание свойства
Аватара пользователя
MPru

Re: C++Builder 6.0 -> проблема с компонентами неправилно работает __property

Сообщение MPru »

Кстати маленькая ошибочка переменая 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

Re: C++Builder 6.0 -> проблема с компонентами неправилно работает __property

Сообщение pva »

так, а если 20, а потом 0? Просто подозрительная кореляция с инициализируемым в конструкторе значением...

А, и вот ещё что: проверь типы.



Код:

Код: Выделить всё

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

Сообщение MPru »

Цитата:



Кстати маленькая ошибочка переменая Progress и FProgress не bool а int



...все нет уже у нас никакого bool`а

10 это тько для наглядности в принципе знач. может быть любым (и 20 и 100 и ...)
Аватара пользователя
pva

Re: C++Builder 6.0 -> проблема с компонентами неправилно работает __property

Сообщение pva »

я вот про это: void __fastcall TExtProgressBar::SetProgress(bool value)

просто придираться как компилятор уже стал.


Цитата:



10 это тько для наглядности



предлагаю попробовать протестировать с разными значениями. И вставь везде MessageBox-ы. Если тебе ещё интересно разобраться, конечно
Ответить

Вернуться в «Программирование и базы данных»