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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.03.2010, 23:34   #1
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию Использование Self.Handle при создании и уничтожении компонента

Вообщем создаю компонент. Компонент есть наследником TCustomControl. Вроде все более ли менее работает. Но есть один баг, из-за которого вылетает вся программа.
Вот например:
есть деструктор такого вида
Код:
destructor TPDM3DLable.Destroy;
begin
  inherited;
  //GLSUnloadOpenGL;
  KillTimer(Self.Handle, 1);
end;
сейчас из-за того, что я указываю Self.Handle, программа будет вылетать со следующей ошибкой


если же написать тот же деструктор, допустим вот так
Код:
destructor TPDM3DLable.Destroy;
begin
  inherited;
  //GLSUnloadOpenGL;
  KillTimer(0, 1);
end;
то ошибки никакой не будет, и все будет нормально (вроде) работать.

Все тоже самое и с конструктором. Есть некая процедура в которой используется Self.Handle и если я ее вызываю в конструкторе, то сразу же летит ошибка приведенная выше.
Народ, подскажите, почему нельзя использовать Self.Handle в конструкторе и деструкторе? Или может я что то не так делаю, подскажите?
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 09.03.2010, 23:38   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в деструкторе своего класса наследуемый деструктор вызываем в конце а не в начале.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.03.2010, 23:50   #3
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
в деструкторе своего класса наследуемый деструктор вызываем в конце а не в начале.
Пробовал я так и в конструкторе и в деструкторе , все равно ошибка вылетает
Только вот не пойму, ну что не правильно я делаю?
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 10.03.2010, 00:00   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

стоп...а Handle чем заполняется то?
случаем с оконным хендлом не путаете?
ведь именно оно содержится в этом св-ве
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.03.2010, 00:06   #5
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Сам конструктор
Код:
constructor TPDM3DLable.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  ...

end;
А вот так я его вызываю
Код:
MyObject := TPDM3DLable.Create(self);
Следовательно, это получается тогда, что Handle'у моего компонента присваивается Handle окна в моем случае ?
з.ы. я что то вообще уже запутался (((
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 10.03.2010, 00:19   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

или его собственный, но уж точно не хендл таймера
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.03.2010, 00:29   #7
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

А что в таких случаях можно сделать?
Кстати, а если тут использую этот же Self.Handle в конструкторе:
Код:
  fHDC := GetDC(Self.Handle);                         
  PF := ChoosePixelFormat(fHDC, @PFd);               
  if PF <> 0 then SetPixelFormat(fHDC, PF, @PFD);       
  fHGLRC := wglCreateContext(fHDC);                   
  if fHGLRC <> 0 then wglMakeCurrent(fHDC, fHGLRC);
то все равно ошибка ведь вылетает. Но по идее Handle должен указывать на мой контрол?
Может знаете, как исправить данный баг?
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 10.03.2010, 00:38   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

попробуйте другого предка(TWinControl например)
пока не нашел компонента основанного на TCustomControl
а после С++ не могу вспомнить его смысл
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.03.2010, 00:51   #9
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Предка пробовал менять, но положительного результата я не добился.
TWinControl - не подходит тем, что в нем нету Canvas, а вот TCustomControl - это предок TWinControl'a только с добавленным полем Canvas, так что по сути нету смысла менять предка, я так понимаю.
Ну вот например, на TCustomControl по большому счету основан TPanel, хоть на самом деле у TPanel есть промежуточный класс TCustomPanel, но я думаю это не столь важно (этот промежуточный класс).
Кто что еще может посоветовать?
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 10.03.2010, 07:24   #10
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

предпочитаю так...
Код:
constructor Tpgl.Create(AOwner: TComponent);
begin
 inherited Create(aowner);

 FInterval:= 50;
 ftimer:= ttimer.Create(self);
 ftimer.Enabled := false;
 ftimer.interval:= FInterval;
 ftimer.ontimer := ind;
 ftimer.Enabled := true;
 factive := true; 
end;

destructor Tpgl.Destroy;
begin
 ftimer.Free;

 inherited
end;
...компоненты под opengl наследую обычно от tpanel.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка AV при уничтожении объектов из модулей(dll) puga555 Общие вопросы Delphi 4 08.01.2010 22:14
Заменить стандартное событие компонента при создании своего. postal2 Компоненты Delphi 6 28.08.2009 11:01
Проблема при создании компонента Levsha100 Компоненты Delphi 3 02.05.2009 12:05
Проблема перехвата сообщений при создании невизуального компонента volod3000 Компоненты Delphi 7 08.03.2009 14:13