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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2013, 23:07   #1
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию Наследование класса, ошибка при inherited.

Занимаюсь все той же кнопкой PNG, только уже на основе TImage, так как предыдущая реализация вешала цп на 80-90%, решил не мудрить и покурил про классы и наследования.

Код:
type tPNGbutton = class(timage)
private
  pngN, pngM, pngP, pngO:tpngimage;
  n:integer;
  procedure CopyPNG(const PNGfrom, PNGto: TPNGimage; const Rfrom, Rto: TRect);
published
  Constructor create(atexture:string; obj:tcomponent);
  Destructor free;
end;
Код:
constructor tpngbutton.create(atexture:string; obj:tcomponent);
var pngbuf:tpngimage; m:integer;
begin
inherited create(obj);//ERROR AV
  pngN:=tpngimage.Create;
  pngM:=tpngimage.Create;
  pngP:=tpngimage.Create;
  pngO:=tpngimage.Create;
...
end;
Почему AV? В obj передаю форму.
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 19.04.2013, 00:57   #2
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Так проблема отпала. Оказывается создавал объект неправильно.
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 19.04.2013, 01:48   #3
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Появилась новая проблема. Не получается заменить MouseMove, чтоб выполнялось мое действие.
Код:
type tPNGbutton = class(timage)
private
  acaption:string;
  pngN, pngM, pngP, pngD:tpngimage; //фон
  n:integer;
  procedure CopyPNG(const PNGfrom, PNGto: TPNGimage; const Rfrom, Rto: TRect);
  procedure CopyPNGframe(const PNGfrom, PNGto: TPNGimage; const Rfrom, Rto: TRect);
  procedure setcapt(const Value: String);
  procedure recaption;
protected
  procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
published
  Constructor create(obj:tcomponent; atexture:string; aw,ah:integer);
  Destructor free;
public
  property caption :string read acaption write setcapt;
end;
pngM содержит несколько другое изображение, но оно не отображается.
Код:
procedure tPNGbutton.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  picture.Bitmap.Assign(pngM);
  picture.Bitmap.Canvas.Brush.Style := bsClear;
  picture.Bitmap.Canvas.TextOUT(round((width/2)-(picture.Bitmap.Canvas.TextWidth(acaption)/2)),round((height/2)-(picture.Bitmap.Canvas.Textheight(acaption)/2)),acaption);
end;
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 19.04.2013, 02:27   #4
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

alextrof94, а вы попробуйте от TPanel унаследоваться, как это сделал я:

Код:
TWinBase = class(TPanel)
// это процедура, обрабатывающая сообщение от винды
private // она должна быть видима только в этом классе
procedure MsgMouseMove  (var Message:TWMMouse); message WM_MOUSEMOVE;

// а это - моя процедура, в которой происходит обработка события
protected // видима во всех наследниках
procedure MouseMove(X,Y:integer);   virtual; // она будет перекрываться в наследниках
end;

implementation

procedure TWinBase.MsgMouseMove(var message: TWMMouse);
begin
// здесь только переправляем событие в соотв. процедуру и все.
MouseMove(message.XPos, message.YPos);
end;


procedure TWinBase.MouseMove(X,Y:integer);  
begin
// реакция вашего компонента
// эта процедура будет вызываться в случае сообщения WM_MOUSEMOVE
end;

я сделал базовый класс, для ВСЕХ своих визуальных компонентов.
каждый новый компонент наследует TWinBase и перекрывает в нем нужные методы:


Код:
TMyButton = class(TWinBase)
protected
procedure MouseMove(X,Y:integer); override;

end;

implementation


procedure TMyButton .MouseMove(X,Y:integer);  
begin
inherited; // реакция предка
// реакция вашего компонента
end;
аналогично делаются обработчики для всех других событий

Последний раз редактировалось xrob; 19.04.2013 в 02:30.
xrob вне форума Ответить с цитированием
Старый 19.04.2013, 11:53   #5
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Цитата:
Сообщение от xrob Посмотреть сообщение
alextrof94, а вы попробуйте от TPanel унаследоваться
проще в данном случае мне на данном этапе все же работать с TImage, так как раньше кнопки и вообще GUI на них делал. Вопрос: почему не работает MouseMove?

Сделал по Onclick чтоб в Caption рисовались координаты и размер, все в норме. Но картинка не переназначается(
Код:
procedure tPNGbutton.MyMouseMove(X, Y: Integer);
begin
  picture.Bitmap.Assign(pngM);
  picture.Bitmap.Canvas.Brush.Style := bsClear;
  picture.Bitmap.Canvas.TextOUT(round((width/2)-(picture.Bitmap.Canvas.TextWidth(acaption)/2)),round((height/2)-(picture.Bitmap.Canvas.Textheight(acaption)/2)),acaption);
end;

procedure tPNGbutton.MsgMouseMove(var Message: TWMMouse);
begin
  MyMouseMove(message.XPos, message.YPos);//перехват сообщения о движении мыши, как это было показано у вас.
end;
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 19.04.2013, 11:55   #6
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Стоп. Вы предлагаете базировать элемент на twinbase, а на нем уже создать Timage?
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 19.04.2013, 11:59   #7
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

Цитата:
Destructor free;
расстрел с конфискацией.
eval вне форума Ответить с цитированием
Старый 19.04.2013, 12:00   #8
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Цитата:
Сообщение от eval Посмотреть сообщение
расстрел с конфискацией.
не надо расстрел, я только учусь.
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 19.04.2013, 12:24   #9
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Пффф. Опять нашел ошибку у себя. Я просто забывал указывать "папу".
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Старый 19.04.2013, 12:39   #10
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

для разговора самим с собой, форум - лишнее звено.
eval вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при инициализации объеста класса Che-Che Общие вопросы C/C++ 16 26.05.2012 14:58
Ошибка при присвоении объекту производного класса объекта базового класса с исп. явного приведения типов Lanx Помощь студентам 0 06.04.2011 20:24
Ошибка при вызове метода класса coNsept Общие вопросы C/C++ 2 14.12.2010 13:09
C++ наследование классов. очень простая ошибка, немогу разобраться в выводе при одинаковых массивах Sanu0074 Помощь студентам 1 02.06.2010 10:33