![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Процедура бесконтрольно ест память [D7]
Реактор © (2004-08-16 19:15:00)
procedure TForm1.SendScreenImageToClipboard;
var bmp: TBitmap;
begin
bmp := TBitmap.Create;
try
bmp.Width := Image1.Width;
bmp.Height := Image1.Height;
BitBlt(bmp.Canvas.Handle, 0, 0, StrToInt ( Edit3.Text), StrToInt ( Edit4.Text), GetDC(GetDesktopWindow), StrToInt ( Edit1.Text), StrToInt ( Edit2.Text), SRCCopy);
Clipboard.Assign(bmp);
finally
bmp.Free;
end;
Image1.Picture.LoadFromClipboardFormat(cf_BitMap,ClipBoard.GetAsHandle(cf_BitMap),0);
Clipboard.Free;
end;
Вот эта процедура делает копию кусочка экрана в окно моей программы (в Image1) через буфер. Делает это она много много раз (копирует, потом анализирует, потом снова копирует, потом снова анализирует и т.д.). И вот эта процедура резервирует память, но по завершению не высвобождает ее. Что надо дописать, что бы вся резервируемая память высвобождалась по окончанию выполнения процедуры?
Юрий Зотов (2004-08-17 13:52:00) [1]> nikkie © (17.08.04 11:43) [20]
Эх, вот так всегда... Ну не везет, что делать.
:о)
nikkie (2004-08-17 11:43:00) [2]Юрий, ты опоздал.
пиво Fay заработал :))
Юрий Зотов (2004-08-17 10:49:00) [3]А зачем же такие навороты? Какие-то временные битмапы, какие-то клипборды? Зачем все это?
Что нам нужно? Нужно скопировать картинку с одного DC на другой. Первый DC известен - это десктоп. Второй тоже известен - это канва TImage. Для копирования есть функции BitBlt и StretchBlt.
Значит, берем - да напрямую и копируем, и не нужны никакие танцы с бубнами.
Вообще говоря, не нужен даже и Image1, потому что рисовать можно прямо на форме. Но если потом потребуется эту картинку, скажем, сохранить то с Image1 удобнее.
procedure TForm1.Button1Click(Sender: TObject);
var
DC: HDC;
begin
// Очищаем старую картинку
Image1.Picture.Bitmap := nil;
// Устанавливаем новые размеры Image1
Image1.Width := StrToInt(Edit1.Text);
Image1.Height := StrToInt(Edit2.Text);
// Теперь устанвливаем размеры самой картинки и копируем ее
with Image1.Picture.Bitmap do
begin
Width := Image1.Width;
Height := Image1.Height;
DC := GetDC(GetDesktopWindow);
BitBlt(Canvas.Handle, 0, 0, Width, Height, DC, 0, 0, SRCCOPY);
ReleaseDC(GetDesktopWindow, DC)
end
end;
Реактор (2004-08-16 22:25:00) [4]Во блин. Только сейчас заметил, что на моем сайте моя подпись пропала.
Меня Александр зовут.
Fay (2004-08-16 22:23:00) [5]ОК. Тока вот "анкеты не найдена". Не скажу же я девочке - "Мне Реактор нужен" 8)
Всем пока. Я домой.
Реактор (2004-08-16 22:21:00) [6]Ну тогда звони в любой будний день. Обычно после 16.00 я в офисе. Даже если меня не будет, любой девочке оставь номер своего телефона. Скажи, что программист звонил. Я перезвоню.
Fay (2004-08-16 22:17:00) [7]ОК
Пиво... Конечно я не далеко!!! 8)
Реактор (2004-08-16 22:13:00) [8]УРАААААААААААААААААААААААА
Заработала
Fay. С меня пиво. У меня мой собственный офис на Ленинском. Если не далеко - звони, заезжай. Я директор вот этой конторы - www.pally.ru. Там есть телефоны.
Спасибо огромное.
Fay (2004-08-16 22:04:00) [9]2 Реактор © (16.08.04 21:57) [11]
>> А у ReleaseDC вроде как два параметра. Первый типа HWND. Откуда его брать?
По памяти писал. Мог и ошибиться.
>> Подождите не уходите ...
Ладно. Но если жена спросит, чё это я так долго на работе - тебе отмазывать. 8)
Реактор (2004-08-16 22:00:00) [10]Ух ты. Сам разобрался. Ща быстренько проверю память перестала хавать или нет. Подождите не уходите ...
Реактор (2004-08-16 21:57:00) [11]А у ReleaseDC вроде как два параметра. Первый типа HWND. Откуда его брать?
Десять лет назад ООП в институтах не преподавалось, т.к. в нашем институте не было ни одного компа с виндом. Интел 8086 типа Искра и несколько IBM повместимых. По паскалю было всего два семестра. В нас пичкали лисп и пролог. На изучение сетей было выделено два компа (286-х) соедененных шнурком через 25-пиновые порты на 75 человек. Разъемы мы покупали в тушино сами. Я еще много приколов того времени могу расказать :)))
Помогить с процедурой пожалуйста. Очень нада.
Fay (2004-08-16 21:49:00) [12]Причиной появления, конечно.
Fay (2004-08-16 21:48:00) [13]Свиньи хавают товарищей апельсинов не по понятиям и без должного осмысления. Это и послужило причиной упомянутой "поговорки".
TUser (2004-08-16 21:45:00) [14]2 Fay
А каково ваше мнение на тему свиней и апельсинов?
Fay (2004-08-16 21:43:00) [15]А, уже разобрались...
Fay (2004-08-16 21:42:00) [16]Типа этого
procedure TForm1.SendScreenImageToClipboard;
var
bmp : TBitmap;
DC : HDC;
begin
DC := GetDC(GetDesktopWindow);
if DC = then RaiseLastOSError;
bmp := TBitmap.Create;
try
bmp.Width := Image1.Width;
bmp.Height := Image1.Height;
BitBlt(bmp.Canvas.Handle, 0, 0, StrToInt(Edit3.Text), StrToInt(Edit4.Text), DC, StrToInt(Edit1.Text), StrToInt(Edit2.Text), SRCCopy);
Clipboard.Assign(bmp);
finally
ReleaseDC(DC);
bmp.Free;
end;
Image1.Picture.LoadFromClipboardFormat(cf_BitMap, ClipBoard.GetAsHandle(cf_BitMap), 0);
Clipboard.Free;
end;
TUser (2004-08-16 21:42:00) [17]ClipBoard - эта переменная объявлена в каком-то модуле. Ее не надо ни создавать, ни освобоздать. Друге такие же переменные - например, Mouse, Screen, Application.
ReleaseDC писать в самом конце. Лучше - между finally и end.
dc:=GetDc();
try
finally
ReleaseDC(dc, ...);
end;
PS. ООП в ТР уже был. 10 лет назад я с ним даже работал. Кроме того, ООП здесь ни при чем.
PPS. Я, кстати, думаю, что свиньи в апельсинах неплохо соображают. Они все хавают.
Реактор (2004-08-16 21:37:00) [18]Память не освобождается. Я уверен. После завершения программы невозможно запустить ни одну программу, т.к. винд жалуется на отсутствие памяти. И во время выполнения этой программы комп тормозит страшно, не смотря на то, что там через строчку стоит Application.ProcessMesages;
Господи, а как же без Clipboard?
Реактор (2004-08-16 21:32:00) [19]Мужики (плача и стоя на коленях).
Еще полгода нет, как с ТР на дельфи пересел. В институте 10 лет назад учился. В ООП как свинья в апельсинах.
Куда этот ReleaseDC писать.
Я поубирал try finally end - ничего не изменилось. Они вообще тут нужны?
ламер (2004-08-16 21:28:00) [20]два вопроса.
1. вы уверены, что память не освобождается?
2. почему бы не выполнять создание TBitmap'а всего один раз в начале работы, а уничтожать - в самом конце?