Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C++Builder 6.0 -> проблема с компонентами неправилно работает __property

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

Аватара для MPru

Новый участник


Сообщения: 31
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

//.......

Отправлено: 10:14, 03-01-2007

 
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата:
хотя никаких проверок на ее значение не ведется
а это что?
Код: Выделить весь код
if(value!=FProgress)  // допустим fvalue==0 && FProgress==0
        {
        FProgress=value;   
        //.............
        Paint();
        }
при построении объекта нет инициализации FProgress, поэтому вполне возможно, что в памяти он оказывается нулём.
сделайте конструктор
Код: Выделить весь код
TExtProgressBar::TExtProgressBar(...) : TProgressBar(...), FProgress(-1) {}
и всё должно заработать. Или добавьте default в описание свойства

Отправлено: 22:47, 05-01-2007 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для MPru

Новый участник


Сообщения: 31
Благодарности: 0

Профиль | Отправить PM | Цитировать


Кстати маленькая ошибочка переменая 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
Это освобождает компонент от отрисовки того же самого состояния (зачем нам перерисовывать весь рисунок если ничего не изменилось)

Отправлено: 09:47, 10-01-2007 | #3

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


так, а если 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 везде понавставлять? как блок отрабатывает то?

Отправлено: 20:00, 10-01-2007 | #4


Аватара для MPru

Новый участник


Сообщения: 31
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 09:13, 11-01-2007 | #5

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


я вот про это: void __fastcall TExtProgressBar::SetProgress(bool value)
просто придираться как компилятор уже стал.
Цитата:
10 это тько для наглядности
предлагаю попробовать протестировать с разными значениями. И вставь везде MessageBox-ы. Если тебе ещё интересно разобраться, конечно

Отправлено: 11:09, 12-01-2007 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C++Builder 6.0 -> проблема с компонентами неправилно работает __property

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Debian/Ubuntu - Проблема ImageMagick не работает как нужно viktor1969 Общий по Linux 1 17-04-2009 09:21
Проблема с Gigabyte GA-8IPE1000, нестабильно работает JohnMac Непонятные проблемы с Железом 13 12-11-2008 15:58
C/C++ - [решено] (C++ Builder) Программа аутентификации - проблема вызова диалоговых окон и сохранения Luzuk Программирование и базы данных 10 06-11-2008 05:34
Delphi - Помощь с чатом для сети через TServerS\TClientSocket и компонентами! BASSON_XVI Программирование и базы данных 1 23-10-2008 15:12
Проблема с ноутом: не работает порт(клава) PS/2 Rodrigo_F Непонятные проблемы с Железом 5 03-04-2008 06:57




 
Переход