Class tbitmapimage not found ошибка

I want to add custom designed buttons to my Inno Script with the TBitmapImage class.

My Inno Setup script is compiling just fine but the bitmap isn’t showing in the form. I looked into any possibilities but can’t seem to find the error I made. That’s how the TBitmapImage part looks like atm:

procedure CreateMuteButton(ParentForm: TSetupForm);
var
  MuteImage: TBitmapImage;
  BitmapFileName: String;
begin
  BitmapFileName := ExpandConstant('{tmp}muteBtn.bmp');
  ExtractTemporaryFile(ExtractFileName(BitmapFileName));
  MuteImage := TBitmapImage.Create(ParentForm);
  MuteImage.Bitmap.LoadFromFile(BitmapFileName);
  MuteImage.Cursor := crHand;
  MuteImage.OnClick := @MuteButtonOnClick;
  MuteImage.Parent := ParentForm;
  MuteImage.Left := 45;
  MuteImage.Top := 80
  MuteImage.Width := 38;
  MuteImage.Height := 50;
end;

procedure InitializeWizard();
var
  val: Integer;
begin
  CreateMuteButton(WizardForm);
  (...)
end;

Martin Prikryl's user avatar

asked May 27, 2012 at 20:49

timonsku's user avatar

3

The WizardForm client area itself is only visible below the bottom bevelled line. Above that is WizardForm.InnerPage, and the individual/current Wizard pages in the middle contained in a private InnerNotebook.

This puts the image to the left of the pages:

MuteImage := TBitmapImage.Create(WizardForm.InnerPage);
MuteImage.Parent := WizardForm.InnerPage;
MuteImage.Left := 0;
{ Uses the top of the wizard pages to line up }
MuteImage.Top := WizardForm.SelectDirPage.Parent.Top; 

Whereas this puts it in the bottom section:

MuteImage := TBitmapImage.Create(WizardForm);
MuteImage.Parent := WizardForm;
MuteImage.Left := 0;
{ Below the inner page }
MuteImage.Top := WizardForm.InnerPage.Height; 

Martin Prikryl's user avatar

answered May 28, 2012 at 10:32

Deanna's user avatar

DeannaDeanna

23.8k7 gold badges71 silver badges155 bronze badges

1

1 / 1 / 0

Регистрация: 30.04.2012

Сообщений: 124

1

25.03.2013, 17:16. Показов 3532. Ответов 11


Студворк — интернет-сервис помощи студентам

Ошибка при запуске проекта: "Class TImage not found"



0



143 / 143 / 39

Регистрация: 17.08.2012

Сообщений: 411

25.03.2013, 18:03

2

rita_0705, Ясно же написано — «Класс TImage не найден»…



0



1 / 1 / 0

Регистрация: 30.04.2012

Сообщений: 124

25.03.2013, 19:11

 [ТС]

3

как исправить ошибку?=(



0



143 / 143 / 39

Регистрация: 17.08.2012

Сообщений: 411

25.03.2013, 19:15

4

rita_0705, .Вы удалили у компонента имя в ObjectInspector.



1



Mawrat

13095 / 5876 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

25.03.2013, 19:15

5

rita_0705, подключи модуль ExtCtrls:

Delphi
1
2
uses
  ExtCtrls;

В этом модуле определён класс TImage.



0



Житель Земли

2999 / 2998 / 391

Регистрация: 26.07.2011

Сообщений: 11,459

Записей в блоге: 1

25.03.2013, 19:21

6

Цитата
Сообщение от Mawrat
Посмотреть сообщение

подключи модуль ExtCtrls

дык если положить на форму TImage, он сам подключится.

Цитата
Сообщение от rita_0705
Посмотреть сообщение

как исправить ошибку?=(

вообще-то, желательно бы взглянуть на код



1



Mawrat

13095 / 5876 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

25.03.2013, 19:28

7

Цитата
Сообщение от DenNik
Посмотреть сообщение

дык если положить на форму TImage, он сам подключится.

Да, верно. vampire6666, правильно сказал — значение свойства Image.Name установлено равным пустой строке.

Добавлено через 1 минуту
rita_0705, в дизайнере формы выдели компонент TImage и в инспекторе объектов (F11) для него задай не пустое имя — в поле Name. — Возможно, имя должно быть таким: Image1 или Image2 и т. п.

Добавлено через 1 минуту
Например, если имеем:

Delphi
1
2
3
4
5
6
7
8
9
type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

То для Image1 в поле Name надо задать такое же имя: Image1.Name = Image1 — это в инспекторе объектов надо сделать.



0



Житель Земли

2999 / 2998 / 391

Регистрация: 26.07.2011

Сообщений: 11,459

Записей в блоге: 1

25.03.2013, 19:29

8

Цитата
Сообщение от Mawrat
Посмотреть сообщение

начение свойства Image.Name установлено равным пустой строке.

не, в этом случае такая ошибка не вылезет, вылезет вот что: Undeclared identifier: ‘Image1’.
там скорее всего, действительно не подключен нужный модуть, а происходит обращение к Имагу, которого вообще нет на форме (ни одного), причем обращение не по имени, а к экземпляру класса.



0



Mawrat

13095 / 5876 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

25.03.2013, 19:41

9

DenNik, всё-таки скорее всего пустое имя задано. Я сейчас проверил — кинул на форму Image1 : TImage. Потом стёр имя у него. И при запуске программы возникла точно такая же ошибка.

Добавлено через 9 минут
rita_0705, посмотрел проект. В общем исправить надо вот как. Надо открыть модуль Unit19 и там подправить:

Delphi
1
2
3
type
  TForm19 = class(TForm)
    Image1 : TImage; //Вот эту строку надо добавить.



1



Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32593 / 21062 / 8134

Регистрация: 22.10.2011

Сообщений: 36,335

Записей в блоге: 8

25.03.2013, 19:44

10

Цитата
Сообщение от DenNik
Посмотреть сообщение

не, в этом случае такая ошибка не вылезет, вылезет вот что: Undeclared identifier: ‘Image1’.

Только если в коде есть обращение к этому Image1. Иначе программа скомпилируется, но не запустится, что и произошло.



0



Житель Земли

2999 / 2998 / 391

Регистрация: 26.07.2011

Сообщений: 11,459

Записей в блоге: 1

25.03.2013, 19:44

11

Цитата
Сообщение от Mawrat
Посмотреть сообщение

кинул на форму Image1 : TImage. Потом стёр имя у него. И при запуске программы возникла точно такая же ошибка.

нуу, если так, то да возникает вопрос, как такое случилось?



0



Mawrat

13095 / 5876 / 1706

Регистрация: 19.09.2009

Сообщений: 8,808

25.03.2013, 19:52

12

Цитата
Сообщение от DenNik
Посмотреть сообщение

возникает вопрос, как такое случилось?

Разное может случиться. Но оказалась, что ситуация другая. Хотя ошибка с таким же текстом появляется. Вернее там 2 исключения возникают с разными текстами.
Вот что было:

Delphi
1
2
3
4
type
  TForm19 = class(TForm)
    Image1 : TImage; //Вот эта строка оказалась удалена.
...



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

25.03.2013, 19:52

Помогаю со студенческими работами здесь

Часто, при запуске проекта, выходит эта ошибка «[DCC Fatal Error] F2039 Could not create output file ‘Project1.exe'»
После создания проекта при его запуске часто выходит эта ошибка " F2039 Could not create output…

Exception class EClassNotFound with message ‘Class TEdit not found’ при запуске приложения
при запуске выдает ошибку Project Project1.exe raised exception class EClassNotFound with message…

Ошибка в строке 97: «incompatible types», а в 99 ошибка: «identifier expected but ‘^’ found», как исправить?
var
tmp,tmp1,tmp2:point;
begin
tmp:=head;
while tmp <> nil do
begin
tmp1:=…

При запуске выводится сообщение ‘Class «TOpenGLControl» not found’
Установлен пакет LazOpenGLContext 0.0.1

Cледующая программа компилируется ,
но при запуске…

Исключение: «Class EresNotFound with message ‘Resource TForm1 not found'» при запуске программы
Народ, как думаете, почему Делфи компилирует программу нормально, однако при ее запуске выскакивает…

Ошибка при запуске программы: exception class ‘EConvertError’ with message «» is an invalid integer
Подскажите пожалуйста что я не так сделал, как исправить ошибку которая появляется при…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

12

Делал все на основе этой статьи: ссылка

Но в логах пишет

Error: Class 'appmodelsCountry' not found in /home/artyom/www/localhost/controllers/CountryController.php:19

Мой Country.php

<?php
/**
 * Created by PhpStorm.
 * User: artyom
 * Date: 09.08.17
 * Time: 14:45
 */

namespace appmodels;

use yiidbActiveRecord;

class Country extends ActiveRecord
{
}

Мой CountryController.php

<?php
/**
 * Created by PhpStorm.
 * User: artyom
 * Date: 09.08.17
 * Time: 14:48
 */

namespace appcontrollers;

use yiiwebController;
use yiidataPagination;
use appmodelsCountry;

class CountryController extends Controller
{
    public function actionIndex()
    {
        $query = Country::find();

        $pagination = new Pagination([
            'defaultPageSize' => 5,
            'totalCount' => $query->count(),
        ]);

        $countries = $query->orderBy('name')
            ->offset($pagination->offset)
            ->limit($pagination->limit)
            ->all();

        return $this->render('index', [
            'countries' => $countries,
            'pagination' => $pagination,
        ]);
    }
}

Мой файл в views/country/index.php

<?php
/**
 * Created by PhpStorm.
 * User: artyom
 * Date: 09.08.17
 * Time: 14:51
 */

use yiihelpersHtml;
use yiiwidgetsLinkPager;
?>
    <h1>Countries</h1>
    <ul>
        <?php foreach ($countries as $country): ?>
            <li>
                <?= Html::encode("{$country->name} ({$country->code})") ?>:
                <?= $country->population ?>
            </li>
        <?php endforeach; ?>
    </ul>

<?= LinkPager::widget(['pagination' => $pagination]) ?>

Может автолодеру нужно что-то сказать?


Форум программистов Vingrad

Модераторы: Snowy, Alexeis, MetalFan

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> Глюк с копированием Bitmap, :-| 

:(

   

Опции темы

Darksquall
  Дата 3.5.2006, 23:12 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2004
Где: Москва

Репутация: нет
Всего: 4

Как считаете почему не работает вот это?

Код

bmp2:=Tbitmap.create;
bmptmp:=Tbitmap.create;

bmp2:=image2.Picture.Bitmap;

Str:=TMemorystream.Create;

bmp2.SaveToStream(Str);
bmptmp.LoadFromStream(Str);

image3.Picture.Bitmap:=bmptmp;

ошибка не вылетает но копирования в image3 не происходит.
правда ошибка вылетает здесь

Код

bmptmp.Free;
bmp2.Free;

но работает это.

Код

bmp2:=Tbitmap.create;
bmptmp:=Tbitmap.create;

bmp2:=image2.Picture.Bitmap;

bmp2.SaveTofile('C:1.bmp');
bmptmp.LoadFromfile('C:1.bmp');

image3.Picture.Bitmap:=bmptmp;

как еще можно скопировать один битмап в другой? 

p.s. Bmp1:=bmp2;
а также Assign () не подходят. 

———————

www.bankcards.su

PM WWW ICQ   Вверх
Romikgy
Дата 3.5.2006, 23:34 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Любитель-программер
****

Профиль
Группа: Участник Клуба
Сообщений: 7325
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: нет
Всего: 146

Цитата(Darksquall @  3.5.2006,  22:12 Найти цитируемый пост)
p.s. Bmp1:=bmp2;
а также Assign () не подходят. 

интересно почему?
1. попиксельно можно 
2. память скопировать 

———————

Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности.

smile

PM   Вверх
Darksquall
Дата 4.5.2006, 00:17 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2004
Где: Москва

Репутация: нет
Всего: 4

Romik можно попиксельно,как угодно только что бы быстро.
А эти способы я так понимаю не копируют,а всего лишь указатели меняют в памяти, а при изменении памяти во всех переменных тоже будет изменение картинки, а мне этого не нужно. Битмап покрутил немного вроде так или я не прав? 

———————

www.bankcards.su

PM WWW ICQ   Вверх
Kesh
Дата 4.5.2006, 01:47 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
****

Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 1
Всего: 54

Код

TmpBmp.Canvas.StretchDraw (Rect (0, 0, BMP2.width, Bmp2.Height), Bmp2);

 

———————

user posted image

PM MAIL WWW ICQ Skype   Вверх
Snowy
Дата 4.5.2006, 09:15 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
****

Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484

Код

bmp2.SaveToStream(Str);    
Str.Position := 0;
bmptmp.LoadFromStream(Str);

 

PM MAIL   Вверх
Alexeis
Дата 4.5.2006, 10:28 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Амеба
Group Icon

Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459

Darksquall, Конечно! после записи в поток внутренний указатель потока смещается в конец. Рекомендуется его перед любой записью и чтением устанавливать в нуль.

Цитата(Darksquall @  3.5.2006,  23:17 Найти цитируемый пост)
А эти способы я так понимаю не копируют,а всего лишь указатели меняют в памяти

 — про assign это не совсем так, дело в том что при выполнении этого метода скорее всего будет то что вы описали, но после первой же попытки модифицировать любой из битмапов (или удалить), программа создаст две различные независимые копии битмапов для каждого из объектов.

———————

Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

PM ICQ Skype   Вверх
Darksquall
Дата 4.5.2006, 10:35 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Опытный
**

Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2004
Где: Москва

Репутация: нет
Всего: 4

Благодарю, совсем работа замучала, забыл что Position в стриме в нуль устанавливать нужно :-) 

———————

www.bankcards.su

PM WWW ICQ   Вверх
Snowy
Дата 4.5.2006, 10:35 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
****

Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484

Цитата(alexeis1 @  4.5.2006,  10:28 Найти цитируемый пост)
про assign это не совсем так, дело в том что при выполнении этого метода скорее всего будет то что вы описали, но после первой же попытки модифицировать любой из битмапов (или удалить), программа создаст две различные независимые копии битмапов для каждого из объектов.

Без всяких первых попыток.
Assign — метод унаследованный от TPeristent.
Производит копирование всех property из одного объекта в другой.
(Естественно, объекты должны быть совместимы от младшего к старшему. Но совместимость не касается данной темы.)  

PM MAIL   Вверх
Alexeis
Дата 4.5.2006, 10:53 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Амеба
Group Icon

Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459

Snowy, но изображение является указателем на область памати не знаю как копируется свойство 
property ScanLine[Row: Integer]: Pointer,
но подозреваю, что копируется только указтель на память, и вместе с тем счетчик ссылок увеличится на единицу, и только при попытке изменить изображение программа должна делать действительную копию(токова концепция Delphi). Но это лишь мое предположение… 

———————

Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

PM ICQ Skype   Вверх
Snowy
Дата 4.5.2006, 11:06 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
****

Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484

Сам битмап является пропертёй.
Соответственно при Assign у приёмника создается новый TBitmap.
А содержимое изображения переносится уже при помощи WinAPI (вероятно через BitBlt или т.п. ).
Это уже забота класса — перенести корректно все данные.
Вот, кстати из описаловы:

Цитата
      Assign — Copys the contents of the given TPicture.  Used most often in
        the implementation of TPicture properties.

 

PM MAIL   Вверх
Alexeis
Дата 4.5.2006, 11:19 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Амеба
Group Icon

Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459

Snowy, чтож с этим не поспоришьsmile, но я имел ввиду другую ситуацию.

Код

bmp1:=Tbitmap.create;    
bmp2:=Tbitmap.create;
bmp1.Assign(bmp2);

Или в этом случае тоже самое?

Добавлено @ 11:26 
Цитирую код VCL метода assign TBitmap

Цитата
FImage := TBitmap(Source).FImage;

Это очень похоже на простое копирование внутреннего адреса изображения. 

FImage объявлен как объект класса TBitmapImage

дальше идет

Код

        FTransparent := TBitmap(Source).FTransparent;
        FTransparentColor := TBitmap(Source).FTransparentColor;
        FTransparentMode := TBitmap(Source).FTransparentMode;

  

Это сообщение отредактировал(а) alexeis1 — 4.5.2006, 11:29

———————

Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

PM ICQ Skype   Вверх
Snowy
Дата 4.5.2006, 12:15 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
****

Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484

Хм. И правда.
Оказывается там внутрях хитрая система референсов.
Правда незнаю, насколько она оправдана. Но ты прав… 

PM MAIL   Вверх



















Ответ в темуСоздание новой темы
Создание опроса
Правила форума «Delphi: Звук, графика и видео»
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) — крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »
От:

KSN

 
Дата:  27.12.04 13:46
Оценка:

Собираю проект из нескольких lib-файлов. Проект нормально компилируется, но в ходе работы приложения при запуске формы, реализованной в одном из lib-файлов, получаю сообщение class TDBText not found. Обычно это сообщение появляется, если я использовал какую-то компоненту (в данном случае TDBText) на форме, но стёр строку include для неё. Либо не делаю #pragma link на obj-файл, в котором есть эта компонента. Но!
В библиотеке, которая вызывает названную ошибку, не используется компонента TDBText, её вообще там нет!

Для эксперимента положил на форму TDBText. Тогда получил сообщение class TDBGrid not found. Эта компонента тоже не используется в форме.
Что за фигня такая, кто знает. Как можно побороть её?

Успехов
Кабаев Сергей

От:

Softwarer

http://softwarer.ru
Дата:  27.12.04 14:00
Оценка:

Здравствуйте, KSN, Вы писали:

KSN>Для эксперимента положил на форму TDBText. Тогда получил сообщение class TDBGrid not found. Эта компонента тоже не используется в форме.

KSN>Что за фигня такая, кто знает. Как можно побороть её?

Хм. Может ли быть так, что на эти классы как-то завязан родительский класс формы?

Собственно это сообщение является результатом вызова FindClass (в Delphi; думаю, в билдере то же самое). А сама эта подпрограмма может быть вызвана явно, а кроме того, активно вызывается при загрузке классов — можно посмотреть по исходникам RTL все места.

От:

Dimentiy

Россия

 
Дата:  27.12.04 15:35
Оценка:

Здравствуйте, KSN, Вы писали:

KSN>Что за фигня такая, кто знает. Как можно побороть её?

Это сообщение выдаётся, когда с помощью RTTI пытаются создать некий объект по имени класса (например, при чтении dfm-ресурса и воссоздании по нему формы/datamodule).

Нормально при инициализации приложения происходят вызовы RegisterClass, строится RTTI структура и в этом окружении приложение уже работает. Некоторыми действиями можно нарушить эту последовательность — как простой пример, засунуть в initialization секцию модуля какой-то код, которому уже нужна RTTI информация. Или иногда любят люди понапихать логики до вызова Application.Run.

Побороть можно двумя путями:
— Найти, где нарушается «правильная» последовательность инициализации (может быть долго)
— Просто вызвать RegisterClass(class_name) где-нибудь в самом начале выполнения программы (идеологически криво, но чаще работает).

Это всё написано для Delphi, думаю что в Builder всё ровно так же.
Удачи.

От:

Sergei I. Gorelkin

Россия

 
Дата:  27.12.04 19:39
Оценка:

+1

Здравствуйте, Dimentiy, Вы писали:

D>Это сообщение выдаётся, когда с помощью RTTI пытаются создать некий объект по имени класса (например, при чтении dfm-ресурса и воссоздании по нему формы/datamodule).


D>Нормально при инициализации приложения происходят вызовы RegisterClass, строится RTTI структура и в этом окружении приложение уже работает. Некоторыми действиями можно нарушить эту последовательность — как простой пример, засунуть в initialization секцию модуля какой-то код, которому уже нужна RTTI информация. Или иногда любят люди понапихать логики до вызова Application.Run.


D>Побороть можно двумя путями:

D>- Найти, где нарушается «правильная» последовательность инициализации (может быть долго)
D>- Просто вызвать RegisterClass(class_name) где-нибудь в самом начале выполнения программы (идеологически криво, но чаще работает).

Позволю себе немного Вас поправить.
RTTI не строится при инициализации приложения — ее формирует компилятор. RTTI-таблица класса содержит, помимо прочего, список published свойств этого класса со ссылками на типы этих свойств. Поэтому для тех классов, на которые ссылается RTTI, вызывать RegisterClass не обязательно — они могут быть найдены путем просмотра RTTI. Этим занимается функция Classes.GetFieldClass(). А она, если обламывается, вызывает FindClass() для поиска в глобальной таблице классов (ClassList) и таблице псевдонимов классов (ClassAliasList). И только в случае отсутствия классов в обоих таблицах получаем EClassNotFound.

RegisterClass() нужно вызывать только для «нестандартных» классов, например, TMenuItem, который переопределяет GetChildren() для перечисления вложенных пунктов меню — так, что по .dfm получается будто бы он имеет множество свойств типа самого себя, а реально вложенные TMenuItem содержатся в FItems: TList, который вообще не является наследником TPersistent и поэтому не может быть записан в dfm.

Самый простой способ получить class not found — это перенести автоматически созданное при бросании компонента на форму (суть published) объявление свойства в одну из private, protected или public секций. Либо пытаться грузить dfm ресурс, не соответствующий форме/датамодулю.

А методы борьбы — правильные. Хотя я бы порекомендовал напрячься и решить вопрос первым из указанных способов. Потому что вызов RegisterClass приведет с тому, что класс найдется и создастся объект соответствующего типа — суть хорошо прикрытые листвой грабли, на которые рано или поздно кто-то наступит.

Прошу прощения за несколько сумбурное изложение — новогоднее настроение и полбутылки мартини, однако…

От:

Dimentiy

Россия

 
Дата:  27.12.04 21:39
Оценка:

Здравствуйте, Sergei I. Gorelkin, Вы писали:

SIG>Позволю себе немного Вас поправить.

SIG>…

Э-э-э… Полностью согласен!
Строго говоря, да — RTTI — это конечно же именно то, что генерит компилятор.

SIG>Прошу прощения за несколько сумбурное изложение — новогоднее настроение и полбутылки мартини, однако…

Если как мартини и повлияло — то только тем, что было не в лом описывать всё целиком

От:

KSN

 
Дата:  28.12.04 07:41
Оценка:

Здравствуйте, Dimentiy, Вы писали:

D>Здравствуйте, Sergei I. Gorelkin, Вы писали:


SIG>>Позволю себе немного Вас поправить.

SIG>>…

D>Э-э-э… Полностью согласен!

D>Строго говоря, да — RTTI — это конечно же именно то, что генерит компилятор.

SIG>>Прошу прощения за несколько сумбурное изложение — новогоднее настроение и полбутылки мартини, однако…



D>Если как мартини и повлияло — то только тем, что было не в лом описывать всё целиком

Ага, понятно почему появляется сообщение об ошибке.

Но по-прежнему непонятно, при чем здесь классы TDBText, TDBGrid если их на форме нет. И в библиотеке, в которую включена форма, их тоже нет.
Раньше эти классы использовались в форме. Впоследствии я отредактировал вручную dfm-файл и заменил TDBGrid на TDBGridEh, а все TDBText убрал с формы. Сейчас никаких следов от этих компонент в проекте не осталось, (Искал контекстным поиском по всем файлам проекта), Так почему же они вылезают при инициализации формы?

Успехов
Кабаев Сергей

От:

Dimentiy

Россия

 
Дата:  28.12.04 08:12
Оценка:

Здравствуйте, KSN, Вы писали:

KSN>Но по-прежнему непонятно, при чем здесь классы TDBText, TDBGrid если их на форме нет. И в библиотеке, в которую включена форма, их тоже нет.

Но чудес-то не бывает.

От:

KSN

 
Дата:  28.12.04 08:16
Оценка:

Здравствуйте, Dimentiy, Вы писали:

D>Здравствуйте, KSN, Вы писали:


D>Но чудес-то не бывает.

Возразить сложно

Успехов
Кабаев Сергей

От:

KSN

 
Дата:  28.12.04 09:35
Оценка:

Здравствуйте, KSN, Вы писали:

KSN>Здравствуйте, Dimentiy, Вы писали:


D>>Здравствуйте, KSN, Вы писали:


D>>Но чудес-то не бывает.


KSN>Возразить сложно

Нашлась ошибка. Версия насчет кривого dfm-файла оказалась верной. В директории проекта лежала старая версия dfm-a, она-то и подлинковывалась в проект при сборке.

Успехов
Кабаев Сергей

Подождите ...

Wait...

  • Переместить
  • Удалить
  • Выделить ветку

Пока на собственное сообщение не было ответов, его можно удалить.

  • Class jformfieldlist not found ошибка джумла
  • Clash royale ошибка подключения к серверу
  • Clas 24ff ошибка 302
  • Clack ws1tc ошибка e4
  • Clack ws1ci ошибка 102