Ошибка при компиляции своего компонента [Решено]

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ошибка при компиляции своего компонента [Решено]

Сообщение alaken » 27.04.2010 09:33:01

Пытаюсь создать свой компонент руководствуясь статьей с сайта "Создание визуальных компонент для Lazarus"
компиляция останавливается на строке
Код: Выделить всё
Include(FCloseButton.ComponentStyle, csSubComponent);

с ошибкой
xtabcontrol.pas(199,54) Error: Can't take the address of constant expressions

в чем проблема?
Последний раз редактировалось alaken 29.04.2010 07:38:47, всего редактировалось 1 раз.
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: Ошибка при компиляции своего компонента

Сообщение Vadim » 27.04.2010 10:52:29

alaken писал(а):Can't take the address of constant expressions

Это переводится примерно так:
"Не могу получить адрес константного выражения".
alaken писал(а):xtabcontrol.pas(199,54)

А Вы не могли бы сюда поместить строку 199 из указанного файла?
Vadim
долгожитель
 
Сообщения: 3749
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Ошибка при компиляции своего компонента

Сообщение alaken » 27.04.2010 11:29:49

могу, она в первом посте указана...
Код: Выделить всё
Include(FCloseButton.ComponentStyle, csSubComponent);


в позиции 54 находится csSubComponent эта константа описана в типе TComponentStyle
Код: Выделить всё
TComponentStyle = set of (csInheritable, csCheckPropAvail, csSubComponent,  csTransient);

тип описан в classesh.inc
в uses
uses
Classes
,LCLClasses...


однако лыжи не едут...
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: Ошибка при компиляции своего компонента

Сообщение Vadim » 27.04.2010 12:30:26

alaken
Вот что мне по этому поводу рассказал www.translate.ru :)
Эта ошибка может также быть отображена, если Вы пытаетесь передать свойство к переменному параметру.

Или, иными словами, константа передаётся в параметр функции, который обозначен как var.
Vadim
долгожитель
 
Сообщения: 3749
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Ошибка при компиляции своего компонента

Сообщение alaken » 27.04.2010 12:55:37

посмотрите пожалуйста статью (ссылка в первом посте) я делал абсолютно как показано там, причем тот пример из статьи тоже не компилится с похожей проблемой, вероятно механизм изменился, как правильно внедрять компоненты?
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: Ошибка при компиляции своего компонента

Сообщение Mr.Smart » 27.04.2010 13:13:01

alaken писал(а):
Код: Выделить всё
Include(FCloseButton.ComponentStyle, csSubComponent);

с ошибкой
xtabcontrol.pas(199,54) Error: Can't take the address of constant expressions

в чем проблема?

А вы не учли, то что свойство ComponentStyle только для чтения! Об этом вам косвенно хочет сообщить и компилятор.
Изменить данное свойство можно только в потомке от TComponent обратившись к защищённой переменной FComponentStyle!
Код: Выделить всё
Include(FComponentStyle, csSubComponent);
Mr.Smart
долгожитель
 
Сообщения: 1797
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Ошибка при компиляции своего компонента

Сообщение Vadim » 27.04.2010 13:19:04

alaken
Насколько я понял, свойство FCloseButton.ComponentStyle - только для чтения, а Вы пытаетесь изменить значение.
Попробуйте сделать так:
Код: Выделить всё
Include(FCloseButton.FComponentStyle, csSubComponent);
Vadim
долгожитель
 
Сообщения: 3749
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Ошибка при компиляции своего компонента

Сообщение FeodoR » 27.04.2010 13:31:21

Изменения в версии 2.4.0
alaken
Посмотри, какой из параметров передаётся как const/var, определи переменную соответствующего типа, задай ей нужное значение и засунь в процедуру. Должно сработать.
Аватара пользователя
FeodoR
новенький
 
Сообщения: 59
Зарегистрирован: 16.04.2010 12:11:34
Откуда: MSK, ЮАО

Re: Ошибка при компиляции своего компонента

Сообщение alaken » 27.04.2010 13:57:57

Vadim писал(а):alaken
Насколько я понял, свойство FCloseButton.ComponentStyle - только для чтения, а Вы пытаетесь изменить значение.
Попробуйте сделать так:
Код: Выделить всё
Include(FCloseButton.FComponentStyle, csSubComponent);


пишет:
xtabcontrol.pas(209,24) Error: identifier idents no member "FComponentStyle"


Добавлено спустя 42 секунды:
FeodoR писал(а):Изменения в версии 2.4.0
alaken
Посмотри, какой из параметров передаётся как const/var, определи переменную соответствующего типа, задай ей нужное значение и засунь в процедуру. Должно сработать.


не срабатывает...

Добавлено спустя 2 минуты 8 секунд:
для теста, похожий проект из статьи
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: Ошибка при компиляции своего компонента

Сообщение Mr.Smart » 27.04.2010 15:40:32

alaken писал(а):
Vadim писал(а):alaken
Насколько я понял, свойство FCloseButton.ComponentStyle - только для чтения, а Вы пытаетесь изменить значение.
Попробуйте сделать так:
Код: Выделить всё
Include(FCloseButton.FComponentStyle, csSubComponent);


пишет:
xtabcontrol.pas(209,24) Error: identifier idents no member "FComponentStyle"

А другое он и не должен писать т.к. данная переменная является protected и доступна только в потомках класса.
Для того чтобы установить значение переменной необходимо с начало унаследовать...
Код: Выделить всё
type
  THackButton = class(TButton) // Зависит от того к какому классу относится ваша переменная FCloseButton
   end;
...
  Include(THackButton(FCloseButton).FComponentStyle, csSubComponent);
...


Добавлено спустя 1 минуту 32 секунды:
з.ы. Всё должно быть объявлено в пределах одного модуля
Mr.Smart
долгожитель
 
Сообщения: 1797
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Ошибка при компиляции своего компонента

Сообщение alaken » 28.04.2010 08:04:49

спасибо за наводку об "обертке" класса.

посмотрел кучу исходников компонентов, нигде подобной конструкции нет...
может это уже не актуально или правильным будет делать как написано в статье?

отрывок статьи:
Далее создадим сам ProgressBar и укажем, что он является встроенным компонентом. Это позволит сохранять его свойства вместе со свойствами основного компонента в файле определения формы.
Код: Выделить всё
FProgressBar := TProgressBar.Create(Self);
Include(FProgressBar.ComponentStyle, csSubComponent);
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: Ошибка при компиляции своего компонента

Сообщение Mr.Smart » 28.04.2010 09:50:29

alaken писал(а):посмотрел кучу исходников компонентов, нигде подобной конструкции нет...
может это уже не актуально или правильным будет делать как написано в статье?

Почему не актуально? Это обычная конструкция ООП. Если вы не встретили данный трюк в исходниках компонетов, это не означает, что так делать нельзя.

Добавлено спустя 3 минуты 28 секунд:
В данной статье есть ошибка, на которую вы как раз и наткнулись.
Mr.Smart
долгожитель
 
Сообщения: 1797
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Ошибка при компиляции своего компонента

Сообщение alaken » 28.04.2010 10:33:35

Mr.Smart писал(а):...В данной статье есть ошибка, на которую вы как раз и наткнулись.

это уже вторая статья с ошибкой, первая статья была о TProcess это очень плохо...

к тому же не радостная новость: "...в отчете Корус Кнсалтинг по развитию и внедрению свободного ПО в госструктуры Лазарус не рекомендован к использованию как не достаточно зрелый проект..."
alaken
постоялец
 
Сообщения: 221
Зарегистрирован: 18.02.2010 09:02:13

Re: Ошибка при компиляции своего компонента

Сообщение GrayEddy » 28.04.2010 11:38:56

Можно ссылочку на эту новость?

Так. нашел pdf-файл с этим отчетом, гугль рулит, но это по состоянию на 2008 г.
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Re: Ошибка при компиляции своего компонента

Сообщение Vadim » 28.04.2010 11:58:31

alaken писал(а):Лазарус не рекомендован к использованию как не достаточно зрелый проект..."

Ах они змеи, сидящие на четвереньках! :)
Vadim
долгожитель
 
Сообщения: 3749
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 2

Рейтинг@Mail.ru