Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Корректное пересоздание Pen


Comp ©   (2007-02-25 11:19:00) 

Всем привет!
Вот собственно проблема. Создаю Pen - все нормально.
Но мне нужно его изменить при необходимости. Как я понял-это делается удалением старого и установкой нового.
Делаю так:

procedureTDrawBox.SetPen(PH: HPEN);
begin
 if PH<>0 thenDeleteObject(PH);
 PH:=CreatePen(FPenStyle,FPenWidth,FPenColor);
 SelectObject(FBitMapDC,PH);
end;

этот метод вызываю каждый раз, когда необходимо.

Все хорошо, но до поры до времени. Потом приложение начинает глючить - цвет карандаша меняется сам, окно не прорисовывается, особенно NC область.

Что не так?

Зараннее спасибо!


Comp   (2007-03-10 21:50:00) [1]

Даи С++ многим по душе.

На вкус и цвет товарищей нет.

А нам Pascal по душе. и хоть убей, не оторвешь.


Comp   (2007-03-10 21:30:00) [2]

clickmaker ©   (02.03.07 10:13) [5]

> Или Делфи всем надоела

а какая связь между дельфи и windows API?

если бы не было связи, этого форума не существовало бы, правда?
Я тебя понимаю-на API можно программировать и другими средствами, как говорят в математике, отличными от Delphi. Я хотнл сказать, что уже меньше народу заходит на сайт. Раньше можно было уходить с сайта уже довольным, что понял...получил ответ., совет хороший и все такое. Сейчас надо зайти только через день, или в течении недели-может что-то и скажут.

Просто сейчас уже меньше народу хочет изучать Delphi-вследствие заполнения рынка всякими навязанными 1С. Обленились люди. Не хотят ломать голову над программированием, хотят чтоб все было легко.

Но эти люди не понимают, что Паскаль (-> Delphi) всегда был и остается языком высокого уровня, т.е. профессиональным языком.


Comp   (2007-03-10 21:29:00) [3]

Rouse_ ©

Спасибо.

Действительно, старый Pen нужно вернуть на место.

Или пусть всегда будет текущий, который устанавливаем SetPen, а при следующем вызове-сначала удаляем старый, а затем ставим новый.


Rouse_   (2007-03-02 14:21:00) [4]

Bitmap = PH в твоем случае :) Выдрал из своего кода просто и не поправил...


Rouse_   (2007-03-02 14:18:00) [5]

> Что не так?
Не так то, что SelectObject суть является функцией и возвращает тебе хэнл объекта, который был ассоциирован с DC ранее, до загрузки нового объекта (в твоем случае Pen). Перед удалением этого нового объекта (Реn) ты должен вернуть обратно старый через тот-же SelectObject()

т.е. примерно так..

PH := CreatePen(FPenStyle,FPenWidth,FPenColor);
OldDC := SelectObject(BitmapDC, Bitmap);
///... тут работаем
SelectObject(OldDC, Bitmap);
DeleteObject(PH);


clickmaker   (2007-03-02 10:13:00) [6]


> Или Делфи всем надоела

а какая связь между дельфи и windows API?


Ricks   (2007-03-01 16:51:00) [7]

Попробуй так:

procedure TDrawBox.SetPen( varPH: HPEN);
begin
if PH<>0 then DeleteObject(PH);
PH:=CreatePen(FPenStyle,FPenWidth,FPenColor);
SelectObject(FBitMapDC,PH);
end;


TRUNK   (2007-02-28 20:42:00) [8]


> procedure TDrawBox.SetPen(PH: HPEN);

А хэндл какого пэна передаётся в параметре?


Comp   (2007-02-28 20:32:00) [9]

Мастеров нету.
Чтож, пока дождешься ответа - и сам найдешь причину.

Испортился сайт. раньше года 3 назад - тут настоящая школа была. А сейчас... Или Делфи всем надоела или просто сайт пора закрывать...


Comp   (2007-02-25 11:30:00) [10]

Еще...
FPenStyle, FPenWidth, FPenColor - всегда не пустые - по любому имеют значения в любое время.
FBitMapDC - контекст буфера прорисовки.
Все перекопал, методом исключения пришел к такому выводу, что что-то с этим методом не так.

Я не думаю (точнее надеюсь), что нужно еще каждый раз освобождать контекст буфера.


Наверх

Титульная страница Поиск, карта сайта Написать письмо