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

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

Как уничтожать назначенный Brush? [D6, WinXP]


Vemer ©   (2007-02-16 17:38:00) 

Делаем:
Brush1 := CreateSolidBrush($2022);
SelectObject(MainDC,Brush1);


В справке написано, что назначенный Brushчерез
DeleteObjectне удалить.

Вопрос: Как "отцепить" Brushот MainDCили что нужно сделать,
чтобы осуществить DeleteObject(Brush1);


Vemer   (2007-02-20 14:48:00) [1]

Все, немного разобрался.

OldBrush := Select(MainDC,NewBrush);

Дает нам старый. Просто я смысл этой строки сначала понять не мог.


Vemer   (2007-02-20 14:22:00) [2]

Извините, но я до сих пор не совсем врубаюсь, как это рабтает.

Насколько я понял, какой-то Brush изначально назначен DC.
Надо в начале сохранить этот Brush (OldBrush) , а в конце его назначить, так?

Хорошо, как тогда получить OldBrush в самом начале?


Игорь Шевченко   (2007-02-19 22:14:00) [3]


> Посмотрите окончательный вариант убийства объектов пожалуйста.


Существует хорошая практика для программиста на API возвращать исходный объект в контекст устройства после работы с ним, например

OldObj := SelectObject (DC, WorkObj);
....что-то делаем с использованием WorkObj
SelectObject (DC, OldObj)

В этом случае при завершении работы достаточно просто выполнить DeleteObject на все созданные объекты.


Vemer   (2007-02-19 17:05:00) [4]

Опять я.
Посмотрите окончательный вариант убийства объектов пожалуйста.

var //Глобальный VAR, не весь )
Handle: HWND; //локальный хендл
Lb_Close:HWND;//"Контрол"

Pen: Array [0..PenCount] of HPen;
Brush: Array [0..BrushCount] of HBrush;
MainDC: HDC; //DC формы
LbcDC: HDC; // DC "Контрола"
I:Byte;

procedure ShutDown; //процедура выхода из программы
Var
D:Byte;
DelBrush:HBrush;
DelPen:HPen;
Begin
ReleaseMutex(hMutex);
KillTimer(Handle,1);

DelBrush := SelectObject (MainDC, Brush[0]);
DeleteObject(SelectObject (MainDC, DelBrush));

DelPen := SelectObject(MainDC, Pen[0]);
DeleteObject(SelectObject (MainDC, DelPen));

DelBrush := SelectObject (LbcDC, Brush[0]);
DeleteObject(SelectObject (LbcDC, DelBrush));

DelPen := SelectObject(LbcDC, Pen[0]);
DeleteObject(SelectObject (LbcDC, DelPen));

For D := 0 To PenCount do
 DeleteObject(Pen[I]); //удаляем набор Pen..

For D := 0 To BrushCount do
 DeleteObject(Brush[I]); //удаляем набор Brush..

ReleaseDC (Lb_Close, LbcDC); // освобождение ссыпки
DeleteDC (LbcDC); // удаление ссылки, освобождение памяти

ReleaseDC (Handle, MainDC); // освобождение ссыпки
DeleteDC (MainDc); // удаление ссылки, освобождение памяти


undr   (2007-02-18 00:20:00) [5]


> Нет DC, нет проблемы :).
> Нет в таком решении никаких подвоных камней?

Ты не сможешь удалить контекст устройства, пока не восстановишь исходный Brush [SelectObject (MainDC, OldBrush)]. Так что делай, как написали в [1]/[2]


homm   (2007-02-17 18:26:00) [6]

тебе же в 2 сказали как правльно. вин98 с канвой работает плохо, потому лучше делать как првильно


Vemer   (2007-02-17 15:28:00) [7]

Спасибо.
В итоге сделал так (все равно все убить надо):

FreeDC(Handle,MainDc);
DeleteObject(Brush1);


Нет DC, нет проблемы :).
Нет в таком решении никаких подвоных камней?


Ricks   (2007-02-16 22:02:00) [8]

А можно сделать еще проще?

OldBrush := SelectObject (MainDC, Brush1);
DeleteObject (SelectObject (MainDC, OldBrush));

Вроде бы тоже самое. Я у себя пользовался таким приемом!


Игорь Шевченко   (2007-02-16 17:44:00) [9]

OldBrush := SelectObject (MainDC, Brush1);


> Вопрос: Как "отцепить" Brush от MainDC


SelectObject (MainDC, OldBrush);

DeleteObject (Brush1);


Наверх

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