Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   C++Builder 6.0 -> проблема с компонентами неправилно работает __property (http://forum.oszone.net/showthread.php?t=76998)

MPru 03-01-2007 10:14 531417

C++Builder 6.0 -> проблема с компонентами неправилно работает __property
 
написал я компонент TExtProgressBar который создан при помощи базового класа TGraphicControl
Если в нем задать __property любого типа и при выполнении присвоить значение равное нулю тогда это значение ей не присвоится хотя никаких проверок на ее значение не ведется Например:


ExtProgressBar.h

Цитата:

#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
//---------------------------------------------------------------------------
class PACKAGE TExtProgressBar : public TGraphicControl
{
private:
void __fastcall SetProgress(bool value);
bool FProgress;
///............................
__published:
__property bool Progress = { read=FProgress, write=SetProgress };
};

ExtProgressBar.cpp

Цитата:

#include <vcl.h>

#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 05-01-2007 22:47 532267

Цитата:

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

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

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

TExtProgressBar::TExtProgressBar(...) : TProgressBar(...), FProgress(-1) {}
и всё должно заработать. Или добавьте default в описание свойства

MPru 10-01-2007 09:47 534145

Кстати маленькая ошибочка переменая 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 10-01-2007 20:00 534418

так, а если 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 11-01-2007 09:13 534649

Цитата:

Кстати маленькая ошибочка переменая Progress и FProgress не bool а int
...все нет уже у нас никакого bool`а
10 это тько для наглядности в принципе знач. может быть любым (и 20 и 100 и ...)

pva 12-01-2007 11:09 535136

я вот про это: void __fastcall TExtProgressBar::SetProgress(bool value)
просто придираться как компилятор уже стал.
Цитата:

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


Время: 05:03.

Время: 05:03.
© OSzone.net 2001-