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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2013, 00:04   #1
hon
Форумчанин
 
Регистрация: 08.06.2011
Сообщений: 693
По умолчанию Компонент работает в run-time, но не работает в design-time

Написал компонент. Если создаю и присваиваю ему картинки в run-time работает, если в design-time, то Access Violation.
В чем проблема? Компилировал на Delphi 7.

Компонент:
Код:
unit ImageButton;

interface

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

type
   TImageButton=class(TImage)
   private
      { Private declarations }
      FPictureMouseEnter: TBitmap;
      FPictureStandart: TBitmap;
      FOnMouseLeave: TNotifyEvent;
      FOnMouseEnter: TNotifyEvent;
      procedure CMMouseEnter(var msg: TMessage);
         message CM_MOUSEENTER;
      procedure CMMouseLeave(var msg: TMessage);
         message CM_MOUSELEAVE;
      procedure SetFPictureStandart(Value: TBitmap);
   protected
      { Protected declarations }
      procedure DoMouseEnter; dynamic;
      procedure DoMouseLeave; dynamic;
   public
      { Public declarations }
      constructor Create(AOwner: TComponent); override;
   published
      { Published declarations }
      property PictureMouseEnter: TBitmap read FPictureMouseEnter write FPictureMouseEnter;
      property PictureStandart: TBitmap read FPictureStandart write FPictureStandart;
      property OnMouseEnter: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
      property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
   end;

procedure Register;

implementation

procedure Register;
begin
   RegisterComponents('My Components', [TImageButton]);
end;

constructor TImageButton.Create(AOwner: TComponent);
begin
   ShowMessage('Создание TImage');
   inherited Create(AOwner);
   ShowMessage('Создание FPIctureMouseEnter');
   FPictureMouseEnter:=TBitmap.Create;
   {ShowMessage('Очистка FPIctureMouseEnter');
      FPictureMouseEnter.FreeImage;}
   ShowMessage('Создание FPIctureStandart');
   FPictureStandart:=TBitmap.Create;
   {ShowMessage('Очистка FPIctureStandart');
      FPictureStandart.FreeImage;}
end;

{ Перехват событий }

procedure TImageButton.CMMouseEnter(var msg: TMessage);
begin
   DoMouseEnter;
end;

procedure TImageButton.CMMouseLeave(var msg: TMessage);
begin
   DoMouseLeave;
end;

{ Реализация }

procedure TImageButton.DoMouseEnter;
begin
   //   ShowMessage('Разделение данных FPictureMouseEnter с FPicture.Bitmap');
   Picture.Bitmap.Assign(FPictureMouseEnter);
   //   ShowMessage('Вызов доп. метода');
   if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
end;

procedure TImageButton.DoMouseLeave;
begin
   //   ShowMessage('Разделение данных FPictureStandart с FPicture.Bitmap');
   Picture.Bitmap.Assign(FPictureStandart);
   //   ShowMessage('Вызов доп. метода');
   if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);
end;

end.
P.S. ImageButton.Picture прошу не трогать!
hon вне форума Ответить с цитированием
Старый 19.02.2013, 10:24   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Не заметил проблем. Работает, если св-во Picture в design-time присвоить. В run-time тоже работает. Строку убрал
Код:
procedure SetFPictureStandart(Value: TBitmap);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.02.2013, 20:00   #3
hon
Форумчанин
 
Регистрация: 08.06.2011
Сообщений: 693
По умолчанию

Аватар, это строка лишняя, правда.
Я делаю так:
  1. Кладу ImageButton на форму
  2. В свойство PictureStandart загружаю картинку bmp
  3. Получаю Access Violation

У меня Delphi 7 Enterprise Edition. Компонент добавляю в пакет dclusr и компилирую его.
hon вне форума Ответить с цитированием
Старый 20.02.2013, 20:17   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Я использовал св-во Picture. А для PictureStandart нельзя в описании св-ва делать write FPictureStandart. Нужно назначить процедуру, а в ней загнать с помощью FPictureStandart.Assign картинку в FPictureStandart. Посмотрите как в исходниках TImage это реализовано
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как run-time создать от руки компонент? SovereignSun Общие вопросы Delphi 12 23.11.2011 16:30
Обработка событий компонент, созданных в Run-Time Рик Компоненты Delphi 1 29.03.2011 14:50
OpenDialog.InitialDir (design time) mutabor Общие вопросы Delphi 5 05.08.2010 16:04
Run time Err 9, а на моем ПК работает PX100 Microsoft Office Excel 3 01.06.2010 05:18
рисовать в design-time (Paint) NieL Общие вопросы Delphi 1 15.01.2009 16:55