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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2014, 03:55   #1
SomeOneAndrey
Пользователь
 
Регистрация: 28.06.2014
Сообщений: 20
По умолчанию Перезагрузка методов

Приветствую.
Возникла надобность дописать свой код в процедуру компонента, а именно в
Image.Canvas.Pen.Width
В объекте TPen - Width это свойство, запись идет через процедуру SetWidth
Как добавить в эту процедуру свой код не изменяя стандартный модуль?
Пробовал с перегрузкой методов, но что-то не вышло, вылетала программа с ошибкой в ntdll.dll
Прошу пример правильной перегрузки методов на конкретном примере.
SomeOneAndrey вне форума Ответить с цитированием
Старый 19.10.2014, 09:18   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Придется прописывать наследование для Pen, Canvas и Image с нуля и полностью. Это если не ошибаюсь. Короче писанины будет немерянно.
Ты лучше скажи что именно нужно дописать. На 99% уверен что так изменять стандартный компонент не нужно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.10.2014, 12:48   #3
SomeOneAndrey
Пользователь
 
Регистрация: 28.06.2014
Сообщений: 20
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Придется прописывать наследование для Pen, Canvas и Image с нуля и полностью. Это если не ошибаюсь. Короче писанины будет немерянно.
Ты лучше скажи что именно нужно дописать. На 99% уверен что так изменять стандартный компонент не нужно.
Я делаю онлайн пеинт, для наилучшей синхронизации мне нужно добавить свой код прямо в процедуру изменения кисти. Например так, я перезагрузил TCanvas в TImage, чтобы добавить свой код в MoveTo и LineTo

Код:
  TCanvas = class(Vcl.Graphics.TCanvas)
  public
    procedure MoveTo(X, Y: Integer);
    procedure LineTo(X, Y: Integer);
  end;
  //
  TImage = class(Vcl.ExtCtrls.TImage)
  private
    function GetCanvas: TCanvas;
  public
    property Canvas: TCanvas read GetCanvas;
  end;
И все работает хорошо. Но если я добавляю TPen

Код:
  TCanvas = class(Vcl.Graphics.TCanvas)
  private
    FPen: TPen;
  protected
    procedure SetPen(Value: TPen);
  public
    procedure MoveTo(X, Y: Integer);
    procedure LineTo(X, Y: Integer);
  published
    property Pen: TPen read FPen write SetPen;
  end;
То получаю ошибку при попытке взаимодействия с TPen'ом

Цитата:
Access violation at address 7796EC81 in module 'ntdll.dll'. Write of address 00500850.
Все еще надеюсь на помощь
SomeOneAndrey вне форума Ответить с цитированием
Старый 19.10.2014, 13:10   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

код метода setpen() дай посмотреть.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 19.10.2014, 13:18   #5
SomeOneAndrey
Пользователь
 
Регистрация: 28.06.2014
Сообщений: 20
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
код метода setpen() дай посмотреть.
Код:
procedure TCanvas.SetPen(Value: TPen);
begin
  FPen.Assign(Value);
end;
SomeOneAndrey вне форума Ответить с цитированием
Старый 19.10.2014, 14:50   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

эээээ! код своего метода setpen() дай посмотреть.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 19.10.2014, 15:01   #7
SomeOneAndrey
Пользователь
 
Регистрация: 28.06.2014
Сообщений: 20
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
эээээ! код своего метода setpen() дай посмотреть.
Мой SetPen это обычный SetPen, но даже с ним программа вылетает
SomeOneAndrey вне форума Ответить с цитированием
Старый 19.10.2014, 15:08   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Мой SetPen это обычный SetPen, но даже с ним программа вылетает
Ха! А зачем тогда ты переопределяешь его, если он такой же? Извини за глупый вопрос.
Цитата:
для наилучшей синхронизации мне нужно добавить свой код прямо в процедуру изменения кисти
С чего ты взял что это что-то улучшит?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.10.2014, 15:11   #9
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Сообщение от SomeOneAndrey Посмотреть сообщение
Мой SetPen это обычный SetPen, но даже с ним программа вылетает
значит вылетает не из-за него.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 19.10.2014, 15:15   #10
SomeOneAndrey
Пользователь
 
Регистрация: 28.06.2014
Сообщений: 20
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ха! А зачем тогда ты переопределяешь его, если он такой же? Извини за глупый вопрос.
Проблема в том, что мне этот SetPen вовсе не нужен. Мне необходимо переопределить TPen на свой. Когда я переопределяю TPen

Код:
published
    property Pen: TPen read FPen write SetPen;
То среда требует чтобы я задекларировал процедуру SetPen

Цитата:
Сообщение от Stilet Посмотреть сообщение
С чего ты взял что это что-то улучшит?
Допустим изменение цвета кисти можно вызывать из нескольких мест, рядом с каждым местом вызова придется дописывать функцию синхронизации. Куда логичнее вписать её прямо в саму процедуру изменения цвета

Цитата:
Сообщение от min@y™ Посмотреть сообщение
значит вылетает не из-за него.
Вот я и не знаю из за чего вылетает, по этой причине и обратился на форум, попробуйте Вы, возможно у Вас не будет вылетать. Какая цель - указано в начале темы, необходимо изменить процедуру записи в свойство Image.Canvas.Pen.Width
SomeOneAndrey вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объявление и определение методов.Напишите функции в виде методов (подпрограмм). Напишите тестирующую программу с выдачей результа Vika_0_0 C# (си шарп) 0 04.10.2012 15:21
перезагрузка Паха 62813 Компьютерное железо 4 13.03.2012 00:25
Перезагрузка компьютера antoha.by Паскаль, Turbo Pascal, PascalABC.NET 13 04.08.2008 09:39
Перезагрузка Windows asja Компьютерное железо 1 11.05.2008 13:22
Перезагрузка LAFam Win Api 13 09.12.2007 09:15