Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];

Вниз

Что за фишка, просто глюк какой-то.   Найти похожие ветки 

 
Weare   (2003-01-30 11:16) [0]

Добрый день, мастера. В Делфях есть такой примерчик:

procedure TForm1.Button1Click(Sender: TObject);

var
BitMap1,BitMap2 : TBitMap;
MyFormat : Word;
begin
BitMap2 := TBitMap.Create;
BitMap1 := TBitMap.Create;
try
BitMap1.LoadFromFile("c:\Program Files\common Files\Borland Shared\Images\Splash\256color\factory.bmp");
BitMap2.Assign(BitMap1); // Copy BitMap1 into BitMap2
BitMap2.Dormant; // Free up GDI resources
BitMap2.FreeImage; // Free up Memory.
Canvas.Draw(20,20,BitMap2); // Note that previous calls don"t lose the image

BitMap2.Monochrome := true;
Canvas.Draw(80,80,BitMap2);
BitMap2.ReleaseHandle; // This will actually lose the bitmap;
finally
BitMap1.Free;
BitMap2.Free;
end;
end;

Так вот, если на кнопку нажимать много (где-то 7-20 раз), то в конце концов Вы увидите сообщение (в Win98) "Bitmap is not valid" или "Параметр задан неверно", правда бмпешку я брал размера эдак 15Mb(если размер больше, то через меньшее кол-во раз будет это сообщение).После выхода из проги и ее очередного запуска это будет повторяться уже через пару раз нажатия, а то и сразу. Избавиться от этого можно только после перегрузки машины, т.е. Вы сможете опять некоторое кол-во раз нажимать на кнопку. Получается, что Делфи не может корректно очистить какую-то там память или освободить ресурс. В Win2К я этого не заметил.
Как с этим бороться, может кто подскажет? Очень надо. У меня программа печатает текст на готовый *.bmp шаблон. Так вот такие казусы и происходят после нескольких отправок на печать. Тогда я переделал прогу: создавал Bmp при криейте формы, а убивал при дестрое. Результат очевиден - после нескольких запусков приложения приходилось перезагружать машину, т.к. опять выдавалось это сообщение.
Помогите, плиз!!!


 
DVM   (2003-01-30 12:40) [1]

Так по-моему правильнее:
begin
BitMap2 := TBitMap.Create;
try
BitMap1 := TBitMap.Create;
try
...
finally
BitMap1.Free;
end;
finally
BitMap2.Free;
end;
end;



 
Weare   (2003-01-30 12:42) [2]

Что, никто с этим не сталкивался???


 
Weare   (2003-01-30 12:52) [3]

Но ведь суть та же. Я делаю:


procedure TForm1.FormShow(Sender: TObject);
begin
Bmp := TBitmap.Create;
Bmp.LoadFromFile(Copy(ParamStr(0),1,Length(ParamStr(0))-17)+"Plat.bmp");
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Bmp.Free;
// или Bmp.Destroy;


А память или что там, все равно забивается.


 
DVM   (2003-01-30 12:55) [4]

Может это в каком другом месте программы?


 
Weare   (2003-01-30 13:13) [5]


>to DVM ©
> Может это в каком другом месте программы?

Если ты имеешь ввиду, что ошибка возникает в другом месте программы, то это не так. Именно на LoadFromFile.
Я еще пробовал вместо *.bmp (31,4Mb) загрузить этот же файл, но в *.jpg формате (1,7Mb):


Jpg.LoadFromFile(Copy(ParamStr(0),1,Length(ParamStr(0))-17)+"Plat.bmp");
Bmp.Assign(Jpg);

тогда эта ошибка выскакивает на Assign


 
Романов Р.В.   (2003-01-30 13:15) [6]

А зачем тебе
BitMap2.Dormant;
BitMap2.ReleaseHandle;
выкинь их на ...


 
han_malign   (2003-01-30 13:38) [7]

это-же пример, а не работающий код, там ведь черным по белому(синим по серому) написано -
"BitMap2.ReleaseHandle; // This will actually lose the bitmap;"

Lingvo:
Lose -
v/t. [по]терять;
упускать [-стить];
проигрывать [-рать];
lose o.s. заблудиться pf.;
v/i. [по]терять ;
проигрывать(ся) [-рать(ся)];
отст(ав)ать (о часах)

З.Ы. И в хелпе помимо примеров есть еще описание методов...


 
Weare   (2003-01-30 13:38) [8]

Да это только в примере делфийном. У меня только Free.


 
Weare   (2003-01-30 13:42) [9]

Ребята, Вы бы лучше помогли с проблемкой разобрать, подсказали может как отследить что там пожирается так, что нужно машину перегружать, а не приводили перевод примера... :(


 
Романов Р.В.   (2003-01-30 13:48) [10]

Ты нам пример скопировал, вот мы его и обсуждаем. Давай свой код мы его будем обсуждать.


 
Anatoly Podgoretsky   (2003-01-30 13:59) [11]

А чего ты хочешь, если ты 7-10 раз память теряешь.
Да и где код когда на кнопочку кликаешь.


 
han_malign   (2003-01-30 13:59) [12]

Ну тады давай по порядку
1. Загрузил Bitmap
2. Нарисовал в ней текст
3. ...
4. Отпустил Bitmap

Анамнез(предположительный):
2./3. Кому то отдаешь битмап не отпуская Handle
4. Если уж FormShow то FormClose, а не FormDestroy


 
Weare   (2003-01-30 14:10) [13]

Код у меня большой, а главную его часть я привел выше (Weare © (30.01.03 12:52)):

procedure TForm1.FormShow(Sender: TObject);
begin
Bmp := TBitmap.Create;
Bmp.LoadFromFile(Copy(ParamStr(0),1,Length(ParamStr(0))-17)+"Plat.bmp");
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Bmp.Free;
end;



 
han_malign   (2003-01-30 14:14) [14]

Ну если это главная часть...
то ищи в ней ошибку сам, у меня всегда все нормально работало...


 
Романов Р.В.   (2003-01-30 14:17) [15]

см han_malign © (30.01.03 13:59)

На всякий случай сделай так

procedure TForm1.FormShow(Sender: TObject);
begin
if Assigned(Bmp) then
FreeAndNil(Bmp);
Bmp := TBitmap.Create;
Bmp.LoadFromFile(Copy(ParamStr(0),1,Length(ParamStr(0))-17)+"Plat.bmp");
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(Bmp);
end;


 
Anatoly Podgoretsky   (2003-01-30 14:19) [16]

Ну так память не будет теряться


 
Weare   (2003-01-30 14:33) [17]

Хорошо, обойдемся без FormShow, FormDestroy, FormClose.
Почему с той же ошибкой работает следующий код:

procedure TForm1.Button1Click(Sender: TObject);
var
Bmp: TBitMap;
begin
Bmp := TBitMap.Create;
try
Bmp.LoadFromFile(Copy(ParamStr(0),1,Length(ParamStr(0))-17)+"Plat.bmp");
finally
Bmp.Free;
end;
end;

происходит она на LoadFromFile, где я тут теряю память.



 
Романов Р.В.   (2003-01-30 14:41) [18]


> где я тут теряю память.

нигде


 
Dms   (2003-01-30 14:52) [19]

У меня, например, все работает, но в D7. Возможно дело в глюке Дельфей 5, так называемых "утечках памяти". Надо глянуть patch на borland.com или еще где.


 
Weare   (2003-01-30 14:53) [20]

Блин, так чего же тогда через некоторое кол-во кликов (опять же) выдает эти сообщения и нужно перегружать машину. Причем это наблюдается на многих Win98 машинах, а в Win2K нету.


 
Weare   (2003-01-30 15:30) [21]


>to Dms (30.01.03 14:52)


Ты пробовал именно с большими *.bmp (где-то 30-40Mb) и кликал некоторое кол-во раз?



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.02.10;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.011 c
3-28615
Андрусь
2003-01-22 13:18
2003.02.10
Как передать в базу число > предела точности Integer


14-29065
Vox
2003-01-24 19:26
2003.02.10
В WinXP исчезла клавиатура!!!


4-29146
Uka
2002-12-26 06:44
2003.02.10
Как я могу(transfer file to com port) или (send file to com port)


1-28814
nikkie
2003-01-31 16:13
2003.02.10
Русские акселераторы


3-28599
Jeka
2003-01-22 15:46
2003.02.10
Подсчет итогов по столбцу таблицы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский