Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.05;
Скачать: CL | DM;

Вниз

Процедура бесконтрольно ест память   Найти похожие ветки 

 
Реактор ©   (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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.054 c
14-1092679960
F3nix
2004-08-16 22:12
2004.09.05
Программа подсчета необходимости покупки


14-1092418985
able
2004-08-13 21:43
2004.09.05
Windows XP prof


8-1082840940
hiperLogun
2004-04-25 01:09
2004.09.05
Работа с mp3 форматом


1-1092848545
Holls
2004-08-18 21:02
2004.09.05
Thread creation error


14-1092420220
Кириешки
2004-08-13 22:03
2004.09.05
Поделитесь подалуйста люди добрые русским языком.