Форум: "Компоненты";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
ВнизОшибка при добавлении свойства компоненту Найти похожие ветки
← →
Ф-1 (2005-03-02 12:36) [0]Господа , помогите пожалуйста!
Среда - Delphi 7.
Написал свой визуальный компонент. Потомок PaintBox. Специальные графики рисовать. ПОставил на форму, написал код, откомпилял. Всё работает как надо. Потом потребовалось добавить новое свойство компоненту. Добавил property, соответсвующую ему переменную. Описал точь в точь как те, которые были с самого начала. Компиляю - всё нормально. А когда запускается - ошибка: "Exception EReadError in module XXX.exe at 0002221B.Error reading YYY1.ZZZ:Property ZZZ does not exist". YYY1 - имя компонента, ZZZ - имя нового свойства.Что только я не делал - удалял с формы, удалял с панели компонентов, компилял компонент заново с нуля, потом устанавливал в дельфи, потом только помещал опять на форму - то же самое. Вопрос - как победить?
← →
Reindeer Moss Eater © (2005-03-02 13:05) [1]Убери свойство из секции published
← →
Ф-1 (2005-03-02 13:26) [2]А как тогда редактировать его значение в Design Time?
← →
Юрий Зотов © (2005-03-02 13:51) [3]Похоже, какое-то дублирование файлов у Вас получилось. Сделайте поиск и удалите все файлы "Имя_модуля_компонента.DCU", а потом перекомпилируйте пакет.
И если у свойства ZZZ возможен описатель default, то проставьте его.
← →
Reindeer Moss Eater © (2005-03-02 13:55) [4]А как тогда редактировать его значение в Design Time?
Вопрос был:
Вопрос - как победить?
← →
Ф-1 (2005-03-02 13:56) [5]Перенёс в Public, а свойство вообще исчезло, как в Design так и в Run time. А когда было в Published, то в Object Inspector отображалось и можно было менять значение, но при запуске программы - ошибка.
Вот кусок кода
...
TSeysmBox = class(TPaintBox)
private
...
N_CHan : word ;
N_D_CHan : word; // Вновь добавленное поле для нового свойства
...
procedure SetNCHan(const inval:word); //Обработчики для установки
procedure SetNDCHan(const inval:word);//значений свойств
protected
...
public
constructor Create(AOwner:TComponent);override;
...
published
...
property N_CHannels : word read N_CHan write SetNCHan;
property N_DChan : word read N_D_CHan write SetNDCHan; //Новое свойство
...
end;
implementation
...
constructor TSeysmBox.Create(AOwner:TComponent);
var i : integer;
begin
...
inherited Create(AOwner);
N_Chan := 48;
N_D_CHan := 2;
...
setlength(ShowCHannels,N_CHAN+N_D_CHan);
for i := 0 to N_CHan - 1 + N_D_CHan do ShowChannels[i] := true;
setlength(SeismData,(N_CHAN+N_D_CHan));
setlength(MaxValues, (N_CHAN+N_D_CHan));
setlength(Mnozh, (N_CHAN+N_D_CHan));
...
end;
...
Procedure TSeysmBox.SetNCHan(const Inval:word);
var i : integer;
begin
setlength(ShowCHannels,0);
setlength(SeismData,0);
setlength(MaxValues,0);
setlength(Mnozh,0);
setlength(ShowCHannels,(Inval+N_D_CHan));
for i := 0 to Inval -1 +N_D_CHan do ShowChannels[i] := true;
setlength(SeismData,(Inval+N_D_CHan));
setlength(MaxValues, (Inval+N_D_CHan));
setlength(Mnozh, (Inval+N_D_CHan));
N_CHan := inval;
end;
Procedure TSeysmBox.SetNDCHan(const Inval:word);
var i : integer;
begin
setlength(ShowCHannels,0);
setlength(SeismData,0);
setlength(MaxValues,0);
setlength(Mnozh,0);
setlength(ShowCHannels,(Inval+N_CHan));
for i := 0 to N_CHan -1 +Inval do ShowChannels[i] := true;
setlength(SeismData,(Inval+N_CHan));
setlength(MaxValues, (Inval+N_CHan));
setlength(Mnozh, (Inval+N_CHan));
N_D_CHan := inval;
end;
...
← →
Юрий Зотов © (2005-03-02 13:57) [6]Забыл добавить - и проверяйте работу обновленного компонента на совершенно новом проекте.
← →
Reindeer Moss Eater © (2005-03-02 13:57) [7]Перенёс в Public, а свойство вообще исчезло, как в Design так и в Run time.
Это обман зрения.
← →
Юрий Зотов © (2005-03-02 14:03) [8]property N_CHannels: word read N_CHan write SetNCHan default 48;
property N_DChan: word read N_D_CHan write SetNDCHan default 2;
А потом - убить все старые DCU, все перекомпилировать и проверять на новом проекте. Если ошибка не исчезнет, поставить точки останова в обоих методах Set, запустить проект и пройти отладчиком, чтобы выяснить точное место ошибки.
← →
Reindeer Moss Eater © (2005-03-02 14:06) [9]Видимо он уже закомпилил компонент в пакет.
После чего меняет его код, и пересобирает проект, в ходе сборки которого пакет остается неизмененным.
Нарушил в общем важнейшую заповедь.
Не инсталить компонент в процессе его написания и отладки.
Отсюда и "обманы зрения".
← →
Ф-1 (2005-03-02 14:15) [10]Всем спасибо! Было два SeysmBox.DCU. В папке основного проекта и в папке пректа компонента. Всё убил, компонент скомпилял заново, вставил его заново в основную форму, в путях поиска сомпилятора указал папку с проектом компонента. Всё заработало!
>>Нарушил в общем важнейшую заповедь.
Не инсталить компонент в процессе его написания и отладки.<<
Дык, специфика такая. Программа пишется под железо. Появилась новая версия железа - компоненту стало нехватать свойств.
Ещё раз большое спасибо!
← →
pasha_golub © (2005-03-03 13:50) [11]Reindeer Moss Eater © (02.03.05 14:06) [9]
Вот честно, очень удивился написаному. У меня набор компонентов в пакете (установлен в ИДЕ), я их на лету меняю, потом перекомпилирую и все работает на "ура". И ни разу на грабли не наступал. Скажите, что я делаю не так? ;-)
Страницы: 1 вся ветка
Форум: "Компоненты";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.05 c