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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.016 c
3-28678
FLIZ
2003-01-24 12:01
2003.02.10
Почему MS-SQL не дает построть такую связь?


3-28624
AnatoliJ
2003-01-14 02:19
2003.02.10
Pomogite mne please v DBGrid programno zapisat dannije


14-29023
Думкин
2003-01-18 08:40
2003.02.10
Ирак


1-28880
AlexT1000
2003-01-30 16:08
2003.02.10
как пользоваться функцией HTMLHELP из под Delphi?


14-29015
nick-from
2003-01-23 16:37
2003.02.10
Хитрый HDD