Форум: "Основная";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
ВнизПроцедура бесконтрольно ест память Найти похожие ветки
← →
Реактор © (2004-08-16 19:15) [0]
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) через буфер. Делает это она много много раз (копирует, потом анализирует, потом снова копирует, потом снова анализирует и т.д.). И вот эта процедура резервирует память, но по завершению не высвобождает ее. Что надо дописать, что бы вся резервируемая память высвобождалась по окончанию выполнения процедуры?
← →
TUser © (2004-08-16 21:09) [1]Во-первых надо писать ReleaseDC, а еще - Clipboard.Free не нужен. Вообще Clipboard не нужен
← →
ламер © (2004-08-16 21:28) [2]два вопроса.
1. вы уверены, что память не освобождается?
2. почему бы не выполнять создание TBitmap"а всего один раз в начале работы, а уничтожать - в самом конце?
← →
Реактор © (2004-08-16 21:32) [3]Мужики (плача и стоя на коленях).
Еще полгода нет, как с ТР на дельфи пересел. В институте 10 лет назад учился. В ООП как свинья в апельсинах.
Куда этот ReleaseDC писать.
Я поубирал try finally end - ничего не изменилось. Они вообще тут нужны?
← →
Реактор © (2004-08-16 21:37) [4]Память не освобождается. Я уверен. После завершения программы невозможно запустить ни одну программу, т.к. винд жалуется на отсутствие памяти. И во время выполнения этой программы комп тормозит страшно, не смотря на то, что там через строчку стоит Application.ProcessMesages;
Господи, а как же без Clipboard?
← →
TUser © (2004-08-16 21:42) [5]ClipBoard - эта переменная объявлена в каком-то модуле. Ее не надо ни создавать, ни освобоздать. Друге такие же переменные - например, Mouse, Screen, Application.
ReleaseDC писать в самом конце. Лучше - между finally и end.
dc:=GetDc();
try
finally
ReleaseDC(dc, ...);
end;
PS. ООП в ТР уже был. 10 лет назад я с ним даже работал. Кроме того, ООП здесь ни при чем.
PPS. Я, кстати, думаю, что свиньи в апельсинах неплохо соображают. Они все хавают.
← →
Fay © (2004-08-16 21:42) [6]Типа этого
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;
← →
Fay © (2004-08-16 21:43) [7]А, уже разобрались...
← →
TUser © (2004-08-16 21:45) [8]2 Fay
А каково ваше мнение на тему свиней и апельсинов?
← →
Fay © (2004-08-16 21:48) [9]Свиньи хавают товарищей апельсинов не по понятиям и без должного осмысления. Это и послужило причиной упомянутой "поговорки".
← →
Fay © (2004-08-16 21:49) [10]Причиной появления, конечно.
← →
Реактор © (2004-08-16 21:57) [11]А у ReleaseDC вроде как два параметра. Первый типа HWND. Откуда его брать?
Десять лет назад ООП в институтах не преподавалось, т.к. в нашем институте не было ни одного компа с виндом. Интел 8086 типа Искра и несколько IBM повместимых. По паскалю было всего два семестра. В нас пичкали лисп и пролог. На изучение сетей было выделено два компа (286-х) соедененных шнурком через 25-пиновые порты на 75 человек. Разъемы мы покупали в тушино сами. Я еще много приколов того времени могу расказать :)))
Помогить с процедурой пожалуйста. Очень нада.
← →
Реактор © (2004-08-16 22:00) [12]Ух ты. Сам разобрался. Ща быстренько проверю память перестала хавать или нет. Подождите не уходите ...
← →
Fay © (2004-08-16 22:04) [13]2 Реактор © (16.08.04 21:57) [11]
>> А у ReleaseDC вроде как два параметра. Первый типа HWND. Откуда его брать?
По памяти писал. Мог и ошибиться.
>> Подождите не уходите ...
Ладно. Но если жена спросит, чё это я так долго на работе - тебе отмазывать. 8)
← →
Реактор © (2004-08-16 22:13) [14]УРАААААААААААААААААААААААА
Заработала
Fay. С меня пиво. У меня мой собственный офис на Ленинском. Если не далеко - звони, заезжай. Я директор вот этой конторы - www.pally.ru. Там есть телефоны.
Спасибо огромное.
← →
Fay © (2004-08-16 22:17) [15]ОК
Пиво... Конечно я не далеко!!! 8)
← →
Реактор © (2004-08-16 22:21) [16]Ну тогда звони в любой будний день. Обычно после 16.00 я в офисе. Даже если меня не будет, любой девочке оставь номер своего телефона. Скажи, что программист звонил. Я перезвоню.
← →
Fay © (2004-08-16 22:23) [17]ОК. Тока вот "анкеты не найдена". Не скажу же я девочке - "Мне Реактор нужен" 8)
Всем пока. Я домой.
← →
Реактор © (2004-08-16 22:25) [18]Во блин. Только сейчас заметил, что на моем сайте моя подпись пропала.
Меня Александр зовут.
← →
Юрий Зотов © (2004-08-17 10:49) [19]А зачем же такие навороты? Какие-то временные битмапы, какие-то клипборды? Зачем все это?
Что нам нужно? Нужно скопировать картинку с одного 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;
← →
nikkie © (2004-08-17 11:43) [20]Юрий, ты опоздал.
пиво Fay заработал :))
← →
Юрий Зотов © (2004-08-17 13:52) [21]> nikkie © (17.08.04 11:43) [20]
Эх, вот так всегда... Ну не везет, что делать.
:о)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.03 c