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

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2008, 12:34   #1
Deight
Бредовый
Форумчанин
 
Аватар для Deight
 
Регистрация: 15.11.2008
Сообщений: 285
По умолчанию Создать класс(компонент) внутри компонента

Подскажите пожалуйста, например нужно создать компонент на основе panel, на ней расположить 2 панели но у которых обрабатывается mouseenter mouseleave. Я тут по быстрому написал код чтоб понятнее было о чем я
Код:
unit D8Skn;

interface

uses
  SysUtils, Messages, Classes, Forms, Graphics, Controls, ExtCtrls, Windows;

type
TD8CustomPanel = class(TCustomPanel)
  private
  FOnMouseLeave:TNotifyEvent;
  FOnMouseEnter:TNotifyEvent;
  procedure CMMouseLeave(var msg:TMessage); message CM_MOUSELEAVE;
  procedure CMMouseEnter(var msg:TMessage); message CM_MOUSEENTER;
  protected
  public
  published
  property OnMouseLeave:TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
  property OnMouseEnter:TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
  end;

type
TD8Skn = class(TCustomPanel)
  private
  D8CustomPanel1:TD8CustomPanel;
  D8CustomPanel2:TD8CustomPanel;
  protected
  public
  constructor Create(AOwner: TComponent); override;
  published
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('D-EMP', [TD8Skn]);
end;

constructor TD8Skn.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 D8CustomPanel1:=TD8CustomPanel.Create(AOwner);
 D8CustomPanel1.Parent:=TForm(AOwner);
 D8CustomPanel2:=TD8CustomPanel.Create(AOwner);
 D8CustomPanel2.Parent:=TForm(AOwner);
end;

end.
когда скидываю на форму компонент до написания кода а потом запускаю все нормально, но как перекомпилирую при запуске программы возникает ошибка ...'Class TD8CustomPanel not found'... Что делать?
Чем точнее и проще задан вопрос, тем проще на него получить точный ответ.
Deight вне форума Ответить с цитированием
Старый 20.12.2008, 12:37   #2
Deight
Бредовый
Форумчанин
 
Аватар для Deight
 
Регистрация: 15.11.2008
Сообщений: 285
По умолчанию

Забыл написать процедуры обработки mouseenter и mouseleave, но это не важно, вопрос не в этом заключается.
Чем точнее и проще задан вопрос, тем проще на него получить точный ответ.
Deight вне форума Ответить с цитированием
Старый 20.12.2008, 14:18   #3
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

У Вас форма является владельцем объектов D8CustomPanel1/D8CustomPanel2. Поэтому эти компоненты тоже пишутся в .dfm. Чтобы их считать нужен класс, а он не зарегистрирован.

Это причина ошибки. Но это не все.

Можно, конечно зарегистрировать класс. Он будет читаться. Но догда в Design time можно будет легко удалить любую из панелей, которые вроде-бы объявлены private. Еще будут проблемы с лишними вызовами Create, но не буду углубляться.

Можно сделать по другому. Убрать владение и удалять панели самому.
Код:
 D8CustomPanel1:=TD8CustomPanel.Create(nil);
Но в этом случае в Design-Time с панелями ничего нельзя будет сделать (например переместить).

А вообще то, что Вы пытаетесь сделать не простая задача. Посмотрите VCL - как со своими страницами управляется TPageControl. Я бы не стал морочить голову, а создал этот компонент в run-time.

------------------
Еще вариант. Обрабатывать момент вставки/удаления компонента TD8Skn на форму (в design-time) и там создавать/удалять панели TD8CustomPanel. Там же можно будет запомнить ссылки на них и работать с этими ссылками. TD8CustomPanel придется тоже сделать компонентом и зарегистрировать.

Последний раз редактировалось alexBlack; 20.12.2008 в 14:48.
alexBlack вне форума Ответить с цитированием
Старый 20.12.2008, 14:46   #4
Deight
Бредовый
Форумчанин
 
Аватар для Deight
 
Регистрация: 15.11.2008
Сообщений: 285
По умолчанию

Спасибо за ответ, я написал код чтоб просто было понятно о чем я, на самом деле вместо главной панели не визуальный компонент. А дополнительные панели ставятся на форму. Если можно как-то сделать что б они ставились не во время скидывания компонента на форму, а во время запуска программы и без всяких ошибок то подскажите как это сделать. Может пример где есть или статья, я не нашел.
Чем точнее и проще задан вопрос, тем проще на него получить точный ответ.
Deight вне форума Ответить с цитированием
Старый 20.12.2008, 15:02   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Deight Посмотреть сообщение
.... Если можно как-то сделать что б они ставились не во время скидывания компонента на форму, а во время запуска программы и без всяких ошибок то подскажите как это сделать. Может пример где есть или статья, я не нашел.
Можно проверять в методе Loaded:

Код:
procedure TD8Skn.Loaded;
begin
   inherited Loaded;

   ShowMessage(ParamStr(0));
   // Пока форма разрабатывается ParamStr(0) = '...delphi32.exe' или 'bds.exe' (в зависимости от версии)
   // А когда запускается Ваша программа, то - имя Вашего exe-файла 
   // Вот тогда и создаем дополнительные панели
end;
alexBlack вне форума Ответить с цитированием
Старый 20.12.2008, 16:04   #6
Deight
Бредовый
Форумчанин
 
Аватар для Deight
 
Регистрация: 15.11.2008
Сообщений: 285
По умолчанию

Спасибо. Мне б статью почитать какую-нибудь про создание компонент внутри компонент.
Чем точнее и проще задан вопрос, тем проще на него получить точный ответ.
Deight вне форума Ответить с цитированием
Старый 21.12.2008, 09:26   #7
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от Deight Посмотреть сообщение
Спасибо. Мне б статью почитать какую-нибудь про создание компонент внутри компонент.
Да ничего сложного там нет
Вложения
Тип файла: rar componentCreation.rar (170.5 Кб, 58 просмотров)
Altera вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как в Делфи создать кнопочку "ОК". подробности внутри темы.... Кристина2008 Общие вопросы Delphi 2 09.12.2008 22:49
Heeelp! kak создать класс? AndreyN Общие вопросы C/C++ 2 08.10.2008 14:49
Как программно удалить компонент от формы или другого компонента (контейнера)? SkAndrew Общие вопросы Delphi 3 27.05.2008 15:20
создать свойство компонента дядя Компоненты Delphi 2 11.05.2008 23:23
Создать класс – треугольник, заданный своими координатами (точками). jenja Общие вопросы Delphi 5 18.04.2008 07:50