Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Комонент ведет поразному


Автор: Dr.Wisdom 1.2.2007, 14:59
Есть визуальный компонент. 
Довольно таки сложный.
Состоит из двух картинок одна над другой и обладает кучей свойств, которые этими картинками управляют.

В нем есть набор своих свойств.
Код

       __property int Type = {read = get_type, write = set_type, default=0};
       __property bool Vertical = {read = get_vertical, write = set_vertical, default=false};
      //итд

и набор свойств родителя
Код

      __property bool Broken = {read = get_broken, write = set_broken};
      __property bool Repair = {read = get_repair, write = set_repair};
      __property bool NoData = {read = get_nodata, write = set_nodata};


И еще есть функция refresh_status(), определенная в родителе, которая вызывает виртуальную refresh_view(), определенную в каждом наследнике.
Эта функция также вызываеться из каждой set_свойство после присвоения соответсствующей переменной.

Стало нужно чтобы если вдруг установилось одно из всвойств Broken Repair или NoData то в нижнюю картинку загрузился определенный файл.

До этого было так, что загрузка этого файла зависила только от NoData.

Кароче говоря, было
Код

 if(NoData){}

стало
 
Код

if(NoData||Repair||Broken){}


все по логике вещей нормально.
и в дезигн тайме все работает!!!!
я переключаю свойства и картинка меняется.
НО. в рантайме не работает!!!!!!!!!!!!!
я переключаю свойство и картинка не меняется.

У меня открыт пакет с компонентами. 
Я его перекомпиливал. 
Я его грохал и снова компилил.
Я грохал все что с ним связвно и компилил заново.

В дезигне все работает как надо!!!!
А в рантайме - нет!!!!

Что это?
Может сталкивался кто?
Может это билдер гонит?

Вот на всякий код функций обновления картинок.
Код

void __fastcall TMNSchemaElement::refresh_status()
{
   if (!Broken && !Repair) StatusPict->Image->LoadFromFile(gifEmpty);
   if (Broken) StatusPict->Image->LoadFromFile(gifBroken);
   if (Repair) StatusPict->Image->LoadFromFile(gifRepair);

   refresh_view(); // <------- вот я ее вызываю

   int dy = (this->Height - StatusPict->Height)/2;
   int dx = (this->Width - StatusPict->Width)/2;

   StatusPict->AutoSize = true;
   this->AutoSize = true;
   StatusPict->Left = this->Left + dx;
   StatusPict->Top = this->Top + dy;

   StatusPict->Hint = this->Hint;
   StatusPict->ShowHint = this->ShowHint;
}

и еще
Код


void TMNZatvor::refresh_view()
{
        int d = 0;
        if(!vertical) d = 4; 

        if(NoData||Repair||Broken) // <------------  вот последнее гонючее изменение
           Image->LoadFromFile(picts[d]);
        else
           Image->LoadFromFile(picts[this->Type+d]);       
}

Автор: Anikmar 1.2.2007, 19:26
А вот при установке одного из этих трех свойств точно в каждом вызывается refresh_status?

На ум приходит только эта причина.

А почему в дизайнтайме перерисовывается - может там какая-то другая ветка срабатывает...


Автор: Dr.Wisdom 2.2.2007, 23:41
Да, точно. 
Везде.
И если бы не выхывался, то и в дезигне не работало бы.

ЭЭЭЭЭЭХ! Семь бед - один ресет.
Снесу билдер и попробую снова. 

Автор: Anikmar 3.2.2007, 00:45
Цитата(Dr.Wisdom @  2.2.2007,  23:41 Найти цитируемый пост)
Снесу билдер и попробую снова.  

Достаточно радикально.
Надеюсь поможет.

Автор: Dr.Wisdom 5.2.2007, 13:03
Вооооот
добрался до кодов
вот свойства
(чтобы не быть голословным про "да везде")
Код

void __fastcall TMNSchemaElement::set_broken(bool Value)
{
   broken = Value;
   refresh_status();
}
void __fastcall TMNSchemaElement::set_repair(bool Value)
{
   repair = Value;
   refresh_status();
}

void __fastcall TMNSchemaElement::set_nodata(bool Value)
{
   nodata = Value;
   refresh_status();
}

void __fastcall TMNSchemaElement::set_door(bool Value)
{
   door = Value;
   refresh_status();
}

Автор: Dr.Wisdom 5.2.2007, 13:52
Помогло!
Я в замешательстве.

Наверное у меня все таки билдер гонючий.

Притом проект который не работал продолжает не работать, только теперь ругаеться на "ненашел файл .lib". Типо там были мои старые компоненты. 

Потому что новый пакет я скомпилил под другим именем.

Выходит внутри проекта есть ссылка на пакеты? Чушь какаято.

Но в новом проекте с использованием тех же компонентов все работает как надо.
Замечательно то, что я пробывал создавать ногвые пустые проекты с нуля на прошлом, ныне снесенном билдере и они не работалт точно также как и основное проект. 

Теперь ни один из них не работает совсем, но новосозданные проекты работают.

Вот такой глюк. Толи в моем билдере, толи еще в чем.
Я все таки думаю, что в билдере.

Копиляция билдера следующая: v6.0 10.155 + Sp4 + RxLib 2.75 + DepOPCComponents2.2

Автор: Vyacheslav 5.2.2007, 16:35
Цитата(Dr.Wisdom @  5.2.2007,  13:52 Найти цитируемый пост)
Выходит внутри проекта есть ссылка на пакеты?

Почему чушь?  У Вас была подключена библиотека с одним именем, Вы подключили ешеодну библиотеку с другим именем. Линковщик доходит до первой, находит нужные ссылки и подключает. Ваша вторая, которое содержит новый вариант ему без разницы. Вохможно прада линковщик варнинги выдаст. 
А так, открываем 
Project->Edit Option Source 
и вычищаем ненужные  библиотеки

Автор: Dr.Wisdom 5.2.2007, 20:26
Ясно... с этим ясно.... Но это вторично....

До переустановки то несоответствие дезигнтайми с рантаймом было! Вот что меня убило!
И библиотека тогда одинаково называлась. 

С этими подключаемыми модулями такая чушь происходит. Жуть.

Неработает.... smile 
Неработает.... smile 
Неработает.... smile 
[сходишь кофе пропьешь]
Работает..... smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)