Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
8-1087834552
XGarik
2004-06-21 20:15
2004.09.05
Надпись на картинке JPG


3-1092124172
pavel_guzhanov
2004-08-10 11:49
2004.09.05
Текст запроса


1-1092845156
Чувак
2004-08-18 20:05
2004.09.05
Компонента Calendar


1-1092992924
Zhekson
2004-08-20 13:08
2004.09.05
Оттенки цветов


1-1092735398
STARfish
2004-08-17 13:36
2004.09.05
Есть ли у Скроллбокса событие "нажатие по полосе прокрутки"?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский